我们可以为多个路由设置一个控制器,并获取参数吗?
目前,我有这些路线:
Route::resource('/customers', 'CustomerController');
Route::resource('/agents', 'AgentController');
CustomerController
和AgentController
所有资源功能都有效。
但由于CustomerController
和AgentController
几乎相同,但一个数据库字段除外,即group_id
。我想使用一个控制器,即PartyController
和一个路由:
Route::resource('/parties/customers', 'PartyController ');
Route::resource('/parties/agents', 'PartyController ');
或者有人建议:
Route::resource('/parties/{group}', 'PartyController ');
我一直在寻找一段时间,却发现很难遵循这条道路。我在PartyController
的构造函数中添加了此代码,以检查调用路径:
$path = Request::capture()->path();
$this->group = ucwords(explode("/", $path)[1]);
echo($this->group );
直到这里,一切似乎都很顺利。但是当我在index.blade.php
时,我有这样的陈述:
<p>{{ link_to_route('parties.create', 'Add new') }}</p>
我得到一个例外:
Route [parties.create] not defined.
我尝试了多种组合,但没有取得任何成功,也有更多错误发生,例如访问/parties/customers/create
现在无法正常工作。
那么,无论如何还是可以放弃这个想法吗?
编辑:我的问题与Same Laravel resource controller for multiple routes不同,因为我没有使用特征。
答案 0 :(得分:5)
如果我是你,我会使用:
Route::resource('/customers', 'CustomerController');
Route::resource('/agents', 'AgentController');
现在,您可以AgentController
扩展CustomerController
(或您想要的任何其他控制器),以便他们可以重复使用相同的代码。如果需要,您可以在构造函数中设置一些属性,例如group,以了解您是在与代理商还是客户打交道。
要使您的路线正常工作,您可以将额外的变量从控制器传递到视图,以便在您的刀片中传递:
<p>{{ link_to_route($group.'.create', 'Add new') }}</p>
答案 1 :(得分:1)
<p>{{ link_to_route('parties.create', 'Add new') }}</p>
你错过了你添加的变量参数,它应该是
<p>{{ link_to_route('parties.' . $group . '.create', 'Add new') }}</p>
答案 2 :(得分:1)
正如我现在想的那样......使用类继承会很好! :d
您可以将PartyController
定义为CustomerController
和AgentController
的父级(两者都扩展为PartyController
)。
因此,将常用方法移至PartyController
并从Customer/Agent
控制器调用它们。 :)
答案 3 :(得分:1)
因此,首先要定义下一行的路线:
Route::resource('/parties/agents', PartiesAgentsController::class);
Route::resource('/parties/customers', PartiesCustomersController::class);
然后你可能需要一些REST风格的派对:
class PartiesController extends BaseController
{
/**
* The Entry Repository
*
* @var EntryRepositoryInterface
*/
protected $repository;
/**
* Create an instance of the RestController class
*
* @param EntryRepositoryInterface $repository
*/
public function __construct(EntryRepositoryInterface $repository)
{
parent::__construct();
if (!$this->request->ajax())
{
return redirect('/');
}
$this->repository = $repository;
}
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store()
{
}
/**
* Display the specified resource.
*
* @param int $slug
* @return \Illuminate\Http\Response
*/
public function show($slug)
{
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
}
}
在这个控制器的构造方法中,我正在进行一些检查和其他操作。我也使用存储库......它是No DDD)。
然后,我可以使用以上所有内容:
class PartiesAgentsController extends PartiesController
{
/**
* Create an instance of the PartiesAgentsController class
*
* @param EntryRepositoryInterface $repository
*/
public function __construct(PartyAgentRepositoryInterface $repository)
{
parent::__construct($repository);
}
}
同样适合客户......
答案 4 :(得分:1)
我是通过使用自己的方法做到的,我使用了相同的路线。
=IF(F1=A4:A53,"B1,"")
并在PartyController的构造函数中
Route::resource('/parties/agents', 'PartyController');
Route::resource('/parties/customers', 'PartyController');
现在我使用$ group变量来确定我正在使用哪个组。
在我的刀片文件中,我用$ group.create替换了party.create
$path = Request::capture()->path();
$group = strtolower(explode("/", $path)[1]);
其他路线也是如此..现在它正常运作。
感谢大家的帮助。