什么是Symfony中的存储库,容器和服务

时间:2014-08-14 13:24:15

标签: php symfony

我正在学习如何使用Symfony 2.5。但我有一些问题,我找不到答案。也许他们只与Symfony有关,但我不知道。 什么是:

  • 存储库(或存储库类)
  • 容器
  • 服务

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

以下是简要概述。文档更加详细,学习它的最佳方式是阅读文档并浏览一个从头到尾构建网站的教程。

假设您有一个名为Product的实体。这将是php中的一个对象,也是数据库中的一个表。表中的每一行都是一个单独的产品,您可以在实体php文件中定义它,如下所示:

<?php
// src/Company/ProductBundle/Entity/Product.php

namespace Company\ProductBundle\Entity;

/**
 * @ORM\Entity(repositoryClass="Company\ProductBundle\Entity\ProductRepository")
 */
class Product
{
    /**
    * @ORM\Column(type="integer")
    * @ORM\Id
    * @ORM\GeneratedValue(strategy="AUTO")
    */
    protected $id;

    /**
    * @ORM\Column(type="string", length=50)
    */
    protected $type;

    /**
    * @ORM\Column(type="string", length=20)
    */
    protected $color;
}

存储库 - 这是实体文件夹的子文件夹的命名约定,它将保存与特定实体相关的查询。每个实体都有一个存储库。存储库定义为:

// src/Company/ProductBundle/Entity/Repository/ProductRepository.php
namespace Company\ProductBundle\Entity\Repository;

use Doctrine\ORM\EntityRepository;

class ProductRepository extends EntityRepository
{
    public function findProductByColor($args)
    {
        $color = $args['color'];

        $qb = $this->createQueryBuilder('p')
              ->orderBy('p.type', 'ASC')
              ->where('p.color = ?1')
              ->setParameter(1, $color);

        return $qb->->getQuery()->getResult();
    }
}

可以使用实体管理器在控制器中调用它:

$result = $em->getRepository('AcmeBundle:Product')->
    findProductByColor(array('color' => $color);

这个问题是在控制器中创建批量,因为您需要定义实体管理器并且可能导致控制器中的更多操作,并且还需要在控制器中包含实体的“使用”行。这就是服务的来源。

服务 - 在上面的示例中,您需要使用控制器中的实体管理器来加载特定的Product集合,这不是首选方法。业务逻辑不应该驻留在控制器中,这就是服务变得更受欢迎的原因。服务是创建php对象的全局方式。

创建服务后,您可以通过在控制器中使用类似的东西进行简单调用,或者需要访问此实体的任何其他文件来调用它:

$redproducts = $$this->get('products_red');

要创建服务,请查看symfony docs here

容器 - 我认为您指的是服务容器或依赖注入容器,也称为DIC。它是Symfony中的一个特殊对象,它管理应用程序内部服务的实例化。只有一个,所有服务都在其中。您不会创建容器,特别是如果您是新的并且不创建其他将使用的包。详细了解service container here

相关问题