2013-03-30 35 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 } 

,然後在枝條延長

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)等 - 所有參數都來自Request類。 – user2143356

+0

您可以將請求發送到NewClass以獲取參數。我已經更新了我的答案。雖然看起來並不理想。你爲什麼需要在你的枝條延長的要求?那麼可能更有意義。 – qooplmao