03.06 仓库

    顾名思义,代码仓库就是存放(通常是通用的)代码的地方。在SF中,一般用来堆放进行数据库操作的代码。

    SF为什么要增加这么一个额外的层?有两个原因:

    • 虽然一个实体提供了一些基本的数据库操作,如之类的,但是肯定不能满足我们定制搜索的需要;
    • 如上的这个要求既不应该是Model的任务,更不应该是Controller的任务(不符合DRY和代码重用原则)。
      所以,我们有必要加入一个新的层,形成这样的一个关系图:
    • Controller只提出我要什么数据;
    • Repository只负责选择数据;

    我们来看一个典型的仓库的代码:

    getStatusIn方法会提供在开始和结束期间的数据,缺省是提供4个。显然,这个数据的提供(搜索)不是简单地由findBy之类的实体方法可以完成的。

    对其的调用在Controller中一般这样进行:

    1. public function indexAction()
    2. {
    3. $em = $this->getDoctrine()->getManager();
    4. $day = $repo->getStatusIn('P0D', 'P1D', 5);
    5. $week = $repo->getStatusIn('P1D', 'P7D');
    6. $month = $repo->getStatusIn('P7D', 'P1M', 5);

    这几乎是一个标准的调用模式。