【发布时间】:2018-05-27 02:55:00
【问题描述】:
我在一个 Laravel 项目中有很多资源控制器,我通常会这样做:
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
$chat = Chat::find($id);
$chat->customer_id = $request->get('customer_id');
$chat->content = $request->get('content');
$chat->save();
return redirect('/chat');
}
由于路线有时会发生变化,我继续使用另一个重定向,如下所示:
return redirect()->action('ChatController@index');
这对我来说效果更好,因为现在路线可以是他们想要的任何东西,它仍然可以正常工作。然而还有另一个“问题”,那就是控制器的名称。如果我将 ChatController 重命名为 CustomerChatController,此操作确实需要返工,这有点烦人。
我的问题:是否有开箱即用的技巧来始终针对“自我”控制器。像
return redirect()->action(self::class . '@index');
因此,至少在控制器内部,控制器的任何重命名都无关紧要?
编辑:是的,我以前见过命名路线,但这不是重复的帖子。命名路由对于资源控制器来说有点混乱。正如文档所述:
Route::resource('photo', 'PhotoController', ['names' => [
'create' => 'photo.build'
]]);
人们也可以在那里命名路由,但我最终会得到数百个名称,而且我真的不关心这些名称中的任何一个(说到资源控制器,我确实给出了一个名称)。
编辑2: 所以你告诉我,而不是像这样的约 150 条路线中的 1 条
Route::resource('chat', 'ChatController');
我应该将它添加到 routes/web.php:
Route::resource('chat', 'ChatController',
['names' => [
'create' => 'chat.create',
'update' => 'chat.update',
'store' => 'chat.store',
'destroy' => 'chat.destroy',
'edit' => 'chat.edit',
'index' => 'chat.index',
'show' => 'chat.show'
]]);
然后使用这些名称。这就是为什么它是重复的帖子?这对我来说似乎很愚蠢。资源控制器很酷,因为它们不会因重复行为而弄乱路由表,并且通过您对命名路由的解决方案,我最终得到 7 行而不是一个资源控制器路由。
解决方案: 似乎我已经很接近了。这个工作正常:
return redirect()->action(class_basename(self::class) . '@index');
我在这里找到了提示:
Get Laravel 5 controller name in view
最终解决方案:为了有一些自动代码完成,顺便说一下,我从来没有遇到过像 return redirect()->route('chat.create'); 这样的命名路由,我将基本路由添加到控制器。
class Controller extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
protected static function routeCustom($name)
{
$action = app('request')->route()->getAction();
$controller = class_basename($action['controller']);
list($controller, $action) = explode('@', $controller);
return $controller . '@' . $name;
}
protected static function routeIndex()
{
return self::routeCustom('index');
}
protected static function routeStore()
{
return self::routeCustom('store');
}
protected static function routeEdit()
{
return self::routeCustom('edit');
}
protected static function routeCreate()
{
return self::routeCustom('create');
}
protected static function routeShow()
{
return self::routeCustom('show');
}
protected static function routeUpdate()
{
return self::routeCustom('update');
}
protected static function routeDestroy()
{
return self::routeCustom('destroy');
}
}
所以我可以访问它们以在同一个控制器中重定向,如下所示:
return redirect()->action(self::routeIndex());
重定向到WhateverController@index
【问题讨论】:
-
我有这个问题的答案here ;)
-
@Maraboc 的解决方案指出,使用命名路由似乎是最优雅的方式。
-
请下次发帖前先搜索一下...
-
是的,我见过命名路由,但这对于资源控制器来说有点混乱。正如文档所述:
Route::resource('photo', 'PhotoController', ['names' => [ 'create' => 'photo.build' ]]);也可以在那里命名路线,但我最终得到了数百个名称,我真的不关心这些名称中的任何一个(说到资源控制器,我确实给出了一个名称)。 -
因此,如果您陷入重复的炼狱中,提出一个新问题通常更有意义,并添加将其区分为独特问题的细节。此外,永远不要回答问题中的问题。那是要求将其删除(您会因此而失分)。
标签: php laravel controller routing