Método de lanzamiento de laravelNotAllowedHttpException


110

Estoy tratando de hacer funcionar algo muy básico. Estoy acostumbrado a CI y ahora estoy aprendiendo Laravel 4, ¡y sus documentos no lo hacen fácil! De todos modos, estoy tratando de crear un formulario de inicio de sesión y solo asegurarme de que los datos se publiquen correctamente imprimiéndolos en el siguiente formulario. Estoy recibiendo esta excepción:

Symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpException

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

y rutas tiene:

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

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

y finalmente mi vista login.php tiene esta dirección de formulario:

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

Cualquier ayuda será apreciada.


¿En el que urlaparece el error?
devo

¿Usted ha intentado php artisan dump-autoload?
Andreyco

Publicación antigua, pero la gente todavía se tropieza con ella: intente "composer dump-autoload". Trabajó para mi.
Kirgy

@Andreyco este comando no está definido.
Marcelo Agimóvel

Respuestas:


198

Recibes ese error porque estás publicando en una GETruta.

Dividiría su enrutamiento validateen rutas separadas GETy POST.

Nuevas rutas:

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

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

Entonces su método de controlador podría ser simplemente

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

25

Mi sospecha es que el problema radica en la definición de su ruta.

Definió la ruta como una GETsolicitud, pero el formulario probablemente envía una POSTsolicitud. Cambia la definición de tu ruta.

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

En general, es una mejor práctica usar rutas con nombre (ayuda a escalar si cambia el método / clase del controlador).

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

En el formulario utilice lo siguiente

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

23

El problema es el que está utilizando, POSTpero en realidad debe realizar PATCH Para solucionar este complemento

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

Justo después de la Form::modellínea


1
en Laravel puedes usar {{ method_field('PATCH') }}en tu plantilla.
Michael Yousrie

13

Eso se debe a que está publicando datos a través de un método de obtención.

En vez de

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

Prueba esto

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

Esto es correcto, ¿puede un moderador hacer que esta sea la respuesta correcta si el usuario no va a hacerlo? Esta es la tercera respuesta y es la única correcta.
logos_164

12

Me encontré con este problema también y las otras respuestas aquí eran útiles, pero estoy usando una Route::resourceque se encarga de GET, POSTy otras solicitudes.

En mi caso dejé mi ruta como está:

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

Y simplemente modifiqué mi formulario para enviarlo a la storefunción en miFilesController

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

Esto solucionó el problema, y ​​pensé que valía la pena señalarlo como una respuesta separada, ya que varias otras respuestas sugieren agregar una nueva POSTruta. Esta es una opción pero no es necesaria.


9

Suele MethodNotAllowedHttpExceptionocurrir cuando

el método de ruta no coincide.

Suponga que define el POSTarchivo de ruta de solicitud, pero envía la GETsolicitud a la ruta.


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

de forma predeterminada, Form::open()asume un POSTmétodo.

tienes GETen tus rutas. cámbielo a POSTen la ruta correspondiente.

o si desea utilizar el GETmétodo, agregue el methodparámetro param.

p.ej

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

4

Me enfrenté al error, el
problema era FORM METHOD

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

Debería ser así

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

4

En mi caso, estaba enviando una POSTsolicitud HTTPa un servidor donde había configurado Nginxpara redirigir todas las solicitudes de un puerto 80a otro 443donde estaba sirviendo la aplicación HTTPS.

Hacer la solicitud al puerto correcto solucionó directamente el problema. En mi caso, todo lo que tuve que hacer es reemplazar http://en la URL de solicitud a, https://ya que estaba usando los puertos predeterminados 80y 443respectivamente.


Este fue el problema que enfrenté y esta respuesta resultó ser la solución. Gracias
Oluwatobi Samuel Omisakin

3

Generalmente, hay un error en el verbo HTTP utilizado, por ejemplo:

PUTRuta de llamada con POSTsolicitud


2

Mi problema no fue que mis rutas se configuraron incorrectamente, sino que estaba haciendo referencia al Formmétodo incorrecto (que había copiado de un formulario diferente). Estaba haciendo...

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

(sin modelo especificado). Pero debería haber estado usando el openmétodo regular ...

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

Debido a que el primer parámetro que modelesperaba un modelo real, no obtenía ninguna de mis opciones que estaba especificando. Espero que esto ayude a alguien que sepa que sus rutas son correctas, pero algo más está mal.


2

También tuve el mismo error pero tuve una solución diferente, en mi XYZ.blade.phptenía:

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

que me dio el error, todavía no sé por qué, pero cuando lo cambié a

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

¡Funcionó!

Pensé que valía la pena compartirlo :)


0

Laravel a veces no es compatible {!! Form::open(['url' => 'posts/store']) !!}por razones de seguridad. Por eso ha ocurrido el error. Puede resolver este error simplemente reemplazando el siguiente código

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




Código de error Código {!! Form::open(['url' => 'posts/store']) !!}

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


0

En mi caso, fue porque mi formulario se estaba enviando a una ruta con un middleware diferente. Así que bloqueó el envío de información a esta ruta específica.


0

bueno, cuando tuve estos problemas, enfrenté 2 errores de código

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

lo corregí haciendo esto

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

por lo que sólo explayarse i cambiado la forma modelde openy también la ruta, donde colocó erróneamente entre corchetes.


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

¿Podría explicar un poco sobre lo que hace este código y cómo resuelve el problema?
newUserName02
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.