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

السؤال

نشر

حصلت على الخطأ التالي أثناء قيامي بعملية حذف بيانات على laravel 5.1، ورسالة الخطأ كالآتي:

MethodNotAllowedHttpException in RouteCollection.php line 219:
in RouteCollection.php line 219
at RouteCollection->methodNotAllowed(array('DELETE')) in RouteCollection.php line 206

رابط الحذف على التطبيق هو:

<a href="{{ url('cats/'.$cat->id.'/delete') }}">
    <span class="glyphicon glyphicon-trash"></span>
    Delete
</a>

مسار الحذف كان بهذا الشكل:

Route::delete('cats/{cat}/delete', function(Furbook\Cat $cat){
    $cat->delete();
    return redirect('cats')->withSuccess('Cat has been deleted');
});

عرض لبقية المسارات بالتطبيق:

<?php 
/*
|--------------------------------------------------------------------------
| Application Routes
|--------------------------------------------------------------------------
|
| Here is where you can register all of the routes for an application.
| It's a breeze. Simply tell Laravel the URIs it should respond to
| and give it the controller to call when that URI is requested.
|
*/

Route::get('/', function () {
        return redirect('cats');
});

Route::get('cats', function () {
    $cats = Furbook\Cat::All();
        return view('cats.index')->with('cats',$cats);
});

Route::get('cats/create', function(){
    return view('cats.create');
});

Route::post('cats', function(){
    $cat = Furbook\Cat::create(Input::all());
    return redirect('cats/'.$cat->id)->withSuccess('Cat has been created');
});

Route::get('cats/{id}', function ($id) {
    $cat = Furbook\Cat::findOrNew($id);
    return view('cats.show')->with('cat',$cat);
});

Route::get('cats/{cat}', function(Furbook\Cat $cat){
    return view('cats.show')->with('cat',$cat);
});

Route::delete('cats/{cat}/delete', function(Furbook\Cat $cat){
    $cat->delete();
    return redirect('cats')->withSuccess('Cat has been deleted');
});

Route::get('about', function () {
        return view('about')->with('number_of_cats',9000);
});

Route::get('cats/breeds/{name}', function ($name) {
    $breed = Furbook\Breed::with('cats')
        ->whereName($name)
        ->first();
        $cats = null;
        if(isset($breed))
                $cats=$breed->cats;
    return view('cats.index')
        ->with('breed',$breed)
        ->with('cats',$cats);
});

وبطريقة أخرى عند كتابة الأمر php artisan route:list :

+--------+----------+--------------------+------+---------+------------+
| Domain | Method   | URI                | Name | Action  | Middleware |
+--------+----------+--------------------+------+---------+------------+
|        | GET|HEAD | /                  |      | Closure |            |
|        | GET|HEAD | about              |      | Closure |            |
|        | POST     | cats               |      | Closure |            |
|        | GET|HEAD | cats               |      | Closure |            |
|        | GET|HEAD | cats/breeds/{name} |      | Closure |            |
|        | GET|HEAD | cats/create        |      | Closure |            |
|        | GET|HEAD | cats/{cat}         |      | Closure |            |
|        | DELETE   | cats/{cat}/delete  |      | Closure |            |
|        | GET|HEAD | cats/{id}          |      | Closure |            |
+--------+----------+--------------------+------+---------+------------+

ما هو الخطأ الذي ارتكبته وكيف أتمكّن من حلّه؟

Recommended Posts

  • 0
نشر

من الأمور التي يعتمدها إطار العمل laravel  توافق طرق إرسال http request مع المسارات routes المعيّنة في الملف الخاص بها، فمثلا في حالتك هذه أنت لا ترسل request Delete عن طريق استعمال الوسم <a>، بل يتوجب استعمل form وتضمين طريقة delete عند إرسال المعلومات حتى يتمكّن المسار من نقل الأمر إلى المتحكم Controller، وبطريقة أخرى الكود يجب أن يكون بالشكل التالي:

<form method="POST" action="{{ url('cats/'.$cat->id.'/delete') }}">
    {{ csrf_field() }}
    <input type="hidden" name="_method" value="DELETE">
    <span class="glyphicon glyphicon-trash"></span>
    <button type="submit">Delete</button>
</form>

وللعلم فقط فـ استمارة form تدعم فقط POST و GET، بينما PUT وDELETE يمكن توظيفها بإضافة حقل ومخفي شرطَ أن يحمل اسم الوظيفة كما هو الشأن في المثال السابق:

 <input type="hidden" name="_method" value="DELETE">

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...