簡體   English   中英

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就在服務的下方。 例如,它用於在控制器中檢索您的服務。 之后,指定服務的類,然后指定傳遞給類的構造函數的參數。 @ notation表示傳遞對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月發布):

原來的班級保持不變

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

您可以在以下兩篇文章中閱讀有關Symfony 3.3依賴注入(在這種情況下在配置中注冊服務並在控制器中使用它)的新聞:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM