21

たとえば、特定のハッシュコードを計算するアルゴリズム関数があります。関数自体は300行以上のコードです。バンドル内のさまざまなコントローラーでその機能を何度も使用する必要があります。calculate_hash()バンドルで使用するためにどこに保存できますか?他のバンドルからアクセスできますか?エンティティマネージャーcalculate_hash()にアクセスできるグローバルを作成することもできますか?

ここで私の答えが見つかりませんでした。

4

2 に答える 2

43

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();

toの呼び出しの結果は、$this->get('acme.helper.algorithmic')常にヘルパーの同じインスタンスを返すことに注意してください。これは、デフォルトで、サービスが一意であることを意味します。シングルトンクラスを持っているようなものです。

詳細については、Symfony2のをお読みください。それらのリンクもチェックしてください

  1. Symfony2ブックのサービスコンテナセクション。
  2. コントローラーの外部でサービスにアクセスする際に私が出した答えは、ここにあります。

それが役に立てば幸い。

よろしく、
マット

于 2012-04-26T15:33:56.340 に答える
0

コメントのブライアンはSymfony3の答えを求めたので、ここに1つの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
    }
}

Symfony 3.3の依存性注入(この場合はconfigにサービスを登録し、コントローラーで使用する)のニュースについては、次の2つの投稿で読むことができます。

于 2017-08-20T21:32:43.253 に答える