首页 > 解决方案 > 自 docker 更新以来的 Symfony 自动装配问题

问题描述

自从我将 Docker 更新到最新版本后,我在 symfony 中遇到了自动装配问题。

我不完全确定这里的因果关系,但可以肯定的是,我的问题只是在更新我的 docker 后才开始出现。既然是这种情况,我显然试图恢复到以前的 docker 版本,但仍然遇到与新版本相同的问题。这就是为什么我怀疑因果关系。

我现在在:带有 Docker Engine v20.10.7 的 Docker 版本 3.5.2

docker-engine config 是未更改的配置:

{
  "registry-mirrors": [],
  "insecure-registries": [],
  "debug": false,
  "experimental": false,
  "features": {
    "buildkit": true
  },
  "builder": {
    "gc": {
      "enabled": true,
      "defaultKeepStorage": "20GB"
    }
  }
}

当我开始我的第一个项目时,我遇到了作曲家没有阅读我的 lib 文件夹的问题。如下所述已解决,但它可能会提供更多见解、上下文和我检查/完成的事情

起初,我想到了这个Windows 环境变量。唉,它是设置的,所以这不是问题。其次,我的想法是文件所有权或文件权限,但也不是问题。我的容器中的所有东西都归 root 所有并具有 rwx 权限。第三,我认为这可能是因为我必须安装新的 WSL2 后端。直到更新那天,我仍然在 Hyper-V 后端运行。幸运的是,docker 中有一个设置,您可以在其中关闭 WSL-2 的使用并恢复到 Hyper-V,但这也不是解决我的问题的方法。

我的 composer.json 看起来像这样:

"autoload": {
        "classmap": [
            "scripts/composer/ScriptHandler.php",
            "lib/",
            ...
        ],
        "psr-4": {
            ...
        }
    },

我的 autoload_classmap.php 中除了(某些)文件之外的所有文件都存在于我的 autoload_classmap.php 摆弄太久之后,我终于尝试了以下方法,突然我的第一个项目上的问题消失了

"autoload": {
        "classmap": [
            "scripts/composer/ScriptHandler.php",
            "lib/*",
            ...
        ],
        "psr-4": {
            ...
        }
    },

我仍然不明白为什么第一个不应该工作。自臭名昭著的更新以来,它一直有效到本周四。

现在开始第二个项目,我真的不知道发生了什么,我说不出话来。我的同事们似乎也无法弄清楚出了什么问题。第二个项目是较新的项目,因此不再加载类图,一切都遵循 PSR-4 标准。

这是 composer.json 的自动加载部分:

"autoload": {
        "psr-4": {
            "App\\": "src/",
            "Project\\": "scripts/"
        }
    },

这是我的 services.yaml(这些只是标准的 symfony 设置 AFAIK):

services:
    # default configuration for services in *this* file
    _defaults:
        autowire: true      # Automatically injects dependencies in your services.
        autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
        public: false       # Allows optimizing the container by removing unused services; this also means
                            # fetching services directly from the container via $container->get() won't work.
                            # The best practice is to be explicit about your dependencies anyway.

    # makes classes in src/ available to be used as services
    # this creates a service per class whose id is the fully-qualified class name
    App\:
        resource: '../src/*'
        exclude: '../src/{Entity,Migrations,Tests,Kernel.php}'

这是我的 docker PHP 容器:

php:
    container_name: "${DOCKER_PROJECT_NAME}_php"
    environment:
      COLUMNS: 80
      PHP_FPM_GROUP: wodby
      PHP_FPM_USER: wodby
      PHP_SENDMAIL_PATH: "/usr/sbin/sendmail -t -i -S mailhog:1025"
      PHP_DEFAULT_CHARSET: 'utf-8'
      PHP_DATE_TIMEZONE: 'UTC'
      PHP_UPLOAD_MAX_FILESIZE: '10M'
      PHP_POST_MAX_SIZE: '10M'
      PHP_DISPLAY_ERRORS: 'On'
      PHP_DISPLAY_STARTUP_ERRORS: 'On'
      PHP_MAX_EXECUTION_TIME: '30000'
      PHP_MAX_INPUT_TIME: '60'
      PHP_MAX_INPUT_VARS: '2000'
      PHP_ERROR_REPORTING: 'E_ALL'
      PHP_LOG_ERRORS: 'On'
      PHP_LOG_ERRORS_MAX_LEN: '0'
      PHP_MEMORY_LIMIT: '512M'
      PHP_SESSION_GC_MAXLIFETIME: '700000'
      PHP_REALPATH_CACHE_SIZE: '4096K'
      PHP_REALPATH_CACHE_TTL: '3600'
      PHP_XHPROF: $PROFILING_ENABLED
    env_file:
      - .env
    image: "wodby/php:7.4-dev-4.16.2"
    volumes:
      - "./:/var/www/html"
      ## For php profiler traces
      - "files:/mnt/files"

在启动时,我收到以下运行时异常:

无法自动装配服务“App\Form\Wizard\DaysOffType”:方法“__construct()”的参数“$daycareTransformer”引用类“App\Form\DaycareTransformer”,但不存在此类服务。

这个类不是新的,它在代码中已经有 2 年了。它在正确的文件夹中,并且命名空间是正确的。src 文件夹也包含在 autoload_psr4.php 中。

根据 psr4 命名空间约定,“找不到”的 DaycareTransformer 位于命名空间 App\Form 下的 src/Form

<?php

namespace App\Form;

use App\Entity\Daycare;
use App\Service\DaycareService;
use Symfony\Component\Form\DataTransformerInterface;
use Symfony\Component\Form\Exception\TransformationFailedException;

class DaycareTransformer implements DataTransformerInterface
{
    private $daycareService;

    public function __construct(DaycareService $daycareService)
    {
        $this->daycareService = $daycareService;
    }

    ...
}

此代码最近没有任何更改。不是注入了 DaycareTransformer 的 DaysOffType,也不是 DaycareTransformer。

我是唯一一个遇到这些问题的人,因为我是唯一一个在 Windows 机器上运行 Docker 的人。生产和 QA 环境都已启动并正在运行,因此代码中不存在结构性问题。

标签: phpdockersymfonycomposer-phpwsl-2

解决方案


推荐阅读