php - 自 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 环境都已启动并正在运行,因此代码中不存在结构性问题。
解决方案
推荐阅读
- javascript - 如何使用香草javascript一次只检查一项?
- javascript - React:从 html 字符串中的模板标签创建输入的方法
- python - SyntaxError: 非 ASCII 字符 '\xe2' 只需复制到另一个项目
- reactjs - 如何正确处理 ReactJS 中的全局状态?
- node.js - 在 Node 中,如何让函数在下一个命令之前运行?
- android-studio - Android:如何在 Kotlin 中投射?
- reactjs - 将 createContextualFragment 与 JSX 一起使用
- python - 逐行填充 Numpy Array
- garbage-collection - 读/写障碍如何真正应用于垃圾收集代码?
- c# - C# 等价于 C++ Vector< Vector
> 巨型维克;