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