web-dev-qa-db-fra.com

Laravel: La méthode [show] n'existe pas

En essayant d'accéder à cette URL 'utilisateurs/login' j'ai eu cette erreur, voici mon code:

Afficher les utilisateurs/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>

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


}

et mes routes.php

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

est-ce un problème de route, merci pour l'aide

13
Tarik Mokafih

J'ai eu le même problème que toi. Le problème finit par réorganiser le code de ressource, c.-à-d.

Route::get('masterprices/data', 'MasterPriceController@data');
Route::get( 'masterprices/upload', 'MasterPriceController@upload');
Route::post('masterprices/upload', 'MasterPriceController@do_upload');
Route::get('masterprices/{masterprices}/multipledelete', 'MasterPriceController@multipledelete');
Route::resource('masterprices', 'MasterPriceController');

Il vérifie l'autre gestionnaire possible. S'il n'en contient aucun, il atteindra la dernière ligne ressource pour gérer la page d'index.

19
Frederick Li

Celui-là:

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

définit les itinéraires suivants:

| GET|HEAD users               | users.index   | UsersController@index  
| GET|HEAD users/create        | users.create  | UsersController@create 
| POST users                   | users.store   | UsersController@store  
| GET|HEAD users/{users}       | users.show    | UsersController@show   
| GET|HEAD users/{users}/edit  | users.edit    | UsersController@edit   
| PUT users/{users}            | users.update  | UsersController@update 
| PATCH users/{users}          |               | UsersController@update 
| DELETE users/{users}         | users.destroy | UsersController@destroy

Donc, URI utilisateurs/login appelle users.show route et c'est le problème.

La solution est comme Kryten a dit de supprimer complètement cette route, mais je suppose que vous voulez toujours utiliser certaines des routes pour la ressource, comme dans votre contrôleur (créer, stocker, indexer), alors mieux utiliser ceci:

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

La liste des problèmes avec l'appel Route::resource. En incluant cette instruction, vous indiquez à Laravel que vous souhaitez utiliser un contrôleur RESTful pour les chemins commençant par users. Cela signifie que lorsque vous cliquez sur l'URL "utilisateurs/identifiant", le contrôleur RESTful l'interprète comme une action "show" pour le contrôleur user et échoue, car il n'existe aucune méthode show. Voir http://laravel.com/docs/controllers#resource-controllers pour plus de détails - le tableau de cette page explique les itinéraires configurés automatiquement lorsque vous implémentez un contrôleur de ressources.

La solution consiste à supprimer Route::resource('users','UserController');.

3
Kryten

Ajoutez la route personnalisée avant les routes de ressources dans votre fichier de routes.

Selon la documentation de Laravel:

S'il devient nécessaire d'ajouter des itinéraires supplémentaires à un contrôleur de ressources au-delà des itinéraires de ressource par défaut, vous devez définir ces itinéraires avant votre appel à Route :: resource; sinon, les itinéraires définis par la méthode resource peuvent involontairement avoir priorité sur vos itinéraires supplémentaires:

2
Alex

La solution simple est celle que je viens de trouver après avoir lu votre question. Définissez vos itinéraires ::resource after n’importe quel itinéraire ::get ou ::post. Je viens de tester sur 4.2 et ça marche (après avoir le même problème).

1
Qwiso

J'avais le même problème mais c'était bizarre. Dans mon fichier de routes, j'avais:

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

Quand je l'ai changé pour:

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

Tout allait bien et je n'ai pas encore eu l'erreur. Je ne suis pas sûr mais semble être un problème de nommage.

0
Fraz Ahmed

J'ai également fait face au même problème, mais je l'ai trouvé très stupide et stupide, une route d'utilisation comme celle-ci: - 

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

et dans votre vue ou votre contrôleur, utilisez route pour route vers cette fonction particulière dans votre contrôleur 

0
Devil Inside