Symfony 4 - 两个目录中的控制器
Symfony 4 - controllers in two directories
在我的应用程序中,我使用 Symfony 4。我希望 Symfony 在两个目录中搜索控制器:A 和 B。我找到了类似这样的内容:
controllers:
resource: '../src/DirectoryA/Controller/'
type: annotation
,但它只适用于一个目录。我怎样才能让 Symfony 在两个目录中搜索控制器?
此致
在你的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
接受的答案当然是完全正确的。
然而,一旦您从拥有一个控制器目录移动到多个目录,更新您的 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 文件中的默认控制器行。
在我的应用程序中,我使用 Symfony 4。我希望 Symfony 在两个目录中搜索控制器:A 和 B。我找到了类似这样的内容:
controllers:
resource: '../src/DirectoryA/Controller/'
type: annotation
,但它只适用于一个目录。我怎样才能让 Symfony 在两个目录中搜索控制器?
此致
在你的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
接受的答案当然是完全正确的。
然而,一旦您从拥有一个控制器目录移动到多个目录,更新您的 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 文件中的默认控制器行。