2013-03-30 5 views
0

Я создаю расширение Twig и активирую его с помощью сервиса. Все работает отлично, за исключением того, что я пытаюсь просто использовать другой класс из моего расширения Twig.Невозможно переопределить класс в Symfony2 Расширение 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. 

ответ

2

Вы должны сделать свой 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. 
    } 
+0

Привет, спасибо, единственное, как сделать Я передаю параметры новому классу, как обычно в PHP, я бы использовал: new NewClass ($ param1, $ param2) и т. Д. - все параметры взяты из запроса класс. – user2143356

+0

Вы можете отправить запрос в NewClass, чтобы получить параметры. Я обновил свой ответ для этого. Кажется не идеальным. Зачем вам нужен запрос на расширение ветки? Тогда может быть больше смысла. – qooplmao