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

Lumen/Dingo/Laravel Getting to the correct controller

我知道这是一种罪过,但我没有任何代码可以展示,只是我完全碰壁了。我的问题如下。

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

我的路线:

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

与此相结合,我有一个 ContactController 并且在内部我有一个 get 函数可以 returns 响应。这里没问题。

现在出现以下问题

我有一条路线有任务:

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

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

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

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

我不会为每个任务都使用控制器,我宁愿选择一个服务 class 来处理它并在 TaskController 中调用。

服务 class 将有一个 public handle() 方法(或为它找到一个更好的名称),它将采用 1 个参数(根据您的描述)。该参数将是您需要执行的任务类型。

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

这也叫多态。

代码示例:

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

       }
    }
}

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