我知道这是一种罪恶,但我没有任何代码可以显示,只是我完全碰到了一堵砖墙。我的问题如下。
我有一个连接到Lumen / Dingo Api的客户端。对于所有的要求,它很有效。例如:
我的路线:
$api->get('contact', 'ContactController@get');
加上这个我有一个ContactController
,里面我有一个get
函数返回一个响应。这里没问题。
现在出现以下问题:
我有一条包含任务的路线:
$api->get('task/{id}', 'TaskController@get');
问题是在系统中并非所有Tasks
都相同。取决于我想要执行特殊操作的Type
任务。我在考虑为每个Controller
创建一个新的Task
。与MySpecialTask1Controller
,MySpecialTask2Controller
和我的主TaskController
一样,我会重定向到另一个控制器。
问题是1)我不知道该怎么做,2)我不知道这是否是最好的方法。
也许这个问题可以通过Dingo / Lumen提供的服务或其他工具来解决。也许有人可以帮我解决这个问题。
答案 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();
}
}
}
}
此代码应该让您了解如何使用此设计模式解决问题(我现在无法想到这个名称)。