Laravel 5 метод не разрешил исключение HttpException в RouteCollection.php строка 201:


В моем проекте есть несколько php-файлов:

admin.blade.php: эти файлы содержат форму администратора.

При вызове он показывает следующую ошибку:

Исключение methodnotallowedhttpexception в RouteCollection.php строка 201

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

В route.php выполняется этот вызов:

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

Это функция в 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.');
    }
}

Я мало что знаю о создании административной области, я просто пытаюсь ее создать.

Author: tereško, 2015-07-05

5 answers

Вот как я это делаю.

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

Ваш Код:

В routes.php у вас есть только 1 маршрут, т.Е.

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

И нет объявления метода post, следовательно, MethodNotAllowedHttpException

Кроме того, в вашем контроллере вы сначала возвращаете представление, а затем обрабатываете форма, которая вообще не будет работать. Сначала вам нужно обработать форму, а затем вернуть представление.

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

Как предложил @Sulthan, вам следует использовать Form Facade. Вы можете посмотреть это видео на Laracasts о том, что такое Form Facade и как вы должны его использовать.

 6
Author: Saiyan Prince, 2015-07-05 21:17:38

Вы используете метод post в форме, но у вас есть метод get в маршрутах.

Итак, измените метод на post в своих маршрутах

Примечание :

Я рекомендую вам использовать открытие формы Laravel по умолчанию, как показано ниже, что всегда является наилучшей практикой

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

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

Советы :

Подробнее читайте здесь и попытайтесь отладить такие вещи, сравнивая методы и маршруты.

Фасад формы не является включен в laravel 5 по умолчанию. Вы должны установить его с помощью

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

И обновление в app.php .

Я написал блог , в котором дается краткое описание этой установки.

 4
Author: Sulthan Allaudeen, 2015-07-05 09:21:58

В маршрутах web.php Ваш код

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

Что неверно. На самом деле отправка данных в методе POST - это массив данных, поэтому вам нужно прокладывать маршрут через post вместо get. таким образом, правильный код

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

Следуйте этому руководству по форме Laracast, это может быть полезно,
https://laracasts.com/series/laravel-from-scratch-2017/episodes/16

 2
Author: Vrushal Raut, 2017-03-31 11:41:53

В routes.php замените Route::get на Route::post.

 1
Author: daidongsheng, 2015-07-05 14:16:56

У вас нет маршрута отправки для отправки данных формы, используйте функцию сопоставления маршрутов для обоих http-глаголов (get & post). используйте это

Маршрут::совпадение (['получить', 'опубликовать'], '/администратор', 'студент@администратор');

Также вам необходимо изменить свой метод администрирования,

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