0

Twig 拡張機能を作成し、サービスでアクティブ化しています。Twig 拡張機能から別のクラスを単純に使用しようとしていることを除いて、すべてがうまく機能します。

アイデアは、新しいクラスをインスタンス化し、必要に応じて使用することです。次のエラーが発生するため、インスタンス化は問題です。

Error: Cannot redeclare class NewClass in .../Bundle/NewClass.php line 13

確かに一度インスタンス化します。なぜこうなった?

namespace Bundle\Twig;

use Bundle\NewClass;

class NewExtension extends \Twig_Extension
{

    private $request;
    private $new_class;

    public function __construct($container) {

        //get the Request object   
        $this->request = $container->get('request');

        //instantiate new class
        $this->new_class = new NewClass();  // this part triggers the error

    }

    ///etc.
4

1 に答える 1

2

をサービスにしてから、それとサービスをコンテナではなく twig 拡張機能にNewClass注入する必要があります。@requestコンテナに直接注入するのは明らかに悪い考えです。

たとえば、サービスで..

services:
    # create new class as a instantiated service
    acme_demo.new_class:
        class: Acme\DemoBundle\NewClass
        arguments: [ '@request' ]

    acme_demo.twig.acme_extension:
        class: Acme\DemoBundle\Twig\AcmeExtension
        arguments: [ '@request', '@acme_demo.new_class' ]
            # inject the Request service and your class from above
        tags:
            - { name: twig.extension }

そして、Twig エクステンションで

namespace Bundle\Twig;

use Bundle\NewClass;

class NewExtension extends \Twig_Extension
{
    private $new_class;

    public function __construct(NewClass $newClass) {
        $this->new_class = $newClass;
    }

    ///etc.

あなたの NewClass で:

namespace Bundle;

class NewClass
{
    private $param1;
    private $param2;

    public function __construct(Request $request)
    {
        $this->param1 = $request->get('param1');
        $this->param2 = $request->get('param2');

        // You could also add some check in here to make sure they are valid.
    }
于 2013-03-30T11:06:39.880 に答える