Phương thức ném laravelNotAllowedHttpException


110

Tôi đang cố gắng chạy một cái gì đó rất cơ bản. Tôi đã quen với CI và bây giờ đang học Laravel 4, và tài liệu của họ không làm cho nó dễ dàng! Dù sao, tôi đang cố gắng tạo biểu mẫu đăng nhập và chỉ cần đảm bảo rằng dữ liệu được đăng thành công bằng cách in nó trong biểu mẫu tiếp theo. Tôi nhận được ngoại lệ này:

Symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpException

và MemberController.php của tôi:

    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');
        }
    }

và các tuyến có:

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

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

và cuối cùng chế độ xem login.php của tôi có hướng biểu mẫu này:

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

Chúng tôi rất trân trọng bất kỳ sự giúp đỡ nào.


Trong đó urlbạn đang nhận lỗi?
sùng

Bạn đã thử php artisan dump-autoloadchưa?
Andreyco

Bài cũ nhưng mọi người vẫn tình cờ xem được - hãy thử "composer dump-autoload". Đã làm cho tôi.
kirgy

@Andreyco lệnh này nó không được xác định.
Marcelo Agimóvel

Câu trả lời:


198

Bạn nhận được lỗi đó vì bạn đang đăng lên một GETtuyến đường.

Tôi sẽ chia định tuyến của bạn cho validatemột GETPOSTcác tuyến đường riêng biệt .

Các tuyến đường mới:

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

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

Khi đó, phương pháp bộ điều khiển của bạn có thể là

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

25

Sự nghi ngờ của tôi là vấn đề nằm ở định nghĩa lộ trình của bạn.

Bạn đã xác định tuyến đường là một GETyêu cầu nhưng biểu mẫu có thể đang gửi một POSTyêu cầu. Thay đổi định nghĩa tuyến đường của bạn.

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

Thông thường tốt hơn là sử dụng các tuyến được đặt tên (giúp mở rộng quy mô nếu phương thức / lớp bộ điều khiển thay đổi).

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

Trong biểu mẫu sử dụng như sau

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

23

Vấn đề là bạn đang sử dụng POSTnhưng thực sự bạn phải thực hiện PATCH Để khắc phục lỗi này

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

Ngay sau Form::modeldòng


1
trong Laravel, bạn có thể sử dụng {{ method_field('PATCH') }}trong mẫu của mình.
Michael Yousrie

13

Đó là vì bạn đang đăng dữ liệu thông qua phương thức get.

Thay vì

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

Thử cái này

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

Điều này đúng, người kiểm duyệt có thể biến câu trả lời này thành câu trả lời chính xác nếu người dùng không muốn không? Đây là câu trả lời thứ 3 và là câu trả lời duy nhất đúng.
Logo_164, 09/07/19

12

Tôi gặp phải vấn đề này như là tốt và các câu trả lời khác ở đây là hữu ích, nhưng tôi đang sử dụng một Route::resourcemà sẽ chăm sóc của GET, POSTvà các yêu cầu khác.

Trong trường hợp của tôi, tôi đã rời khỏi tuyến đường của mình như sau:

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

Và chỉ cần sửa đổi biểu mẫu của tôi để gửi đến storechức năng trongFilesController

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

Điều này đã khắc phục sự cố và tôi nghĩ nó đáng được chỉ ra như một câu trả lời riêng vì nhiều câu trả lời khác đề xuất thêm một POSTtuyến đường mới . Đây là một tùy chọn nhưng nó không cần thiết.


9

Thường MethodNotAllowedHttpExceptionxảy ra khi

phương pháp tuyến không phù hợp.

Giả sử bạn xác định POSTtệp định tuyến yêu cầu, nhưng bạn gửi GETyêu cầu đến tuyến.


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

theo mặc định, Form::open()giả sử một POSTphương thức.

bạn có GETtrong các tuyến đường của bạn. thay đổi nó thành POSTtrong tuyến đường tương ứng.

hoặc nếu bạn muốn sử dụng GETphương thức, sau đó thêm methodtham số.

ví dụ

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

4

Tôi đã gặp phải lỗi,
vấn đề là FORM METHOD

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

Nó phải như thế này

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

4

Trong trường hợp của tôi, tôi đang gửi một POSTyêu cầu HTTPtới một máy chủ mà tôi đã thiết lập Nginxđể chuyển hướng tất cả các yêu cầu 80đến cổng 443nơi tôi đang phân phát ứng dụng HTTPS.

Thực hiện yêu cầu đến đúng cổng đã trực tiếp khắc phục sự cố. Trong trường hợp của tôi, tất cả những gì tôi phải làm là thay thế http://trong URL yêu cầu https://vì tôi đang sử dụng các cổng mặc định 80443tương ứng.


Đây là vấn đề tôi phải đối mặt và câu trả lời này đã được chứng minh là giải pháp. Cảm ơn bạn
Oluwatobi Samuel Omisakin

3

Nói chung, có một lỗi trong động từ HTTP được sử dụng, ví dụ:

Gọi PUTđường với POSTyêu cầu


2

Vấn đề của tôi không phải là các tuyến đường của tôi được thiết lập không chính xác, mà là tôi tham chiếu sai Formphương pháp (mà tôi đã sao chép từ một biểu mẫu khác). Tôi đã làm...

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

(không có mô hình được chỉ định). Nhưng lẽ ra tôi phải sử dụng openphương pháp thông thường ...

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

Bởi vì tham số đầu tiên modelmong đợi một mô hình thực tế, nó không nhận được bất kỳ tùy chọn nào mà tôi đã chỉ định. Hy vọng điều này sẽ giúp ai đó biết các tuyến đường của họ là chính xác, nhưng có điều gì khác không ổn.


2

Tôi cũng gặp lỗi tương tự nhưng có cách sửa khác, XYZ.blade.phptôi có:

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

điều này đã gây ra lỗi cho tôi, - tôi vẫn không biết tại sao - nhưng khi tôi thay đổi nó thành

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

Nó đã làm việc!

Tôi nghĩ nó đáng để chia sẻ :)


0

Laravel đôi khi không hỗ trợ {!! Form::open(['url' => 'posts/store']) !!}vì lý do bảo mật. Đó là lý do tại sao lỗi đã xảy ra. Bạn có thể giải quyết lỗi này bằng cách thay thế mã dưới đây một cách đơn giản

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




Mã lỗi Mã {!! Form::open(['url' => 'posts/store']) !!}

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


0

Trong trường hợp của tôi, đó là do biểu mẫu của tôi đang gửi đến một tuyến đường có phần mềm trung gian khác. Vì vậy, nó đã chặn gửi thông tin đến tuyến đường cụ thể này.


0

tốt khi tôi gặp sự cố này, tôi gặp phải 2 lỗi mã

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

tôi đã sửa nó bằng cách làm điều này

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

vì vậy chỉ cần để đi vơ vẩn tôi đã thay đổi mẫu modelđể openvà cũng là con đường mà sai được đặt trong dấu ngoặc vuông.


-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 !');

Bạn có thể vui lòng giải thích một chút về những gì mã này đang làm và cách nó giải quyết vấn đề?
newUserName 02
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.