Добавление новых методов к контроллеру ресурсов в Laravel
Я хочу знать, можно ли добавить новые методы к контроллеру ресурсов в Laravel и как это сделать.
Я знаю, что эти методы по умолчанию (index, create, store, edit, update, destroy). Теперь я хочу добавить дополнительные методы и маршруты к тому же контроллеру.
Это возможно?
7 ответов:
просто добавить маршрут к этому методу отдельно, до вы регистрируете ресурс:
Route::get('foo/bar', 'FooController@bar'); Route::resource('foo', 'FooController');
Я просто сделал это, чтобы добавить метод GET "delete".
после создания файлов, вам просто нужно добавить
'AntonioRibeiro\Routing\ExtendedRouterServiceProvider',для "поставщиками" в файле app/config файл.php
изменить псевдоним маршрута в этом же файле:
'Route' => 'Illuminate\Support\Facades\Route',изменение его
'Route' => 'AntonioRibeiro\Facades\ExtendedRouteFacade',и убедитесь, что эти файлы загружаются автоматически, они должны быть в каком-то каталоге, который у вас есть в вашем композиторе.json (раздел "autoload").
тогда вам просто необходимо к:
Route::resource('users', 'UsersController');и это (посмотрите на последнюю строку) является результатом, если вы запустите
php artisan routes:
Это мои исходные файлы:
ExtendedRouteFacade.па
<?php namespace AntonioRibeiro\Facades; use Illuminate\Support\Facades\Facade as IlluminateFacade; class ExtendedRouteFacade extends IlluminateFacade { /** * Determine if the current route matches a given name. * * @param string $name * @return bool */ public static function is($name) { return static::$app['router']->currentRouteNamed($name); } /** * Determine if the current route uses a given controller action. * * @param string $action * @return bool */ public static function uses($action) { return static::$app['router']->currentRouteUses($action); } /** * Get the registered name of the component. * * @return string */ protected static function getFacadeAccessor() { return 'router'; } }ExtendedRouter.па
<?php namespace AntonioRibeiro\Routing; class ExtendedRouter extends \Illuminate\Routing\Router { protected $resourceDefaults = array('index', 'create', 'store', 'show', 'edit', 'update', 'destroy', 'delete'); /** * Add the show method for a resourceful route. * * @param string $name * @param string $base * @param string $controller * @return void */ protected function addResourceDelete($name, $base, $controller) { $uri = $this->getResourceUri($name).'/{'.$base.'}/destroy'; return $this->get($uri, $this->getResourceAction($name, $controller, 'delete')); } }ExtendedRouteServiceProvider.па
<?php namespace AntonioRibeiro\Routing; use Illuminate\Support\ServiceProvider; class ExtendedRouterServiceProvider extends ServiceProvider { /** * Indicates if loading of the provider is deferred. * * @var bool */ protected $defer = true; /** * Register the service provider. * * @return void */ public function register() { $this->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'); } }
Да, это возможно..
в моем случае я добавляю метод: данные для обработки запроса /данных.json в методе HTTP POST.
это то, что я сделал.
Сначала мы расширяем Illuminate\Routing\ResourceRegistrar добавить новый метод сведения
<?php namespace App\MyCustom\Routing; use Illuminate\Routing\ResourceRegistrar as OriginalRegistrar; class ResourceRegistrar extends OriginalRegistrar { // add data to the array /** * The default actions for a resourceful controller. * * @var array */ protected $resourceDefaults = ['index', 'create', 'store', 'show', 'edit', 'update', 'destroy', 'data']; /** * Add the data method for a resourceful route. * * @param string $name * @param string $base * @param string $controller * @param array $options * @return \Illuminate\Routing\Route */ protected function addResourceData($name, $base, $controller, $options) { $uri = $this->getResourceUri($name).'/data.json'; $action = $this->getResourceAction($name, $controller, 'data', $options); return $this->router->post($uri, $action); } }после этого сделайте свой новый ServiceProvider или использовать AppServiceProvider вместо.
методом boot добавить этот код :
public function boot() { $registrar = new \App\MyCustom\Routing\ResourceRegistrar($this->app['router']); $this->app->bind('Illuminate\Routing\ResourceRegistrar', function () use ($registrar) { return $registrar; }); }затем :
добавить в маршрут:
Route::resource('test', 'TestController');проверка
php artisan route:listИ вы найдете новый метод 'data'
Route::resource('foo', 'FooController'); Route::controller('foo', 'FooController');дайте это попробовать .Положите вам дополнительные методы, такие как getData() и т. д.. Это сработало для меня, чтобы сохранить маршрут.php clean
Это тоже неплохо работает. Не нужно добавлять больше маршрутов, просто используйте метод show контроллера ресурсов следующим образом:
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(){}Я использую значение по умолчанию, чтобы бросить пользовательскую страницу ошибки.
Использование Laravel >5 Найти в интернете.php файл в папке routes добавьте свои методы
вы можете использовать route:: resource для маршрутизации всех этих методов index, show, store, update, destroy в вашем контроллере в одной строке
Route::get('foo/bar', 'NameController@bar'); Route::resource('foo', 'NameController');
просто добавьте новый метод и маршрут к этому методу.
в вашем контроллере:
public function foo($bar=“default”) { //do stuff }и в ваших веб-маршрутах
Route::get(“foo/{$bar}”, “MyController@foo”);просто убедитесь, что метод в контроллере является публичной.
Это мои исходные файлы:
Comments