0

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

我有一个连接到 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 提供的服务或其他工具来解决。也许有人可以帮助我解决这个问题。

4

1 回答 1

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();
           }

       }
    }
}

这段代码应该让您了解如何使用这种设计模式解决您的问题(我现在想不出名字)。

于 2016-06-08T17:59:14.040 回答