【问题标题】:Extending all controller classes from my custom controller class in symfony2从 symfony2 中的自定义控制器类扩展所有控制器类
【发布时间】:2014-08-20 14:25:11
【问题描述】:

就像在 Codeigniter 中一样,我们确实有“core”文件夹,我们可以在其中定义我们的自己的控制器,例如“MY_Controller”,并且可以用来扩展所有要扩展的类这个控制器有没有可能在 Symfony2 中这样做。

在 symfony 中,我想创建从基类 'Controller' 扩展而来的类 'MY_Controller',并且我希望控制器中的所有类都从 MY_Controller' 类扩展

在此先感谢...

【问题讨论】:

    标签: php symfony-2.4


    【解决方案1】:
    • 首先,不要像在 PSR-0 中那样使用下划线命名类,在类名中使用每个下划线字符都会转换为目录分隔符。
    • 第二,把你的控制器放到<bundledir>/Controller/
    • 第三,将您的控制器命名为 BaseController 之类的名称,并从中扩展所有其他控制器。
    • 第四,考虑在基本控制器中使用依赖注入而不是耦合功能。

    【讨论】:

    • 第二点:只要使用 Symfony2 generate:* 命令,控制器就会被放到它们所属的目录中。第三点:这就是OP所要求的:如何做到这一点。第四点:他自己的控制器将扩展自 Symfony2 Controller 组件。不要建议他重新发明轮子:控制器将有权访问容器对象
    • 嗯,是的,可以使用generate:*,但我个人觉得它比较慢,然后我自己在我的IDE中创建一个文件......这个功能主要是为新手准备的,我猜。
    • 也许,但是你不知道 OP 的核心控制器是否需要一些核心服务、资源和其他对象。不过,手动设置整个包不如使用generate:bundle 命令生成一个包那么快
    • 嗯...我没有从提问者没有捆绑的问题中得到。如果这是重点,那么可以肯定的是,使用generate:bundle 生成捆绑软件要容易得多。这个问题严格来说是关于扩展控制器,而不是关于如何创建一个包;)但是谁知道呢,也许你猜到了问题的根源;)
    • 这与他有没有捆绑无关。如果他希望他的所有控制器都从自定义基本控制器扩展,那么该自定义基本控制器应被视为 abstract 组件,因此不属于执行实际工作的包。这就是为什么,在我的回答中,我建议 OP 生成一个核心包,将所有内容放在那里,然后在实际工作包中扩展这些核心对象
    【解决方案2】:

    注意:
    在使用 Symfony2 时,强烈建议您遵循 Symfony2 编码风格。和PHP-FIG基本一样,有一两个偏差。所以下划线是类名中的禁忌。除此之外:Symfony 非常易于使用,并且完全面向对象,因此更改控制器扩展的类就像将 extends Controller 替换为 extends AnotherClass 一样简单。
    但是现在,使用自定义控制器的 symfony2 方式:

    您可以做的是创建一个Core 捆绑包(此后称为CoreBundle)。然后,在这个 CoreBundle 中,定义一个从 Symfony Controller 组件扩展而来的控制器。从命令行,在您的项目根目录中,使用以下命令:

    php app/console generate:bundle --namespace=YourNameSpace/CoreBundle --bundle-name=YourNameSpaceCoreBundle
    

    更多选项can be found here
    之后,您将在捆绑目录中找到一个DefaultController 类。 (可能在文件夹src/YourNamespace/CoreBundle/Controller 中)。然后,开始生成你的核心控制器:

    php app/console generate:controller --controller=YourNameSpaceCoreBundle:Core
    

    有关如何生成核心控制器的更多选项,请参阅the documentation

    完成自定义控制器的设置后,您可以随意在任何其他捆绑包中使用它:

    namespace YourNameSpace\AnotherBundle\Controller;
    
    use YourNameSpace\CoreBundle\Controller\CoreController;
    
    class DefaultController extends CoreController
    {//extends from your custom controller
    }
    

    就是这样:你已经完成了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-10
      • 2018-03-13
      • 2013-10-25
      相关资源
      最近更新 更多