Symfony 5 @required 注释在 setter 注入期间出现奇怪的缓存问题?
Symfony 5 @required annotation weird caching issue during setter injection?
我在 Symfony 5 中发现了这个奇怪的问题,我认为它与 docker 和 Symfony 本身有关。
我的设置
docker-compose.yml
version: '3.7'
services:
webapp:
build:
context: ./php/
dockerfile: Dockerfile
container_name: webapp
image: php:7.4.1-fpm-alpine
volumes:
- ../:/srv/app
apache2:
build:
network: host
context: ./apache2/
dockerfile: Dockerfile
container_name: apache2
image: httpd:2.4.39-alpine
ports:
- 8080:80
volumes:
- ../:/srv/app
mysql:
container_name: mysql
image: mysql:latest
ports:
- 13306:3306
volumes:
- mysql:/var/lib/mysql:cached
environment:
MYSQL_ROOT_USER: XXX
MYSQL_ROOT_PASSWORD: XXX
MYSQL_DATABASE: XXX
MYSQL_USER: XXX
MYSQL_PASSWORD: XXX
redis:
container_name: redis
image: redis:5.0.6-alpine
ports:
- 16379:6379
volumes:
- redis:/data:cached
volumes:
mysql:
driver: local
redis:
driver: local
对于框架,我当然使用 Symfony 5。我很确定这个设置是正确的,因为我在我的其他 Laravel 项目中使用了类似的东西并且它工作得很好。
问题
在我的特质上,我使用了 @required
注释。更确切地说,我在这样的 setter 上使用它:
/**
* Get the current request out of RequestStack object.
*
* @param RequestStack $requestStack
* @required
*/
public function setRequest(RequestStack $requestStack): void
{
$this->currentRequest = $requestStack->getCurrentRequest();
}
我知道这一点很好,因为它在以前的版本中一直有效。问题似乎出在 @required
注释中。我不确定为什么,但每次添加它时我都会得到:
看起来服务器有问题,但是一旦我手动清除缓存它就可以工作,然后在另一个调用之后(并更改代码和邮递员调用中的某些内容,如查询参数的内容)它再次中断直到我删除 @required
或清除缓存。
我很困惑 - 我不确定这是否与我的 docker 设置有关,或者 Symfony 的缓存机制中存在错误,或者它可能是我所有怀疑的组合,甚至更多。
我敢打赌是 Symfony 缓存中的错误,或者我设置 docker 的方式有问题。然而,我才刚刚开始做这件事,此时我什至没有连接到数据库,这些实际上是重写该项目的第一步,所以没有发生任何奇怪的事情。
大家怎么看?有人以前见过类似的东西吗?
我尝试了什么
我确实尝试过清除缓存,删除并添加该注释我确实尝试重新启动我的 docker,我确实修剪了整个东西并进行了全新的设置。到目前为止没有任何效果。
2020 年 1 月 30 日更新 19:45
我确实尝试了直接在控制器上进行相同的 setter 注入,但我无法重现错误。我认为出于某种原因它不喜欢它的特性。
我的问题的答案是升级。就像 Cerad 在他的评论中提到的那样 - 将 PHP 从 7.4.1 更新到 7.4.2 可以解决问题并且确实如此。
如果您使用的是 Symfony 5,请确保您拥有 PHP 7.4.2 以避免此特定问题。
我在 Symfony 5 中发现了这个奇怪的问题,我认为它与 docker 和 Symfony 本身有关。
我的设置
docker-compose.yml
version: '3.7'
services:
webapp:
build:
context: ./php/
dockerfile: Dockerfile
container_name: webapp
image: php:7.4.1-fpm-alpine
volumes:
- ../:/srv/app
apache2:
build:
network: host
context: ./apache2/
dockerfile: Dockerfile
container_name: apache2
image: httpd:2.4.39-alpine
ports:
- 8080:80
volumes:
- ../:/srv/app
mysql:
container_name: mysql
image: mysql:latest
ports:
- 13306:3306
volumes:
- mysql:/var/lib/mysql:cached
environment:
MYSQL_ROOT_USER: XXX
MYSQL_ROOT_PASSWORD: XXX
MYSQL_DATABASE: XXX
MYSQL_USER: XXX
MYSQL_PASSWORD: XXX
redis:
container_name: redis
image: redis:5.0.6-alpine
ports:
- 16379:6379
volumes:
- redis:/data:cached
volumes:
mysql:
driver: local
redis:
driver: local
对于框架,我当然使用 Symfony 5。我很确定这个设置是正确的,因为我在我的其他 Laravel 项目中使用了类似的东西并且它工作得很好。
问题
在我的特质上,我使用了 @required
注释。更确切地说,我在这样的 setter 上使用它:
/**
* Get the current request out of RequestStack object.
*
* @param RequestStack $requestStack
* @required
*/
public function setRequest(RequestStack $requestStack): void
{
$this->currentRequest = $requestStack->getCurrentRequest();
}
我知道这一点很好,因为它在以前的版本中一直有效。问题似乎出在 @required
注释中。我不确定为什么,但每次添加它时我都会得到:
看起来服务器有问题,但是一旦我手动清除缓存它就可以工作,然后在另一个调用之后(并更改代码和邮递员调用中的某些内容,如查询参数的内容)它再次中断直到我删除 @required
或清除缓存。
我很困惑 - 我不确定这是否与我的 docker 设置有关,或者 Symfony 的缓存机制中存在错误,或者它可能是我所有怀疑的组合,甚至更多。
我敢打赌是 Symfony 缓存中的错误,或者我设置 docker 的方式有问题。然而,我才刚刚开始做这件事,此时我什至没有连接到数据库,这些实际上是重写该项目的第一步,所以没有发生任何奇怪的事情。
大家怎么看?有人以前见过类似的东西吗?
我尝试了什么
我确实尝试过清除缓存,删除并添加该注释我确实尝试重新启动我的 docker,我确实修剪了整个东西并进行了全新的设置。到目前为止没有任何效果。
2020 年 1 月 30 日更新 19:45
我确实尝试了直接在控制器上进行相同的 setter 注入,但我无法重现错误。我认为出于某种原因它不喜欢它的特性。
我的问题的答案是升级。就像 Cerad 在他的评论中提到的那样 - 将 PHP 从 7.4.1 更新到 7.4.2 可以解决问题并且确实如此。
如果您使用的是 Symfony 5,请确保您拥有 PHP 7.4.2 以避免此特定问题。