21

例如我有算法函数,它计算特定的哈希码。函数本身是 300 多行代码。我需要在捆绑包中的许多不同控制器中多次使用该功能。我在哪里可以存放我calculate_hash()的捆绑包中使用它?我可以从其他捆绑包中访问它吗?我也可以编写calculate_hash()可以访问实体管理器的全局吗?

在这里没有找到我的答案。

4

2 回答 2

43

在 Symfony2 的世界里,这显然属于一种服务。服务实际上是绑定到依赖注入容器的普通类。您可以向它们注入您需要的依赖项。例如,假设函数所在的类calculate_hashAlgorithmicHelper. 该服务具有“全局”功能。你定义你的类是这样的:

namespace Acme\AcmeBundle\Helper;

// Correct use statements here ...

class AlgorithmicHelper {

    private $entityManager;

    public function __construct(EntityManager $entityManager) {
        $this->entityManager = $entityManager;
    }

    public function calculate_hash() {
        // Do what you need, $this->entityManager holds a reference to your entity manager
    }
}

然后需要让这个类知道 symfony 依赖容器。为此,您可以app/config/config.yml通过添加service如下部分在文件中定义您的服务:

services:
  acme.helper.algorithmic:
    class: Acme\AcmeBundle\Helper\AlgorithmicHelper
    arguments:
      entityManager: "@doctrine.orm.entity_manager"

就在服务下方,是服务 ID。例如,它用于在控制器中检索您的服务。之后,您指定服务的类,然后指定要传递给类的构造函数的参数。该@符号表示通过 id 传递对服务的引用doctrine.orm.entity_manager

然后,在您的控制器中,您执行以下操作来检索服务并使用它:

$helper = $this->get('acme.helper.algorithmic');
$helper-> calculate_hash();

请注意,调用的结果$this->get('acme.helper.algorithmic')将始终返回相同的帮助程序实例。这意味着,默认情况下,服务是唯一的。这就像有一个单例课程。

有关更多详细信息,我邀请您阅读 Symfony2。还要检查这些链接

  1. Symfony2 书中的服务容器部分
  2. 我在此处给出了关于在控制器外部访问服务的答案。

希望能帮助到你。

问候,
马特

于 2012-04-26T15:33:56.340 回答
0

Braian 在评论中询问 Symfony 3 的答案,所以这里有一个Symfony 3.3(2017 年 5 月发布):

1.原来的类保持不变

namespace Acme\AcmeBundle\Helper;

use Doctrine\ORM\EntityManager;

final class AlgorithmicHelper
{
    /**
     * @var EntityManager
     */
    private $entityManager;

    public function __construct(EntityManager $entityManager)
    {
        $this->entityManager = $entityManager;
    }

    public function calculateHash()
    {
        // Do what you need, $this->entityManager holds a reference to your entity manager
    }
}

2.服务注册要简单得多

# app/config/services.yml
services:
    _defaults: autowire # this enabled constructor autowiring for all registered services

    Acme\AcmeBundle\Helper\AlgorithmicHelper: ~

3.使用构造函数注入获取服务

use Acme\AcmeBundle\Helper\AlgorithmicHelper;

class SomeController
{
    /**
     * @var AlgorithmicHelper
     */
    private $algorithmicHelper;

    public function __construct(AlgorithmicHelper $algorithmicHelper)  
    {
        $this->algorithmicHelper = $algorithmicHelper;
    }

    public function someAction()
    {
        // some code
        $hash = $this->algorithmicHelper->calculateHash();
        // some code
    }
}

您可以在以下 2 篇文章中阅读有关 Symfony 3.3 依赖注入(在这种情况下在配置中注册服务并在控制器中使用它)的新闻:

于 2017-08-20T21:32:43.253 回答