olv*_*lvl 6 laravel laravel-routing
Route::resource('recipe', 'RecipeController');当您使用等定义资源时,会定义以下路由: /photo/{photo}/edit,一旦您定义了所有资源,您就会得到如下所示的内容:
/recipes/{recipes}/edit/allergens/{allergens}/edit/ingredients/{ingredients}/edit因为我的所有记录都用id作主键(MongoDB),所以我想改为{id}这样:
/recipes/{id}/edit/allergens/{id}/edit/ingredients/{id}/edit我在Router课堂上进行了挖掘,但我不知道如何指定这一点。
更重要的是,当我创建一个表单时,Form::model($record)我会得到诸如/recipes/{recipes}“因为recipes是 的属性”之类的操作$record。
如何将关键参数的名称定义id为recipes, allergens, ingredients?
为了更改 的参数名称Route::resource,您需要自定义ResourceRegistrar实现。
以下是如何以最短的方式实现这一目标:
// AppServiceProvider (or anywhere you like)
public function register()
{
$this->app->bind('Illuminate\Routing\ResourceRegistrar', function ($app) {
// *php7* anonymous class for brevity,
// feel free to create ordinary `ResourceRegistrar` class instead
return new class($app['router']) extends \Illuminate\Routing\ResourceRegistrar
{
public function register($name, $controller, array $options = [])
{
if (str_contains($name, '/')) {
return parent::register($name, $controller, $options);
}
// ---------------------------------
// this is the part that we override
$base = array_get($options, 'param', $this->getResourceWildcard(last(explode('.', $name))));
// ---------------------------------
$defaults = $this->resourceDefaults;
foreach ($this->getResourceMethods($defaults, $options) as $m) {
$this->{'addResource'.ucfirst($m)}($name, $base, $controller, $options);
}
}
};
});
}
Run Code Online (Sandbox Code Playgroud)
现在您的路线将如下所示:
Route::resource('users', 'UsersController', ['param' => 'some_param'])
/users/{some_param}
// default as fallback
Route::resource('users', 'UsersController')
/users/{users}
Run Code Online (Sandbox Code Playgroud)
请注意,这种方式不适用于嵌套资源,因此它们将是默认行为和自定义行为的混合,如下所示:
Route::resource('users.posts', 'SomeController', ['param' => 'id'])
/users/{users}/posts/{id}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4574 次 |
| 最近记录: |