Lumen / Dingo / Laravel找到正确的控制器

时间:2016-06-08 13:38:12

标签: php laravel lumen dingo-api

我知道这是一种罪恶,但我没有任何代码可以显示,只是我完全碰到了一堵砖墙。我的问题如下。

我有一个连接到Lumen / Dingo Api的客户端。对于所有的要求,它很有效。例如:

我的路线:

$api->get('contact', 'ContactController@get');

加上这个我有一个ContactController,里面我有一个get函数返回一个响应。这里没问题。

现在出现以下问题

我有一条包含任务的路线:

$api->get('task/{id}', 'TaskController@get');

问题是在系统中并非所有Tasks都相同。取决于我想要执行特殊操作的Type任务。我在考虑为每个Controller创建一个新的Task。与MySpecialTask1ControllerMySpecialTask2Controller和我的主TaskController一样,我会重定向到另一个控制器。

问题是1)我不知道该怎么做,2)我不知道这是否是最好的方法。

也许这个问题可以通过Dingo / Lumen提供的服务或其他工具来解决。也许有人可以帮我解决这个问题。

1 个答案:

答案 0 :(得分:0)

我不打扰每个任务的控制器,我宁愿去一个处理它的服务类,并在TaskController中调用。

服务类将有一个公共的handle()方法(或找到一个更好的名称),它将采用1个参数(基于你所描述的)。该参数将是您需要执行的任务类型。

我会有另一个受保护的方法,它将根据您提供的类型具有查找表,它将调用相应的类并在该类中执行该方法。

这也称为多态性。

代码示例:

class TaskController extends Controller 
{
    protected $taskService;

    public __construct(TaskService $taskService)
    {
        $this->taskService = $taskService; 
    }

    public function someMethod()
    {
        // determine the type of task and then
        $this->taskService->handle($type)
    }
}

class TaskService 
{
    public function handle($type)
    {
        $this->doTask($type);
    }

    protected function doTask($type) 
    {
        // the lookup table
        $tasks = [
           'crazy' => new CrazyTask(),
           'insane' => new InsaneTask(),
           'hard' => new HardTask(), 
           'easy' => new EasyTasK()
       ];

       foreach($tasks as $taskType => $task)
       {
           if($taskType === $type) {
              return $task->do();
           }

       }
    }
}

此代码应该让您了解如何使用此设计模式解决问题(我现在无法想到这个名称)。