たとえば、特定のハッシュコードを計算するアルゴリズム関数があります。関数自体は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コンテナを認識する必要があります。このために、次のようなセクション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の本をお読みください。それらのリンクもチェックしてください
それが役に立てば幸い。
よろしく、
マット
コメントのブライアンはSymfony3の答えを求めたので、ここに1つの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
}
}
# app/config/services.yml
services:
_defaults: autowire # this enabled constructor autowiring for all registered services
Acme\AcmeBundle\Helper\AlgorithmicHelper: ~
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つの投稿で読むことができます。