0

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 の使用

[アップデート]

それを機能させるために必要なことの半分以下をカバーする、一見終わりのない指示のリストの後、私は注入部分を機能させました。素晴らしいアドバイスをくれた皆さんに感謝します。

  1. 私のサービスは私のバンドルの一部であり、バンドルの外部で構成ファイルを変更してロードしたくありません。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 サイトに行かなければならないということです。ドキュメントは優れていますが、私にとってそれを壊したことについては言及していません。

4

3 に答える 3

0

依存性注入を使用した後、 $data_provider をコントローラーに正しく指定する必要があるため、次の場合に使用しないのはなぜですか。

public function dataInit($data_provider){
  $logger = $this->get('logger');
  $logger->notice('from dataInit so this works');
}

多分それはそうでなければなりません:

public function dataInit($data_provider){
  $logger = $data_provider->getLogger();
  $logger->notice('from dataInit so this works');
}

いいえの場合は、dataProvider クラスを貼り付けてください

于 2013-09-16T10:27:16.767 に答える