اذهب إلى المحتوى

السؤال

نشر

السلام عليكم،

أستخدم postman في عمل test على الapi الخاصة بي..

أستخدم apiResources() كالتالي

Route::apiResource('certificates', 'CertificateController');

فأريد التعديل على الcertificate ومن البديهي أنه عندم أرسل PUT Request إلى http://localhost:8000/api/certificates/4 سيتم إستدعاء ميثود update في الكنترولر

public function update(Request $request, $id)
{
  $certificate = Certificate::find($id);

  if (!$certificate) {
  	return $this->returnData(false, 'Certificate Not Found', 404);
  }

  $validation = Validator::make($request->all(), [
    'certificate_name_ar' => 'required|max:150|min:3',
    'certificate_name_en' => 'required|max:150|min:3',
  ]);

  if ($validation->fails()) {
  	return $this->returnData(false, $validation->errors(), 400);
  }

  if ($request->hasFile('certificate_file')) {

    $allowed_extensions = ['jpg', 'jpeg', 'png', 'pdf', 'txt', 'docx'];
    $extension = $request->file('certificate_file')->getClientOriginalExtension();
    $name = time() . '_' . $request->file('certificate_file')->getClientOriginalName();

    if (!in_array($extension, $allowed_extensions)) {
    return $this->returnData(false, "Allowed Extensions Is: " . implode(', ', $allowed_extensions), 400);
    }

    $certificateFile = $request->file('certificate_file')->storeAs('certificates', $name);

    $oldCertificate = $certificate->certificate_file;

    if($oldCertificate !== null && Storage::disk('certificates')->exists($oldCertificate)){
    Storage::disk('certificates')->delete($oldCertificate);
    }

  }

  $certificateName = json_encode([
    'ar' => $request->certificate_name_ar,
    'en' => $request->certificate_name_en,
  ]);

  $certificateDescription = json_encode([
    'ar' => $request->certificate_description_ar ?? null,
    'en' => $request->certificate_description_en ?? null,
  ]);

  $certificateStatus = $certificate->update([
    'certificate_name' => $certificateName,
    'certificate_description' => $certificateDescription,
    'certificate_url' => $request->certificate_url ?? null,
    'certificate_file' => $name ?? null
  ]);

  return $this->returnData(true, $certificateStatus, 200);
}

وإعدادات postman كالتالي: 

قمت بتمرير الباراميترز المطلوبة عادي جدا وفي جزء الBody قمت بجعلها form-data وإخترت المفتاح بإسم certificate_file وجعلته من نوع file وقمت بإختيار الملف وأرسلت الrequest

فأجد أنه لم يدخل أبداً في هذا الجزء

if ($request->hasFile('certificate_file')) {
            
  $allowed_extensions = ['jpg', 'jpeg', 'png', 'pdf', 'txt', 'docx'];
  $extension = $request->file('certificate_file')->getClientOriginalExtension();
  $name = time() . '_' . $request->file('certificate_file')->getClientOriginalName();

  if (!in_array($extension, $allowed_extensions)) {
  	return $this->returnData(false, "Allowed Extensions Is: " . implode(', ', $allowed_extensions), 400);
  }

  $certificateFile = $request->file('certificate_file')->storeAs('certificates', $name);

  $oldCertificate = $certificate->certificate_file;

  if($oldCertificate !== null && Storage::disk('certificates')->exists($oldCertificate)){
  	Storage::disk('certificates')->delete($oldCertificate);
  }

}

وقمت بالتجربة عن طريق 

return $request;

فأجد أيضاً ان جميع الباراميترز التي تم تمريرها موجودة عدا الcertificate_file

فهل من حل؟ 

Recommended Posts

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...