Symfony 4-两个目录中的控制器

时间:2018-08-18 10:23:05

标签: php symfony routing symfony4

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

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

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

致谢

2 个答案:

答案 0 :(得分:4)

在您的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

答案 1 :(得分:0)

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

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

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

从一个空的控制器界面开始进行标记。

interface ControllerInterface {}

现在您的所有控制器都实现了该接口

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

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

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

然后保存。您可以随心所欲地创建控制器,而无需在services.yaml中创建任何内容。