Laravel: Метод [show] не существует

При попытке доступа к этому URL-адресу "пользователи/логин" я получил эту ошибку. Вот мой код:

Просмотреть пользователей /login.blade.php:

<head>Sign in : </head>
<body>
{{ HTML::ul($errors->all()) }}
<?php echo Form::open(array('url' => 'users')); 

echo '<div class="form-group">';
    echo Form::label('username', 'User Name');
    echo Form::text('ausername', null, array('class' => 'form-control'));
echo '</div>';

echo '<div class="form-group">';
    echo Form::label('Password', 'Password');
    echo Form::password('apassword', null, array('class' => 'form-control'));
echo '</div>';

echo Form::submit('Sign in', array('class' => 'btn btn-primary'));

echo Form::close();
?>
</body>

Контроллер Usercontroller.php

<?php

class UserController extends BaseController {


    public function index()
    {
        $users = User::all();
        return View::make('users.index')
            ->with('users', $users);
    }


    public function create()
    {
        return View::make('users.create');
    }


    public function store()
    {
        $rules = array(
            'username'   => 'required|alpha_dash',
            'password'   => 'required|confirmed',
            'name'       => 'required|regex:/^[a-zA-Z][a-zA-Z ]*$/',
            'email'      => 'required|email|unique:users',
            'country'    => 'required'
        );
        $validator = Validator::make(Input::all(), $rules);

        if ($validator->fails()) {
            return Redirect::to('users/create')
                ->withErrors($validator)
                ->withInput(Input::except('password'));
        } else {
            $user = new User;
            $user->username = Input::get('username');
            $user->password = Hash::make(Input::get('password'));
            $user->name = Input::get('name');
            $user->email = Input::get('email');
            $user->country = Input::get('country');
            $user->save();
            // redirect
            Session::flash('message', 'Successfully created user!');
            return Redirect::to('users');
            }
    }


    public function login()
    {
        $reflector = new ReflectionClass("UserController");
        $fn = $reflector->getFileName();
        dd($fn);
        return View::make('users.login');   
    }


    public function authen()
    {
        if (Auth::attempt(array('username' => Input::get('ausername'), 'password' => Input::get('apassword'))))
        {
            return Redirect::intended('users');
        }   
    }


}

и мои маршруты .php

<?php
Route::resource('users','UserController');
Route::get('users/login', '[email protected]');
Route::get('/', function()
{
    return View::make('hello');
});

Это проблема маршрута, спасибо за помощь

Ответ 1

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

Route::get('masterprices/data', '[email protected]');
Route::get( 'masterprices/upload', '[email protected]');
Route::post('masterprices/upload', '[email protected]_upload');
Route::get('masterprices/{masterprices}/multipledelete', '[email protected]');
Route::resource('masterprices', 'MasterPriceController');

Он проверяет другой возможный обработчик, если он не достигнет последней строки, которая является ресурсом для обработки индексной страницы.

Ответ 2

Этот:

Route::resource('users','UserController');

определяет следующие маршруты:

| GET|HEAD users               | users.index   | [email protected]  
| GET|HEAD users/create        | users.create  | [email protected] 
| POST users                   | users.store   | [email protected]  
| GET|HEAD users/{users}       | users.show    | [email protected]   
| GET|HEAD users/{users}/edit  | users.edit    | [email protected]   
| PUT users/{users}            | users.update  | [email protected] 
| PATCH users/{users}          |               | [email protected] 
| DELETE users/{users}         | users.destroy | [email protected]

Итак, пользователи URI/login вызывают маршрут users.show и эту проблему.

Решение похоже на то, как сказал Крайтен, чтобы полностью удалить этот маршрут, но я полагаю, что вы все еще хотите использовать некоторые маршруты для ресурса, например, в вашем контроллере (создавать, хранить, индексировать), поэтому лучше используйте это:

Route::resource('users', 'UserController', ['only'=> ['index','create','store']]);

Ответ 3

Список проблем с вызовом Route::resource. Включив это утверждение, вы говорите Laravel, что хотите использовать контроллер RESTful для путей, начинающихся с users. Это означает, что когда вы нажимаете URL-адрес "users/login", контроллер RESTful интерпретирует это как действие "показать" для контроллера user и терпит неудачу, поскольку нет метода show. Подробнее см. http://laravel.com/docs/controllers#resource-controllers - таблица на этой странице объясняет, какие маршруты автоматически настраиваются при реализации контроллера ресурсов.

Решение состоит в удалении Route::resource('users','UserController');.

Ответ 4

Добавьте настраиваемый маршрут до маршрутов ресурсов в файле маршрутов.

Согласно документации Laravel:

Если возникает необходимость добавлять дополнительные маршруты к контроллеру ресурсов за пределы маршрутов ресурсов по умолчанию, вы должны определить эти маршруты перед вызовом Route:: resource; в противном случае маршруты, определенные методом ресурса, могут непреднамеренно иметь приоритет над дополнительными маршрутами:

Ответ 5

Простое решение - это тот, который я только что нашел после прочтения вашего вопроса. Определите маршруты ::resource после любых маршрутов ::get или ::post. Я только что протестировал 4.2, и он работает (после того, как у вас такая же проблема).

Ответ 6

У меня была такая же проблема, но это было странно. В моем файле маршрутов я:

Route::controller('carts', 'CartsApiController');

Когда я изменил его на:

Route::controller('cart', 'CartsApiController');

Все было в порядке, и у меня не было ошибки снова. Я не уверен, но, похоже, проблема с именами.

Ответ 7

Я также столкнулся с одной и той же проблемой, но я нашел очень глупым и глупым ошибку, используя один из следующих способов: -

Route::get('users/login', ['uses'=>'[email protected]', 'as'=> 'userLogin']);      

и на вашем пути просмотра или контроллера используйте маршрут ('userLogin'); для маршрута к этой конкретной функции в вашем контроллере