laravel throwing MethodNotAllowedHttpException


110

나는 매우 기본적인 실행을 시도하고 있습니다. 나는 CI에 익숙하고 이제 Laravel 4를 배우고 있으며 그들의 문서는 쉽지 않습니다! 어쨌든 로그인 양식을 만들고 다음 양식에 인쇄하여 데이터가 성공적으로 게시되었는지 확인합니다. 이 예외가 발생합니다.

Symfony \ 구성 요소 \ HttpKernel \ 예외 \ 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 2013

오래된 게시물이지만 사람들은 여전히 ​​그것을 우연히 발견합니다. "composer dump-autoload"를 사용해보십시오. 나를 위해 일했습니다.
kirgy

@Andreyco이 명령은 정의되지 않았습니다.
Marcelo Agimóvel 2017

답변:


198

GET경로에 게시하기 때문에 해당 오류가 발생 합니다.

나는에 대한 라우팅을 분할 할 validate별도의로 GETPOST경로.

새로운 경로 :

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

맞습니다. 사용자가 원하지 않는 경우 중재자가 정답으로 만들 수 있습니까? 이것은 아래의 세 번째 대답이고 그것이 유일한 정답입니다.
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 METHOD입니다.

{{ 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포트에 443내가 통해 응용 프로그램을 제공 한 곳을 HTTPS.

올바른 포트로 요청하면 직접 문제가 해결되었습니다. 제 경우 에는 기본 포트 를 각각 사용하고 있었기 때문에 http://요청 URL을 https://바꾸면 됩니다.80443


이것이 제가 직면 한 문제 였고이 답변이 해결책으로 판명되었습니다. 감사합니다
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']) !!}

그래서 expatiate하기 위해 양식 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.