Symfony2全局功能

时间:2012-04-26 15:19:00

标签: php symfony

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

未找到我的回答here

2 个答案:

答案 0 :(得分:42)

在Symfony2世界中,这显然属于服务。事实上,服务是与依赖注入容器绑定的普通类。您可以为它们注入所需的依赖项。例如,假设函数calculate_hash所在的类是AlgorithmicHelper。该服务拥有“全球”功能。你定义了这样的类:

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 dependecy容器。为此,您可以通过添加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 book。检查这些链接

  1. 来自Symfony2的服务容器section
  2. 我在控制室外访问服务时给出的答案,here
  3. 希望它有所帮助。

    的问候,
    马特

答案 1 :(得分: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。服务注册is much simpler

# 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
    }
}

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