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.
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.
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.
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
Dans routes.php
, remplacez Route::get
par Route::post
.
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
}
}