在Symfony2+Propel中自动加载一个简单的DAO


Autoload a simple DAO in Symfony2+Propel

我一直在做一个项目,我决定最好有一些DAO,但要简化。

基本上,我唯一想做的事情(至少现在)是通过模型名称和id为我获取对象。我写了一段非常简单的代码:

class DAO {
  public static function get($className,$id) {
    $queryName = $className."Query";
    if (!class_exists($className) || !class_exists($queryName)) {
        return false;
    }       
    $q = $queryName::create()->filterByID($id)->find();
    return $q;
}
}

然而,我发现自己一直在执行。我想我需要以某种方式自动加载它,这样它就可以检查类的存在,这样我就可以在应用程序中的任何地方使用它,但我不知道怎么做。有人能帮我吗?或者,如果有更好的方法,我将感谢任何意见。

您要找的是Service

文件定义:

简单地说,服务是任何执行某种"全局"任务。这是一个专门用于计算机的通用名称描述为特定目的而创造的物体的科学(例如发送电子邮件)。每项服务都在您的应用程序,只要您需要它提供的特定功能。

将您的类定义为服务就这么简单:

app/config/config.yml

...
services:
    my_dao:
        class:        Your'Bundle'DAO
...

现在,您可以在控制器中访问DAO,这样做:

$dao = $this->get('my_dao');

当你进行这个调用时,Service Container将创建你的类的一个实例并返回它。永远最多只有一个实例(singleton),如果它从未被调用,它甚至不会被实例化。

我建议阅读文档。

意见

你似乎很难适应Symfony的方式

如果你看一下The Book,你会发现Entity Manager和你实体的Repository处理了DAO传统上的大部分功能。换句话说,实际上不需要DAO类。

例如,通过id获取任何对象就像一样简单

$om->getRepository('YourBundle:YourModel')->find($id);

不管怎样,如果你特别喜欢这种方法,你可能想试试这个项目。