data_provider サービスを使用する Symfony コントローラーがあります。このサービスを初期化する方法がわかりません。
私は試した:
class DefaultController extends Controller {
public $dataProvider=$this->get('data_provider');
これによりエラーが発生し、コントローラーでコンストラクターを使用できないため、次のようになります。
public $dataProvider=false;
public function someAction(){
$this->dataProvider=$this->get('data_provider');
...
public function anotherAction(){
$this->dataProvider=$this->get('data_provider');
...
そのため、コントローラーのアクション関数で毎回設定する必要があります。コントローラーの作成時に dataProvider を初期化する簡単な方法はありますか?
サービスはこのバンドル専用であるため、Symfony/src/mmt/myBundle/Resources/config/services.yml で定義され、そのファイルは Symfony/src/mmt/myBundle/DependencyInjection/myExtension.php によってロードされます。それが違いを生むかどうかはわかりませんが、バンドル外のファイルを変更する必要がないものを好むでしょう。
symfony 2.3.4 の使用
[アップデート]
それを機能させるために必要なことの半分以下をカバーする、一見終わりのない指示のリストの後、私は注入部分を機能させました。素晴らしいアドバイスをくれた皆さんに感謝します。
私のサービスは私のバンドルの一部であり、バンドルの外部で構成ファイルを変更してロードしたくありません。Symfony/src/mmt/mrBundle/Resources/config/services.yml が読み込まれるようにするには、Symfony/src/mmt/mrBundle/DependencyInjection/mmtmrExtension.php というファイルが必要です (いいえ、任意の名前を使用しないでくださいアプリケーションとバンドル名に関連する php ファイル)。
そのファイルの内容はこちらで説明されています。バンドルを作成したときに作成され、ほとんどのファイルが作成されるため、そこで何もする必要はありませんでした。(バンドルの作成は標準ドキュメントにあります)
2.
services.yml ファイルに data_provider サービスを追加しました: (Doctrine を使用したデータベースのセットアップに関する標準ドキュメントをお読みください)
data_provider:
class: mmt\mrBundle\Services\dataProvider
arguments: [ @doctrine.orm.entity_manager ]
内容: symfony/src/mmt/mrBundle/Services/dataProvider.php
<?php
namespace mmt\mrBundle\Services;
class dataProvider
{
protected $em;
public function __construct($em){
$this->em = $em;
}
public function getItem($id){
$item = $this->em->getRepository('mmtmrBundle:Item')
->find($id);
return $item;
}
public function saveItem($item){
$this->em->persist($item);
$this->em->flush();
}
}
?>
サービスができたので、次のようにコントローラーで使用できます。
$this->get("data_provider")->getItem(22);
しかし、DefaultController が作成されたときに、DefaultController に $this->dataProvider が必要です。できれば、dev、prod、および test に応じて 1 つ。
依存性注入が登場します。以下を Symfony/src/mmt/mrBundle/Resources/config/services.yml に追加します
mmt.mr.DefaultController:
class: mmt\mrBundle\Controller\DefaultController
arguments: [@data_provider]
calls:
- [ "setContainer", [ @service_container ] ]
ルートで mmt.mr.DefaultController:indexAction を使用します (mmtmrBundle:Default:index は使用しないでください)。
/var/www/html/Symfony/src/mmt/mrBundle/Resources/config/routing.yml
mmtmr_homepage:
path: /{id}
requirements:
id: \d+
defaults: { _controller: mmt.mr.DefaultController:indexAction, id: false }
Symfony/src/mmt/mrBundle/Controller/DefaultController.php では、次のようになります。
<?php
namespace mmt\mrBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Session\Session;
class DefaultController extends Controller {
public $dataProvider;
public function __construct($data_provider){
$this->dataProvider = $data_provider;
}
public function indexAction($id) {
$item=$this->dataProvider->getItem($id);
return $this->render('mmtmrBundle:Default:index.html.twig',
array('item' => $item));
}
}
?>
これでおしまいだと思います。不足している点がありましたらお知らせください。おめでとうございます。依存関係を注入する方法がわかりました (まだ行っていない場合)。悪いニュースは、これを読む頃にはおそらく時代遅れであり、Symfony サイトに行かなければならないということです。ドキュメントは優れていますが、私にとってそれを壊したことについては言及していません。