のサービス(依存関係)を得るか、私はどのように私はそれを行うことができ、はどのように私は、コントローラでカスタムクラス
$this->get('service.name')
しかし、カスタムクラスでの操作を行うことができますか?
のサービス(依存関係)を得るか、私はどのように私はそれを行うことができ、はどのように私は、コントローラでカスタムクラス
$this->get('service.name')
しかし、カスタムクラスでの操作を行うことができますか?
カスタムクラスをサービスとして定義し、依存関係を注入します。
例:
// services.yml
services:
my.custom.service.id:
class: My\Custom\Class
arguments:
- @service.name
- @doctrine.orm.entity_manager
カスタムクラスのコンストラクタは、引数として、これらのサービスになるだろう。
公式ドキュメントのサービスコンテナを必ずお読みください。それはすべてこのことを非常に詳しく説明しています。
OK私は@Arms答えは可能な解決策ですが、私はController
にソースを見ることで見つけ、私はあなたがContainerAwareと正しい軌道に乗っていたContainerAware
を延長する可能性があるとします。
$this->get('id')
は、実際には$this->container->get('id')
へのショートカットです。そして、あなたのクラスにコンテナを取得することはContainerAwareInterface
を実装するのと同じくらい簡単です - あなたのクラスにこのスニペットを置く:
public function setContainer(\Symfony\Component\DependencyInjection\ContainerInterface $container = null)
{
$this->container = $container;
}
誰にでも-1を置く:私は本当になぜ私の答えが間違っていると答え、正解は何だと思いますか?質問は基本的には「サービスコンテナをカスタムクラスに挿入する方法は?」ということに留意してください。 – Inoryy
私はdownvoted人ではありませんが、元の質問は、(悪い習慣と考えられている)サービスコンテナを注入する方法ではなく、カスタムクラスのサービスにアクセスする方法でした。 –
彼はカスタムどのように特定のサービスを注入するかではなく、彼はコントローラからの例を与えて、行動を再現する方法を探していました。事実上状況が悪いので、完全に正しい答えを下降させることは非常に間違っています。なぜなら、我々は完全なユースケースを決めていないからです。だから私はそれが-1の背後にある理由ではないことを本当に願っています。 – Inoryy
あなたはサービスが作成されたとき、あなたは、現時点では必要な依存関係の完全なリストがわからない場合、あなた(ないサービス定義されたクラスで)カスタムクラスにサービスコンテナへのアクセス引数http://symfony.com/doc/current/book/service_container.html#using-the-expression-language
services:
service_name:
class: AppBundle\Class
arguments: ['@=container']
これを行うためのベストプラクティスではありませんが、それが動作するように、容器を渡すことができます。カスタムクラスがサービスになるように設定されていないなら、あなたはグローバル変数$カーネルを使用してサービスコンテナにアクセスすることができます。
class Helper {
private $container;
/**
* Constructor assigns service container to private container.
*/
public function __construct() {
global $kernel;
$this->container = $kernel->getContainer();
}
function doSOmething() {
$someService = $this->container->get('service.name');
// do something with someService ...
}
}
は、あなたが 'ContainerAware'を拡張する場合は、手動でコンテナオブジェクトを設定する必要があることに注意してください。コンテナにアクセスできないカスタムクラスをインスタンス化している場合、これはできません。 –
容器全体を注入するのは悪い考えです。あなたのサービスに必要な各サービスを明示的に注入します。 –