web-dev-qa-db-fra.com

Laravel 5 MethodNotAllowedHttpException dans RouteCollection.php ligne 201:

J'ai un certain nombre de fichiers php dans mon projet:

admin.blade.php: ce fichier contient le formulaire d'administration.

Lorsqu'il est appelé, il affiche l'erreur suivante:

MethodNotAllowedHttpException dans la ligne 201 de RouteCollection.php

<h2>Please Log In To Manage</h2>
<form id="form1" name="form1" method="post" action="<?=URL::to('/admin')?>">
   <input type="hidden" name="_token" value="{{ csrf_token() }}">
   User Name:<br />
   <input name="username" type="text" id="username" size="40" />
   <br /><br />
   Password:<br />
   <input name="password" type="password" id="password" size="40" />
   <br />
   <br />
   <br />
   <input type="submit" name="button" id="button" value="Log In" />
</form>

Dans route.php, cet appel est effectué:

Route::get('/admin',array('uses'=>'student@admin'));

C'est la fonction dans student.php

public function admin()
{
    return View::make('student.admin');
    $validator = Validator::make($data = Input::all() , User::rules());
    if ($validator->fails())
    {
        return Redirect::back()->withErrors($validator)->withInput();
    }
    else
    {
        $check = 0;
        $check = DB::table('admin')->get();
        $username = Input::get('username');
        $password = Input::get('password');
        if (Auth::attempt(['username' => $username, 'password' => $password]))
        {
            return Redirect::intended('/');
        }
        return Redirect::back()->withInput()->withErrors('That username/password combo does not exist.');
    }
}

Je ne sais pas grand chose sur la création d'une zone d'administration, j'essaie juste de la créer.

10
deep singh

Voilà comment je le fais.

Routes.php

Route::get('/admin', 'UsersController@getAdminLogin');
Route::get('/admin/dashboard', 'UsersController@dashboard');
Route::post('/admin', 'UsersController@postAdminLogin');

admin_login.blade.php

{!! Form::open(['url' => '/admin']) !!}
    <div class="form-group">
        {!! Form::label('email', 'Email Id:') !!}
        {!! Form::text('email', null, ['class' => 'form-control input-sm']) !!}
    </div>
    <div class="form-group">
        {!! Form::label('password', 'Password') !!}
        {!! Form::password('password', ['class' => 'form-control input-sm']) !!}
    </div>
    <div class="form-group">
        {!! Form::submit('Login', ['class' => 'btn btn-primary btn-block']) !!}
    </div>
{!! Form::close() !!}

dashboard.blade.php

<h4 class="text-center">
    Welcome {{ Auth::user()->full_name }}
</h4>

UsersController.php

/**
 * Display the admin login form if not logged in,
 * else redirect him/her to the admin dashboard.
 *
 */
public function getAdminLogin()
{
    if(Auth::check() && Auth::user()->role === 'admin')
    {
        return redirect('/admin/dashboard');
    }
    return view('admin_login');
}

/**
 * Process the login form submitted, check for the
 * admin credentials in the users table. If match found,
 * redirect him/her to the admin dashboard, else, display
 * the error message.
 *
 */
public function postAdminLogin(Request $request)
{
    $this->validate($request, [
        'email'    => 'required|email|exists:users,email,role,admin',
        'password' => 'required'
    ]);

    $credentials = $request->only( 'email', 'password' );

    if(Auth::attempt($credentials))
    {
        return redirect('/admin/dashboard');
    }
    else
    {
        // Your logic of invalid credentials.
        return 'Invalid Credentials';
    }
}

/**
 * Display the dashboard to the admin if logged in, else,
 * redirect him/her to the admin login form.
 *
 */
public function dashboard()
{
    if(Auth::check() && Auth::user()->role === 'admin')
    {
        return view('admin.dashboard');
    }
    return redirect('/admin');
}

Votre code:

Dans routes.php, vous n'avez qu'un seul itinéraire, c'est-à-dire,

Route::get('/admin',array('uses'=>'student@admin'));

Et il n'y a pas de déclaration de la méthode post, donc la MethodNotAllowedHttpException

De plus, dans votre contrôleur, vous renvoyez d'abord la vue, puis vous traitez le formulaire qui ne fonctionnera pas du tout. Vous devez d'abord traiter le formulaire, puis renvoyer la vue.

public function admin(){
    // Won't work as you are already returning the view
    // before processing the admin form.
    return \View::make(students.admin);
    // ...
}

Comme l'a suggéré @Sulthan, vous devez utiliser Form Facade. Vous pouvez consulter cette vidéo sur Laracasts sur ce que Form Facade est et comment vous devez l'utiliser.

7
Saiyan Prince

Vous utilisez la méthode post dans le formulaire mais vous avez la méthode get dans les itinéraires.

Donc, changez la méthode en post dans vos itinéraires

Remarque:

Je vous recommande d'utiliser l'ouverture de formulaire par défaut de Laravel comme ci-dessous, ce qui est toujours la meilleure pratique.

{!! Form::open(array('url' => 'foo/bar')) !!}

{!! Form::close() !!}

Conseils:

En savoir plus ici et essayez de déboguer de telles choses en comparant les méthodes et les itinéraires.

La façade de forme n'est pas incluse dans laravel 5 par défaut. Vous devez l'installer en

composer require "illuminate/html":"5.0.*"

et mise à jour dans app.php.

J'ai écrit un blog qui donne un aperçu de cette installation.

5
Sulthan Allaudeen

Dans Routes web.php Votre code est

Route::get('/admin',array('uses'=>'student@admin')); 

ce qui est faux. Soumettre réellement des données dans POST son tableau de données de sorte que vous devez acheminer via post au lieu de get. Donc le code correct est

Route::post('/admin',array('uses'=>'student@admin'));

Suivez ce tutoriel de Laracast qui pourrait vous être utile,
https://laracasts.com/series/laravel-from-scratch-2017/episodes/16

2
Vrushal Raut

Dans routes.php, remplacez Route::get par Route::post.

1
daidongsheng

Vous n'avez aucun itinéraire de publication pour la publication de vos données de formulaire, utilisez la fonction de correspondance d'itinéraire pour les deux verbes http (get & post). utilisez ceci

Route :: match (['get', 'post'], '/ admin', 'student @ admin');

Vous devez également modifier votre méthode d'administration,

public function admin(Request $request){
    if($request->isMethod('get')){
        return \View::make('student.admin');
    } else {
    // your validation logic
    }
}
0
Nehal Hasnayeen