【问题标题】:Cannot redeclare class in Symfony2 Twig extension无法在 Symfony2 Twig 扩展中重新声明类
【发布时间】:2013-03-30 10:25:55
【问题描述】:

我正在创建一个 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.

【问题讨论】:

    标签: symfony twig


    【解决方案1】:

    您应该将您的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.
        }
    

    【讨论】:

    • 您好,谢谢,唯一的问题是我如何像通常在 PHP 中使用的那样将参数传递给新类:new NewClass($param1, $param2) 等 - 所有参数都来自请求类。
    • 您可以将请求发送到 NewClass 以获取参数。我已经为此更新了我的答案。不过好像不太理想。为什么你需要你的树枝扩展中的请求?那么可能更有意义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多