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.

mono espacial
fuente
¿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;
}
caballo de heno
fuente
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')); ?>
Bendición
fuente
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

Eli
fuente
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');
minitechi
fuente
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.

Dan
fuente
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.

kousher alam pranto
fuente
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'))
itachi
fuente
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)) }}
Faruk Omar
fuente
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.

iSWORD
fuente
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

Slimane MEHARZI
fuente
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.

philthathril
fuente
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 :)

Ahmed Albarody
fuente
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')) !!}

Islam ariful
fuente
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.

GabrielFiel
fuente
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.

Fillz Adebayo
fuente
-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 !');
Abdelhakim Ezzahraoui
fuente
¿Podría explicar un poco sobre lo que hace este código y cómo resuelve el problema?
newUserName02