【问题标题】:Symfony 4 - controllers in two directoriesSymfony 4 - 两个目录中的控制器
【发布时间】:2018-08-18 10:23:04
【问题描述】:

在我的应用程序中,我使用 Symfony 4。我希望 Symfony 在两个目录中搜索控制器:A 和 B。我发现了这样的东西:

controllers:
    resource: '../src/DirectoryA/Controller/'
    type:     annotation

,但它只适用于一个目录。如何让 Symfony 在两个目录中搜索控制器?

问候

【问题讨论】:

  • 感谢您提出这个问题!给定的答案为我节省了一些时间。

标签: php symfony routing symfony4


【解决方案1】:

在你的config/services.yaml

App\DirectoryA\Controller\: # assuming you have namespace like that
    resource: '../src/DirectoryA/Controller'
    tags: ['controller.service_arguments']
App\DirectoryB\Controller\: # assuming you have namespace like that
    resource: '../src/DirectoryB/Controller'
    tags: ['controller.service_arguments']

这将为服务参数添加下一个目录。那就是根据目录回答你的问题,你发布的是路由文件,里面会有类似的

controllers_a:
    resource: '../src/DirectoryA/Controller/'
    type:     annotation
controllers_b:
    resource: '../src/DirectoryB/Controller/'
    type:     annotation

【讨论】:

    【解决方案2】:

    接受的答案当然是完全正确的。

    但是,一旦您从一个控制器目录转移到多个目录,更新 services.yaml 文件可能会有点麻烦。即使必须有专门用于控制器的目录也可能会受到限制。

    这是一种替代方法,它允许在您想要的任何地方创建控制器并自动标记它们。

    从一个用于标记的空控制器接口开始。

    interface ControllerInterface {}
    

    现在让所有控制器实现接口

    class Controller1 implements ControllerInterface { ...
    class Controller2 implements ControllerInterface { ...
    

    然后调整内核以自动使用控制器标记标记所有控制器接口类。

    # src/Kernel.php
    protected function build(ContainerBuilder $container)
    {
        $container->registerForAutoconfiguration(ControllerInterface::class)
            ->addTag('controller.service_arguments')
        ;
    }
    

    然后很快。您可以在任何地方创建控制器,而 services.yaml 中没有任何内容。

    更新: 如果您想避免编辑 Kernel.php,则可以在 services.yaml 文件中使用 _instanceof 功能。

    #config/services.yaml
    services:
        _instanceof:
            App\Contract\ControllerInterface:
                tags: ['controller.service_arguments']
    

    另一个更新:只要你的控制器扩展了 Symfony 的 AbstractController 就不需要额外的标记。如果需要,您甚至可以删除默认 services.yaml 文件中的默认控制器行。

    【讨论】:

    • 这就是我想要的。我需要以某种方式标记控制器,因为我有由子域分隔的控制器......但是在此之后,现在我在控制器上的路由(注释)不知何故丢失了。找不到路线...有什么想法吗?谢谢!
    • 只是我必须在 annotations.yml 上为新的控制器路径添加新别名*。谢谢!
    • 很高兴能提供帮助。尤其是当我什么都不做的时候。顺便说一句,虽然我通常更喜欢编辑 Kernel.php 文件,但您也可以使用 _instanceof 参数在 services.yaml 文件中标记您的控制器。
    • @ClaudioFerraro 是的。在 S5 中运行良好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    • 2018-12-12
    • 2019-08-08
    相关资源
    最近更新 更多