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
。像 MySpecialTask1Controller
、MySpecialTask2Controller
和我的主 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();
}
}
}
}
这段代码应该能让您了解如何使用这种设计模式解决您的问题(我现在想不出名字)。
我知道这是一种罪过,但我没有任何代码可以展示,只是我完全碰壁了。我的问题如下。
我有一个连接到 Lumen/Dingo Api 的客户端。对于所有请求,它都很好用。例如:
我的路线:
$api->get('contact', 'ContactController@get');
与此相结合,我有一个 ContactController
并且在内部我有一个 get
函数可以 returns 响应。这里没问题。
现在出现以下问题:
我有一条路线有任务:
$api->get('task/{id}', 'TaskController@get');
问题是在系统中并非所有 Tasks
都是相同的。根据 Type
任务,我想执行特殊操作。我正在考虑为每个 Task
创建一个新的 Controller
。像 MySpecialTask1Controller
、MySpecialTask2Controller
和我的主 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();
}
}
}
}
这段代码应该能让您了解如何使用这种设计模式解决您的问题(我现在想不出名字)。