Laravel Route资源命名函数

时间:2018-07-24 08:46:07

标签: php laravel laravel-5

我目前有这样的路线

Play Games callback indicates connection failure.
UI interaction required to connect to Google Play.

这将产生像这样的路线列表

//Settings
Route::prefix('settings')->group(function(){
    //Get all users settings
    Route::resource('user', 'SettingsController');
});

以此类推。

我的问题是我希望设置控制器能够控制1个控制器中的不同设置列表,而不仅仅是“用户”。

如何命名资源,以便最后命名功能?

例如,上面的代码生成了类似| POST | settings/user |user.store | App\Http\Controllers\SettingsController@store | web,auth,GlobalAdmin | | GET|HEAD | settings/user |user.index | App\Http\Controllers\SettingsController@index | web,auth,GlobalAdmin | | GET|HEAD | settings/user/create |user.create | App\Http\Controllers\SettingsController@create | web,auth,GlobalAdmin | 的函数名,我将如何获取它,以便它自动构建带有类似SettingsController@store的前缀的函数名?

2 个答案:

答案 0 :(得分:1)

不能。除非您在幕后,并且真正了解Laravel如何处理这一代人。但是,您可以做的是在资源路由上使用except或使用partial resource routes

完成上述操作之一后,您可以手动添加路线,例如

POST设置/用户 开机自检设置/其他 POST设置/常规

并以这种方式指出他们。

答案 1 :(得分:1)

如果您确实想拥有这种行为,可以拥有它。您可以扩展ListField类并将扩展版本绑定到容器。

只有一种方法需要调整,即为资源Illuminate\Routing\ResourceRegistrar的每条路由设置action的方法。可以对此进行调整,以检查在getResourceAction已经使用的选项数组中传递的键。如果存在密钥,则可以启用所需的行为,在方法名称前添加资源名称并在实际方法的首字母大写。

ResourceRegistrar

在服务提供商class YourRegistrar extends \Illuminate\Routing\ResourceRegistrar { protected function getResourceAction($resource, $controller, $method, $options) { $name = $this->getResourceRouteName($resource, $method, $options); // check if 'pre' option was set $method = isset($options['pre']) ? $resource . ucfirst($method) : $method; $action = ['as' => $name, 'uses' => $controller.'@'.$method]; if (isset($options['middleware'])) { $action['middleware'] = $options['middleware']; } return $action; } } 中(将新类绑定到当前的@register):

ResourceRegistrar

在路线文件中:

$this->app->bind(
    \Illuminate\Routing\ResourceRegistrar::class,
    \Where\Ever\YourResourceRegistrar::class
);

路由器会先检查容器上的Route::resource('user', 'SettingsController', ['pre' => true]); // SettingsController@userIndex // SettingsController@userShow // ... Route::resource('user', 'SettingsController'); // SettingsController@index // SettingsController@show // ... normal 的名称是否已绑定,然后再进行更新。如果存在绑定,它将要求容器解析一个绑定。这样可以扩展ResourceRegistrar,然后路由器使用您的版本。

在我们的版本中,我们正在检查是否设置了选项键ResourceRegistrar。如果是这样,我们将相应地调整路由的方法名称。 (pre

您可以在$method = isset($options['pre']) ? $resource . ucfirst($method) : $method;上阅读更多信息,并在我的博客文章中详细了解上述内容:

asklagbox blog - Resource Registrar - lets extend