2017-06-15 19 views
2

私のアプリケーションをSymfony 2.8からSymfony 3.3に移行しています。私はこれを持って私のコントローラ内部からSymfony 3:コントローラの中からコンテナにアクセスできない

public function indexAction() 
{ 
    $email = new Email(); 

    $form = $this->createForm(GetStartedType::class, $email, [ 
     'action' => $this->generateUrl('get_started_end'), 
     'method' => 'POST', 
    ]); 

    return [ 
     'form' => $form->createView(), 
    ]; 
} 

しかし、私はこの例外受け取る:メンバ関数得るために

コール()はnull

私の上をコントローラー延長Symfony\Bundle\FrameworkBundle\Controller\Controller

/** 
* {@inheritdoc} 
*/ 
class DefaultController extends Controller 
{ 
... 
} 

私はコンテナにアクセスできます。

namespace Symfony\Component\DependencyInjection; 

/** 
* ContainerAware trait. 
* 
* @author Fabien Potencier <[email protected]> 
*/ 
trait ContainerAwareTrait 
{ 
    /** 
    * @var ContainerInterface 
    */ 
    protected $container; 

    /** 
    * Sets the container. 
    * 
    * @param ContainerInterface|null $container A ContainerInterface instance or null 
    */ 
    public function setContainer(ContainerInterface $container = null) 
    { 
     dump('Here in the ContainerAwareTrait'); 
     dump(null === $container); 
     $this->container = $container; 
    } 
} 

これは

Here in the ContainerAwareTrait 
false 

だから、オートワイヤリングがうまく機能し、容器をセットをダンプ:symfonyのコードで周りのいくつかのダンプを置く

は、私は、コンテナが正しく設定されていることがわかります。

しかしControllerTrait

私はこれを持っている。だからここ

Here in the ControllerTrait 
true 

containernullであり、これはエラーの原因:

trait ControllerTrait 
{ 
    /** 
    * Generates a URL from the given parameters. 
    * 
    * @param string $route   The name of the route 
    * @param mixed $parameters An array of parameters 
    * @param int $referenceType The type of reference (one of the constants in UrlGeneratorInterface) 
    * 
    * @return string The generated URL 
    * 
    * @see UrlGeneratorInterface 
    */ 
    protected function generateUrl($route, $parameters = array(), $referenceType = UrlGeneratorInterface::ABSOLUTE_PATH) 
    { 
     dump('Here in the ControllerTrait'); 
     die(dump(null === $this->container)); 
     return $this->container->get('router')->generate($route, $parameters, $referenceType); 
    } 

    ... 

これはダンプです。

誰でもこの問題を解決できますか?

なぜcontainerがヌルですか?

役立つ可能性がある場合、これはservices.yml設定(symfonyでcamesデフォルト):

# controllers are imported separately to make sure they're public 
# and have a tag that allows actions to type-hint services 
AppBundle\Controller\: 
    resource: '../../src/AppBundle/Controller' 
    public: true 
    tags: ['controller.service_arguments'] 

この質問はSymfony's issue tracker上の問題として掲載されています。

+0

私は新しいオートワイヤコントローラのもので遊ぶ機会がありませんでした。ちょうどキックのために、[[setContainer、['@service_container']]]をservices.ymlに追加してみてください。必要ではありません。 – Cerad

+0

可能な重複:[Symfonyコントローラがコンテナにアクセスできない](https://stackoverflow.com/questions/44446763/symfony-controller-unable-to-access-container)? – ccKep

+0

symfony 3.3の一部を上書きする古いパッケージがある場合に備えて、 'composer.json'を質問に追加したいかもしれません。 – ccKep

答えて

0

S3.3オートワイヤ機能により、コントローラーをサービスとして定義するのが少し楽になります。

コントローラをサービスとして定義することの背後にある通常の動機は、コンテナの注入を避けることです。つまり、コントローラが使用する各サービスを明示的に注入する必要があります。 autowire機能により、アクションメソッドインジェクションを使用できるので、コンストラクタにたくさんのものを注入する必要はありません。

しかし、基本的なSymfonyコントローラクラスは、約12の異なるサービスを使用するいくつかのヘルパー関数を提供します。これらを一度に注入するのは本当に痛いでしょう。私はautowire機能があなたのためにこれを扱うかもしれないと思っていましたが、そうは思わないでしょう。

基本的には、サービス定義でsetContainerの呼び出しを追加する必要があります。ような何か:これは、3.4/4.0のために変更した場合、私は驚かないよう

AppBundle\Controller\: 
    resource: '../../src/AppBundle/Controller' 
    public: true 
    [[setContainer, ['@service_container']]] 
    tags: ['controller.service_arguments'] 

autowire機能は非常に進行中の作業です。

0

この問題はPR #23239で修正され、Symfony 3.3.3に関連しています。

+0

はい、私はまだそれを確認していません...私がするとき私はこれを最善の答えとしてマークします...ありがとう! – Aerendir

関連する問題