如何使用Laravel框架在应用程序控制器之间共享代码?

时间:2016-02-09 09:33:57

标签: php laravel controller

使用Laravel分发控制器代码的最佳做法是什么?

实施例: TaskController消耗特殊请求并访问具有任务列表的特定模型方法。

OrganisationTaskTreeController使用不同的请求访问Task Entity上的相同方法,但也使用与OrganisationController共享的方法获取OrganisationTree资源。

代码:

class TaskController extends BaseController {

public function getTask(Request $request)
{
    $_match = [];

    if ($request->has('types'))
    {
        $_match['type'] = ['$in' =>  $request->get('types')];
    }

    if ( ! $request->has('group'))
    {
        throw new InvalidParameter("Undefined group parameter");
    }

    ....
}

class OrganisationTaskTreeController extends BaseController  {

public function getOrganizationTree(Request $request)
{
    $_match = [];
    $_tree  = [];

    if ($request->has('types'))
    {
        $_match['type'] = ['$in' =>  $request->get('types')];
    }

    if ( ! $request->has('group'))
    {
        throw new InvalidParameter("Undefined group parameter");
    }

    if ($request->has('unti'))
    {
        $_tree['unit'] = $request->get('unit');
    }

    ....
}

}

如何不复制此代码?

我认为控制器不应该通过设计进行扩展,因为使用了许多控制器的方法。这将是一种矫枉过正。

我正在考虑:

  • 性状
  • HMVC
  • Controller as Service
  • 或者建立一个消耗$ request的资源库是否合适?

2 个答案:

答案 0 :(得分:0)

也许您可以将要重用的代码重构为两个类可以扩展的基类上的方法,例如,类TaskController扩展BaseController,BaseClass。然后,您可以在扩展BaseClass的每个类上使用该方法。

答案 1 :(得分:0)

如果自定义请求对象可以键入到需要该特定验证的任何方法中,那该怎么办? https://www.laravel.com/docs/5.2/validation#form-request-validation