[英]Lumen/Dingo/Laravel Getting to the correct controller
我知道这是一种罪过,但是我没有任何代码可显示,只是我完全碰到了砖墙。 我的问题如下。
我有一个连接到Lumen / Dingo Api的客户端。 对于所有请求,它都很棒。 例如:
我的路线:
$api->get('contact', 'ContactController@get');
与此结合的是,我有一个ContactController
,在里面有一个返回响应的get
函数。 没问题
现在出现以下问题 :
我有一条执行任务的路线:
$api->get('task/{id}', 'TaskController@get');
问题在于,系统中并非所有Tasks
都是相同的。 根据任务Type
,我要执行特殊操作。 我正在考虑为每个Task
创建一个新的Controller
。 像MySpecialTask1Controller
, MySpecialTask2Controller
一样,我从主TaskController
重定向到另一个控制器。
问题是1)我不知道如何执行此操作,以及2)我不知道这是否是执行此操作的最佳方法。
也许可以使用Dingo / Lumen提供的服务或其他工具解决此问题。 也许有人可以帮我解决这个问题。
我不会为每个任务而烦恼控制器,而宁愿选择一个处理该问题并在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();
}
}
}
}
这段代码应该使您了解如何使用此设计模式解决问题(我现在无法想到这个名称)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.