Laravel - 具有参数的单个控制器的多个资源路由

时间:2017-11-03 09:54:24

标签: php laravel laravel-5 laravel-routing laravel-5.5

我们可以为多个路由设置一个控制器,并获取参数吗?

目前,我有这些路线:

Route::resource('/customers', 'CustomerController');
Route::resource('/agents', 'AgentController');

CustomerControllerAgentController所有资源功能都有效。

但由于CustomerControllerAgentController几乎相同,但一个数据库字段除外,即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不同,因为我没有使用特征。

5 个答案:

答案 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定义为CustomerControllerAgentController的父级(两者都扩展为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]);

其他路线也是如此..现在它正常运作。

感谢大家的帮助。