วิธีการขว้างปา laravelNotAllowedHttpException


110

ฉันกำลังพยายามหาสิ่งที่พื้นฐานมาก ฉันคุ้นเคยกับ CI และตอนนี้กำลังเรียนรู้ Laravel 4 และเอกสารของพวกเขาไม่ได้ทำให้ง่ายเลย! อย่างไรก็ตามฉันพยายามสร้างแบบฟอร์มการเข้าสู่ระบบและตรวจสอบให้แน่ใจว่าข้อมูลถูกโพสต์สำเร็จโดยการพิมพ์ในแบบฟอร์มถัดไป ฉันได้รับข้อยกเว้นนี้:

Symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpException

และ MemberController.php ของฉัน:

    public function index()
    {
        if (Session::has('userToken'))
        {
            /*Retrieve data of user from DB using token & Load view*/
            return View::make('members/profile');
        }else{
            return View::make('members/login');
        }
    }

    public function validateCredentials()
    {
        if(Input::post())
        {
            $email = Input::post('email');
            $password = Input::post('password');
            return "Email: " . $email . " and Password: " . $password;
        }else{
            return View::make('members/login');
        }
    }

และเส้นทางมี:

Route::get('/', function()
{
    return View::make('hello');
});

Route::get('/members', 'MemberController@index');
Route::get('/validate', 'MemberController@validateCredentials');

และในที่สุดมุมมองของฉัน login.php มีทิศทางแบบฟอร์มนี้:

<?php echo Form::open(array('action' => 'MemberController@validateCredentials')); ?>

ความช่วยเหลือใด ๆ จะได้รับการชื่นชมอย่างมาก


ซึ่งurlคุณจะได้รับข้อผิดพลาดหรือไม่
devo

คุณลองแล้วphp artisan dump-autoloadหรือยัง?
Andreyco

โพสต์เก่า ๆ แต่ผู้คนยังคงสะดุดลองใช้ "composer dump-autoload" ทำงานให้ฉัน
kirgy

@Andreyco คำสั่งนี้ไม่ได้กำหนดไว้
Marcelo Agimóvel

คำตอบ:


198

คุณได้รับข้อผิดพลาดนั้นเนื่องจากคุณกำลังโพสต์ไปยังGETเส้นทาง

ฉันจะแยกเส้นทางของคุณvalidateออกเป็นเส้นทางGETและแยกกันPOST

เส้นทางใหม่:

Route::post('validate', 'MemberController@validateCredentials');

Route::get('validate', function () {
    return View::make('members/login');
});

วิธีการควบคุมของคุณก็อาจเป็นได้

public function validateCredentials()
{
    $email = Input::post('email');
    $password = Input::post('password');
    return "Email: " . $email . " and Password: " . $password;
}

25

ความสงสัยของฉันคือปัญหาอยู่ในนิยามเส้นทางของคุณ

คุณกำหนดเส้นทางเป็นGETคำขอ แต่แบบฟอร์มอาจส่งPOSTคำขอ เปลี่ยนนิยามเส้นทางของคุณ

Route::post('/validate', 'MemberController@validateCredentials');

โดยทั่วไปวิธีปฏิบัติที่ดีกว่าในการใช้เส้นทางที่มีชื่อ (ช่วยในการปรับขนาดหากวิธีการควบคุม / คลาสเปลี่ยนไป)

Route::post('/validate', array(
    'as' => 'validate',
    'uses' => 'MemberController@validateCredentials'
));

ในแบบฟอร์มใช้สิ่งต่อไปนี้

<?php echo Form::open(array('route' => 'validate')); ?>

23

ปัญหาคือคุณกำลังใช้งานอยู่POSTแต่จริงๆแล้วคุณต้องดำเนินการPATCH เพื่อแก้ไขการเพิ่มนี้

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

หลังจากForm::modelบรรทัด


1
ใน Laravel คุณสามารถใช้{{ method_field('PATCH') }}ในเทมเพลตของคุณ
Michael Yousrie

13

นั่นเป็นเพราะคุณกำลังโพสต์ข้อมูลผ่านเมธอด get

แทน

Route::get('/validate', 'MemberController@validateCredentials');

ลองทำตามนี้

Route::post('/validate', 'MemberController@validateCredentials');

ถูกต้องแล้วผู้ดูแลจะให้คำตอบที่ถูกต้องได้หรือไม่หากผู้ใช้ไม่ไป นี่เป็นคำตอบที่ 3 และเป็นคำตอบเดียวที่ถูกต้อง
logos_164

12

ผมพบปัญหานี้เป็นอย่างดีและคำตอบอื่น ๆ ที่นี่มีประโยชน์ แต่ฉันใช้Route::resourceซึ่งดูแลGET, POSTและความต้องการอื่น ๆ

ในกรณีของฉันฉันออกจากเส้นทางตามที่เป็น:

Route::resource('file', 'FilesController');

และแก้ไขแบบฟอร์มของฉันเพื่อส่งไปยังstoreฟังก์ชันในไฟล์FilesController

{{ Form::open(array('route' => 'file.store')) }}

สิ่งนี้แก้ไขปัญหาได้และฉันคิดว่ามันคุ้มค่าที่จะชี้เป็นคำตอบแยกต่างหากเนื่องจากคำตอบอื่น ๆ แนะนำให้เพิ่มPOSTเส้นทางใหม่ นี่เป็นทางเลือกหนึ่ง แต่ไม่จำเป็น


9

มักMethodNotAllowedHttpExceptionเกิดขึ้นเมื่อ

วิธีเส้นทางไม่ตรงกัน

สมมติว่าคุณกำหนดPOSTไฟล์เส้นทางการร้องขอ แต่คุณส่งGETคำขอไปยังเส้นทาง


