Php 什么是确保通用搜索查询中正确子类的策略?
这是一个概括的场景。我有“任务”和“任务事件”,我已经为每个任务创建了一个数据库表。我还创建了一个模型,用于处理从数据库中获取记录 对于“任务事件”,我有几种类型:创建、接受、注释和关闭 目前,我做了一些简单的事情,比如Php 什么是确保通用搜索查询中正确子类的策略?,php,mysql,oop,design-patterns,Php,Mysql,Oop,Design Patterns,这是一个概括的场景。我有“任务”和“任务事件”,我已经为每个任务创建了一个数据库表。我还创建了一个模型,用于处理从数据库中获取记录 对于“任务事件”,我有几种类型:创建、接受、注释和关闭 目前,我做了一些简单的事情,比如$task=newtask($task\u id)从数据库中获取任务,并且$task\u events=新任务\u events($task\u id)它捕获该任务的事件。然后,我实现了迭代器,这样我就可以做foreach($e){…}这一切都很好 但是,我发现对于一些事件类型,
$task=newtask($task\u id)
从数据库中获取任务,并且$task\u events=新任务\u events($task\u id)代码>它捕获该任务的事件。然后,我实现了迭代器,这样我就可以做foreach($e){…}
这一切都很好
但是,我发现对于一些事件类型,我需要一些专门的处理程序。例如,我创建了Tasks\u Events\u Comments,它扩展了Tasks\u Events,并对注释事件类型进行了一些额外的处理。我现在意识到,当我收集事件集合时,我真的需要它们是子类型,因此,如果对事件调用方法,则会调用子类型的正确重写
下面是一个简单的例子:
class Model {
public function __construct($search = null) {
// Hypothetical example, basically query the DB and populate data.
if (!is_null($search)) { $this->search($search); }
}
protected function onAfterUpdate() { }
}
class Tasks_Events extends Model {
protected function onAfterUpdate() { /* Task Event Specific */ }
}
class Tasks_Events_Comments extends Tasks_Events {
protected function onAfterUpdate() { /* Task Event Comment Specific */ }
}
然后,假设一个用例:
class Controller {
public function updateEvent($task_id, $event_id, $params) {
$task = new Tasks($task_id);
$task_event = new Tasks_Events($event_id);
// Some Analysis of Params
$task_event->status = $new_status;
$task_event->save();
}
}
这是关键。这样做将在AfterUpdate()上调用任务\事件
我的问题是,我可以使用什么样的模型、范式、哲学和方法,这样当我有一组任务事件,并且我对其中一个事件执行操作时,即使我使用基类引用,我也需要调用子类函数
我真的很享受$e=新任务\u事件(3)的简单性$e->status=4$e->save()代码>我有一个我不喜欢的解决方案,就是做一些类似于$e=Tasks\u Events::Get($id)代码>任务\事件将在其中查询数据库,确定类型,然后执行“切换”并创建要返回的正确类型
我不喜欢这一点的另一个原因是,我建立了一个模型来做一些很酷的事情,比如$tasks=newtasks(数组('user\u id'=>5,'status'=>tasks::status\u OPEN))
将构建正确的db查询,并填充用户5打开的所有任务。然后我可以做foreach($t任务){echo$t->subject;}
等等。所以,我希望能够保持这种系统。。。。但是如果我想利用子类型的继承,我不确定是否可以
恐怕我需要一个工厂模式,但我希望我可能遗漏了一些东西
如果你能想出一个更好的标题,请随意更改。谢谢@Sam Dufel,你的评论让我思考得更深,我意识到我的设计中存在一个重大缺陷
您对$task->getEvents()提出了一个很好的建议,但我忘记了问题中的一个关键(缺陷?)。这也可能是我陷入麻烦的原因
基本上,我实现迭代器和getter/setter的方式可能是问题的根源。因为它在原始记录数组上迭代
然后,假设我在迭代器中的位置2。调用$item->status,调用u get($name),检查$this->记录[$this->位置][$name]
!!所以,正如你所看到的,我把自己画进了一个角落。即使使用工厂模式,这也不太管用,因为我在Tasks_Events(嗯……模型)argh中实现迭代器的方式
对不起打扰你们了。谢谢你的想法
更新:我意识到我所做的是将一个“DAO”与一个“模型”结合起来,实际上是一个“模型集合”。我要把它们分开。DAO->find()将返回一个模型集合(可编辑),DAO->findOne()将返回一个模型。三合一很方便,但随着我需求的扩展,它的可扩展性不强。当你调用一个类的构造函数时,你总是会得到该类的一个实例。没有办法,你需要某种工厂方法。有什么原因不能直接实现$task->getEvents()
?