149 votes

Ajouter de nouvelles méthodes à un contrôleur de ressources en Laravel

Je veux savoir s'il est possible d'ajouter de nouvelles méthodes à un contrôleur de ressources dans Laravel et comment vous le faites.

Je sais que ces méthodes sont les méthodes par défaut (index, créer, stocker, modifier, mettre à jour, détruire). Maintenant, je veux ajouter des méthodes et des routes supplémentaires au même contrôleur.

Est-ce possible ?

1voto

PatrickL Points 206

Il suffit d'ajouter une nouvelle méthode et une route vers cette méthode.

Dans votre contrôleur :

public function foo($bar=“default”)
{
      //do stuff
}

Et dans vos routes web

Route::get(“foo/{$bar}”, “MyController@foo”);

Assurez-vous simplement que la méthode dans le contrôleur est publique.

1voto

Dev Lim Points 11

Je résous par

Créez un fichier de routeur personnalisé qui étend le BaseRouter

// src/app/Custom/Router.php

<?php

namespace App\Custom;

use Illuminate\Routing\Router as BaseRouter;
use Illuminate\Support\Str;

class Router extends BaseRouter
{
    public function customResource($name, $controller, array $options = [])
    {
        $model = Str::singular($name); // this is optional, i need it for Route Model Binding

        $this
            ->get( // set the http methods
                $name .'/{' . $model . '}/audit',
                $controller . '@audit'
            )->name($name . '.audit');

        return $this->resource($name, $controller, $options);
    }
}

Alors inscrivez-vous sur src/bootstrap/app.php

$app->singleton('router', function ($app) {
    return new \App\Custom\Router($app['events'], $app);
});

Et l'utiliser dans /routes/web.php

Route::customResource(
    'entries',
    'EntryController'
);

0voto

Pradeep Parmar Points 11

Auparavant, j'ai défini mon itinéraire comme suit :

Route::get('foo/bar', 'FooController@bar');
Route::resource('foo', 'FooController');

Il a donné l'erreur :

la route foo.bar n'est pas définie

Et puis après quelques recherches sur Google, j'ai ajouté le nom

Route::get('foo/bar', 'FooController@bar')->name('foo.bar');

Et ça a bien marché.

-1voto

mdamia Points 3955

Ça marche aussi très bien. Pas besoin d'ajouter d'autres routes, il suffit d'utiliser la méthode show du contrôleur de ressources comme ceci :

public function show($name){

 switch ($name){
   case 'foo':
    $this -> foo();
    break;
   case 'bar':
    $this ->bar();
    break; 
  defautlt:
    abort(404,'bad request');
    break;
 }

}
public function foo(){}
publcc function bar(){}

J'utilise le défaut pour lancer une page d'erreur personnalisée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X