7
<?php echo Form::open(array('action' => 'MemberController@validateCredentials')); ?>

โดยค่าเริ่มต้นForm::open()ถือว่าเป็นPOSTวิธีการ

คุณมีGETในเส้นทางของคุณ เปลี่ยนเป็นPOSTในเส้นทางที่เกี่ยวข้อง

หรือถ้าคุณต้องการใช้GETวิธีนี้ให้เพิ่มmethodพารามิเตอร์

เช่น

Form::open(array('url' => 'foo/bar', 'method' => 'get'))

4

ฉันประสบกับข้อผิดพลาด
ปัญหาคือวิธีการแบบฟอร์ม

{{ Form::open(array('url' => 'admin/doctor/edit/'.$doctor->doctor_id,'class'=>'form-horizontal form-bordered form-row-stripped','method' => 'PUT','files'=>true)) }}

มันควรจะเป็นแบบนี้

{{ Form::open(array('url' => 'admin/doctor/edit/'.$doctor->doctor_id,'class'=>'form-horizontal form-bordered form-row-stripped','method' => 'POST','files'=>true)) }}

4

ในกรณีของฉันฉันถูกส่งPOSTคำขอมากกว่าHTTPไปยังเซิร์ฟเวอร์ที่ฉันได้ตั้งขึ้นNginxเพื่อเปลี่ยนเส้นทางการร้องขอทั้งหมดไปยังพอร์ต80ไปยังพอร์ตที่ฉันกำลังทำหน้าที่ตรวจสอบไป443HTTPS

การร้องขอไปยังพอร์ตที่ถูกต้องช่วยแก้ปัญหาได้โดยตรง ในกรณีของฉันสิ่งที่ฉันต้องทำคือแทนที่http://ใน URL การร้องขอhttps://เนื่องจากฉันใช้พอร์ตเริ่มต้น80และ443ตามลำดับ


นี่เป็นปัญหาที่ฉันประสบและคำตอบนี้พิสูจน์แล้วว่าเป็นทางออก ขอบคุณ
Oluwatobi Samuel Omisakin

3

โดยทั่วไปมีข้อผิดพลาดในคำกริยา HTTP ที่ใช้เช่น:

เรียกPUTเส้นทางพร้อมPOSTคำขอ


2

ปัญหาของฉันไม่ได้อยู่ที่เส้นทางของฉันถูกตั้งค่าไม่ถูกต้อง แต่ฉันอ้างอิงFormวิธีการที่ไม่ถูกต้อง(ซึ่งฉันคัดลอกมาจากรูปแบบอื่น) ฉันกำลังทำ...

{!! Form::model([ ... ]) !!}

(ไม่ระบุรุ่น) แต่ฉันควรจะใช้openวิธีปกติ...

{!! Form::open([ ... ]) !!}

เนื่องจากพารามิเตอร์แรกที่modelคาดว่าจะเป็นโมเดลจริงจึงไม่ได้รับตัวเลือกใด ๆ ของฉันที่ฉันระบุ หวังว่านี่จะช่วยคนที่รู้ว่าเส้นทางของพวกเขาถูกต้อง แต่มีอย่างอื่นที่ไม่ถูกต้อง


2

ฉันก็มีข้อผิดพลาดเดียวกัน แต่มีการแก้ไขที่แตกต่างออกไปในXYZ.blade.phpฉันมี:

{!! Form::open(array('ul' => 'services.store')) !!}

ซึ่งทำให้ฉันมีข้อผิดพลาด - ฉันยังไม่รู้ว่าทำไม - แต่เมื่อฉันเปลี่ยนเป็น

{!! Form::open(array('route' => 'services.store')) !!}

มันได้ผล!

ฉันคิดว่ามันคุ้มค่าที่จะแบ่งปัน :)


0

บางครั้ง Laravel ไม่รองรับ{!! Form::open(['url' => 'posts/store']) !!}ด้วยเหตุผลด้านความปลอดภัย นั่นเป็นสาเหตุที่ข้อผิดพลาดเกิดขึ้น คุณสามารถแก้ไขข้อผิดพลาดนี้ได้โดยเพียงแค่แทนที่โค้ดด้านล่าง

{!! Form::open(array('route' => 'posts.store')) !!}




รหัสข้อผิดพลาดรหัสที่{!! Form::open(['url' => 'posts/store']) !!}

ถูกต้อง{!! Form::open(array('route' => 'posts.store')) !!}


0

ในกรณีของฉันเป็นเพราะแบบฟอร์มของฉันส่งไปยังเส้นทางที่มีมิดเดิลแวร์อื่น ดังนั้นจึงบล็อกไม่ให้ส่งข้อมูลไปยังเส้นทางเฉพาะนี้


0

เมื่อฉันมีปัญหาเหล่านี้ฉันพบข้อผิดพลาด 2 รหัส

{!! Form::model(['method' => 'POST','route' => ['message.store']]) !!}

ฉันแก้ไขโดยทำสิ่งนี้

{!! Form::open(['method' => 'POST','route' => 'message.store']) !!}

ดังนั้นฉันจึงเปลี่ยนแบบฟอร์มmodelเป็นopenและเส้นทางที่วางผิดในวงเล็บเหลี่ยม


-1
// not done
Route::post('`/posts/{id}`', 'PostsController@store')->name('posts.store');

return redirect('`/posts'`)->with('status','Post was created !');

// done
Route::post('`/posts`', 'PostsController@store')->name('posts.store');

return redirect('`/posts'`)->with('status','Post was created !');

คุณช่วยอธิบายหน่อยได้ไหมว่าโค้ดนี้ใช้ทำอะไรและแก้ปัญหาได้อย่างไร
newUserName02
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.