Symfony2 全局函数


Symfony2 global functions

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

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

在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容器。为此,您可以通过添加如下所示的service部分来定义app/config/config.yml文件中的服务:

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. 我在这里给出了关于在控制器外部访问服务的答案。

希望对您有所帮助。

问候
马 特

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依赖注入(在这种情况下在配置中注册服务并在控制器中使用它(新闻:

  • https://www.tomasvotruba.cz/blog/2017/05/07/how-to-refactor-to-new-dependency-injection-features-in-symfony-3-3/
  • https://symfony.com/blog/the-new-symfony-3-3-service-configuration-changes-explained