Laravel, исключая изворотливые функции в чистом виде

В настоящее время у меня есть 4 ресурса в моем файле web.php .

Route::resource('campaigns', 'CampaignController')->except(['show']);
Route::resource('users', 'UserController')->except(['show']);
Route::resource('models', 'ModelController')->except(['show']);
Route::resource('trims', 'TrimController')->except(['show']);

И я не могу не удивляться. Разве я не могу добавить что-то в функцию Route::resources чтобы она так себя вела? Это потому, что все они имеют одну общую черту. Они except() show() метода show() .

Хочется что-то подобное. (Этот пример не работает, потому что у resources() нет метода except() .

Route::resources([
    'campaigns' => 'CampaignController',
    'users' => 'UserController',
    'models' => 'ModelController',
    'trims' => 'TrimController'
])->except(['show']);

Всего 2 ответа


Вы можете написать свой собственный класс, который расширяет IlluminateRoutingRoute и реализовать свой метод resources следующим образом:

namespace AppExtends;

class Route extends IlluminateRoutingRoute {

   public function resources($routes, array $excepts) {
     foreach ($routes as $key => $value){
         $this->resource($key, $value)->except($excepts);
     }
   }

}

После того, как вам нужно будет связать свой класс с вашим поставщиком услуг, как это:

public function register()
{
    $this->app->bind('IlluminateRoutingRoute', 'App\Extends\Route');
}

и вызвать resources в web.php так:

Route::resources([
    'campaigns' => 'CampaignController',
    'users' => 'UserController',
    'models' => 'ModelController',
    'trims' => 'TrimController'
], ['show']);

[РЕДАКТИРОВАТЬ 1]

От laravel.com/docs/5.8/controllers#resource-controllers

Вы можете зарегистрировать много контроллеров ресурсов одновременно, передав массив в метод resources:

Route::resources([
    'photos' => 'PhotoController',
    'posts' => 'PostController'
]);

Но я не знаю, можете ли вы позвонить ->except(['show']) как это

Route::resources([])->except(['show'])

Если вы говорите о возможности, то да, это возможно, как указано выше, но по умолчанию вы не можете

Посмотрите на этот файл,

/vendor/laravel/framework/src/Illuminate/Support/Facades/Route.php

 * @method static IlluminateRoutingPendingResourceRegistration resource(string $name, string $controller, array $options = [])
 * @method static void resources(array $resources)

Есть идеи?

10000