Symfony 4 - 自定义文件夹结构和服务

Symfony 4 - Custom Folder structure and Services

我希望实现 Nikola Posa 推荐的文件夹结构。

我想要的结构如下所示。

src/
   Domain/
      User/
         UserEntity.php
         UserController.php
      Pages/
         DefaultPageController.php

这个想法是逻辑上 group/namespace 功能或类似的内容。我似乎遇到了这个错误:

The file "../src/Controller" does not exist (in: /Users/dev/Sites/web/html/sandbox/php/crud/config) in /Users/dev/Sites/web/html/sandbox/php/crud/config/services.yaml (which is loaded in resource "/Users/dev/Sites/web/html/sandbox/php/crud/config/services.yaml").

我不确定将这些连接为服务有多重要。如果我注释掉 services.yamlApp\Controller 属性,它就会消失。

如何使用 src/Domain/Feature/FeatureController.php 结构在 service.yaml 中加载控制器?

你当然可以走老路,单独定义每个控制器服务:

# config/services.yaml
Domain\Feature\FeatureController:
    tags: ['controller.service_arguments']

但是,一旦您习惯了自动装配,那么拼出每项服务就很麻烦了。作为替代方案,您可以使用自动配置功能将控制器标签添加到选定的 类。首先声明一个空接口并让您的控制器实现它:

interface ControllerInterface {}

class SomeController implements ControllerInterface

然后调整src/Kernel.php

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

当然这只是解决了控制器的问题。您可能会遇到许多其他与自动装配相关的问题。

我会按照 Cerad 的建议去创建一个 Controller 界面。但是,由于 Symfony 3.3 你不必接触内核:

services:
    _instanceof:
        YourApp\Ui\ControllerInterface:
            public: true
            tags: ['controller.service_arguments']

瞧瞧。