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

Je veux savoir s’il est possible d’append 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 (indexer, créer, stocker, éditer, mettre à jour, détruire). Maintenant, je veux append des méthodes et des itinéraires supplémentaires au même contrôleur.

Est-ce possible?

Ajoutez simplement une route à cette méthode séparément avant d’enregistrer la ressource:

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

Je viens de le faire, pour append une méthode GET “delete”.

Après avoir créé vos fichiers, il vous suffit d’append

 'AntonioRibeiro\Routing\ExtendedRouterServiceProvider', 

à ‘fournisseurs’ dans votre app / config.php

Editez l’alias de route dans ce même fichier:

 'Route' => 'Illuminate\Support\Facades\Route', 

le changer pour

 'Route' => 'AntonioRibeiro\Facades\ExtendedRouteFacade', 

Et assurez-vous que ces fichiers sont en cours de chargement automatique, ils doivent être dans un répertoire que vous avez dans votre composer.json (section “autoload”).

Ensuite, il vous suffit de:

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

Et ceci (regardez la dernière ligne) est le résultat si vous exécutez des php artisan routes :

liste des routes Ce sont mes fichiers sources:

ExtendedRouteFacade.pas

 currentRouteNamed($name); } /** * Determine if the current route uses a given controller action. * * @param ssortingng $action * @return bool */ public static function uses($action) { return static::$app['router']->currentRouteUses($action); } /** * Get the registered name of the component. * * @return ssortingng */ protected static function getFacadeAccessor() { return 'router'; } } 

ExtendedRouter.pas

 getResourceUri($name).'/{'.$base.'}/destroy'; return $this->get($uri, $this->getResourceAction($name, $controller, 'delete')); } } 

ExtendedRouteServiceProvider.pas

 app['router'] = $this->app->share(function() { return new ExtendedRouter($this->app); }); } /** * Get the services provided by the provider. * * @return array */ public function provides() { return array('router'); } } 

Ouais, c’est possible ..

Dans mon cas, j’ajoute la méthode: data pour gérer la demande de /data.json dans la méthode HTTP POST.

C’est ce que j’ai fait.

Nous étendons d’abord Illuminate \ Routing \ ResourceRegistrar pour append de nouvelles données de méthode

 getResourceUri($name).'/data.json'; $action = $this->getResourceAction($name, $controller, 'data', $options); return $this->router->post($uri, $action); } } 

Après cela, créez votre nouveau ServiceProvider ou utilisez plutôt AppServiceProvider .

Dans la méthode boot , ajoutez ce code:

  public function boot() { $registrar = new \App\MyCustom\Routing\ResourceRegistrar($this->app['router']); $this->app->bind('Illuminate\Routing\ResourceRegistrar', function () use ($registrar) { return $registrar; }); } 

puis :

ajoutez à votre itinéraire:

 Route::resource('test', 'TestController'); 

Check by php artisan route:list Et vous trouverez une nouvelle méthode ‘data’

 Route::resource('foo', 'FooController'); Route::controller('foo', 'FooController'); 

Essayez ceci .Mettez-vous des méthodes supplémentaires comme getData (), etc. etc. Cela a fonctionné pour que je maintienne route.php propre

Cela fonctionne très bien aussi. Pas besoin d’append plus de routes, utilisez simplement 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 la page par défaut pour lancer une page d’erreur personnalisée.

Utiliser Laravel> 5 Trouvez le fichier web.php dans le dossier routes ajoutez vos méthodes

Vous pouvez utiliser route :: resource pour acheminer toutes ces méthodes index, afficher, stocker, mettre à jour, détruire dans votre contrôleur sur une seule ligne

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

Ajoutez simplement 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 itinéraires web

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

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