某些子文件夹中缺少 Composer 自动加载 类
Composer autoload missing classes in some sub-folders
我正在尝试改进我的文件结构,因为我的 validators
文件夹很快就会被填满。为了改善这一点,我想在此文件夹中添加新的子文件夹,以使所有内容井井有条且易于管理。但是,在这样做时,我的应用程序不再正确地自动加载所有必需的文件。具体来说,它会遗漏 /validators
的子文件夹内的所有文件(请参阅下面的结构)
v1
|-- validators
|-- sessionValidators
我的 composer.json
文件的自动加载部分如下所示:
"autoload": {
"classmap": [
"./",
"v1",
...
"v1/validators",
"v1/validators/sessionValidators"
]
}
我不确定 v1/validators
和 v1/validators/sessionValidators
是否是问题所在。
我试过从 composer.json
中删除 v1/validators/sessionValidators
,但当然没有用。
需要说明的是,在我尝试将内容移动到新的 sessionValidators
文件夹之前,所有内容都已正常加载。
Slim 代码无法找到 SessionValidator
class 看起来像这样:
$app->put('/session', 'SessionResource::updateSession')->add('SessionValidator');
我试过改成这样,没用:
$app->put('/session', 'SessionResource::updateSession')->add('sessionValidators/SessionValidator');
我可以通过将以下代码添加到 Slim 路由文件的顶部来获取要执行的代码:
require_once 'validators/sessionValidators/SessionValidator.php';
但是,这不是一个优雅的解决方案,因为我必须对 /validators
中的文件夹中的每个文件都执行此操作,并且有很多这样的文件。
我反复看到重新生成自动加载文件应该可以解决这个问题,但我不认为这里是这种情况。当我重新 运行 我的 docker-compose 自动加载文件应该自动重新生成;请参阅此 post 末尾的 Docker 文件。
除了 v1/validators/sessionValidators
之外的所有内容似乎都已正确加载。当我尝试发出请求或 运行 需要 sessionValidators
文件夹内的 class 的测试时,我得到此 错误 :
/var/www/html/vendor/php-di/invoker/src/Exception/NotCallableException.php (33) 'SessionValidator' is neither a callable nor a valid container entry #0 /var/www/html/vendor/php-di/invoker/src/CallableResolver.php(80)
如果恰好相关,我会运行将所有这些都放在一个 Docker 容器中,尽管我认为这不会成为问题。
docker-compose.yml
version: '3.3'
services:
salus-db:
image: postgres:11.2
volumes:
- ./tests:/docker-entrypoint-initdb.d/
ports:
- 7000:5432
salus-api:
build: .
volumes:
- .:/var/www/html
- ${CONFIG_PATH}:/var/www/html/conf
- ${HOST_LOG_PATH}:/var/www/html/salus_api_log
env_file:
- api.env
ports:
- 9191:80
depends_on:
- salus-db
links:
- salus-db:salus-db
Docker文件
# Build Dockerfile from official PHP 7.3 image
FROM php:7.3-apache
# Create new user 'deploy'
RUN useradd -ms /bin/bash deploy
# Copy contents of current directory into /var/www/html/ inside the container
COPY . /var/www/html/
# Install Composer
RUN curl -sS https://getcomposer.org/installer | \
php -- --install-dir=/usr/bin/ --filename=composer
USER deploy
# Install Composer dependencies without autoloader
RUN composer install --no-autoloader
# Copy new contents
COPY . ./
# Generate autoload.php
RUN composer dump-autoload
USER root
ADD apache-config.conf /etc/apache2/sites-enabled/000-default.conf
# Expose port 80 inside the container
EXPOSE 80
顺便说一下,这是因为我没有正确且一致地使用 namespaces。
我正在尝试改进我的文件结构,因为我的 validators
文件夹很快就会被填满。为了改善这一点,我想在此文件夹中添加新的子文件夹,以使所有内容井井有条且易于管理。但是,在这样做时,我的应用程序不再正确地自动加载所有必需的文件。具体来说,它会遗漏 /validators
的子文件夹内的所有文件(请参阅下面的结构)
v1
|-- validators
|-- sessionValidators
我的 composer.json
文件的自动加载部分如下所示:
"autoload": {
"classmap": [
"./",
"v1",
...
"v1/validators",
"v1/validators/sessionValidators"
]
}
我不确定 v1/validators
和 v1/validators/sessionValidators
是否是问题所在。
我试过从 composer.json
中删除 v1/validators/sessionValidators
,但当然没有用。
需要说明的是,在我尝试将内容移动到新的 sessionValidators
文件夹之前,所有内容都已正常加载。
Slim 代码无法找到 SessionValidator
class 看起来像这样:
$app->put('/session', 'SessionResource::updateSession')->add('SessionValidator');
我试过改成这样,没用:
$app->put('/session', 'SessionResource::updateSession')->add('sessionValidators/SessionValidator');
我可以通过将以下代码添加到 Slim 路由文件的顶部来获取要执行的代码:
require_once 'validators/sessionValidators/SessionValidator.php';
但是,这不是一个优雅的解决方案,因为我必须对 /validators
中的文件夹中的每个文件都执行此操作,并且有很多这样的文件。
我反复看到重新生成自动加载文件应该可以解决这个问题,但我不认为这里是这种情况。当我重新 运行 我的 docker-compose 自动加载文件应该自动重新生成;请参阅此 post 末尾的 Docker 文件。
除了 v1/validators/sessionValidators
之外的所有内容似乎都已正确加载。当我尝试发出请求或 运行 需要 sessionValidators
文件夹内的 class 的测试时,我得到此 错误 :
/var/www/html/vendor/php-di/invoker/src/Exception/NotCallableException.php (33) 'SessionValidator' is neither a callable nor a valid container entry #0 /var/www/html/vendor/php-di/invoker/src/CallableResolver.php(80)
如果恰好相关,我会运行将所有这些都放在一个 Docker 容器中,尽管我认为这不会成为问题。
docker-compose.yml
version: '3.3'
services:
salus-db:
image: postgres:11.2
volumes:
- ./tests:/docker-entrypoint-initdb.d/
ports:
- 7000:5432
salus-api:
build: .
volumes:
- .:/var/www/html
- ${CONFIG_PATH}:/var/www/html/conf
- ${HOST_LOG_PATH}:/var/www/html/salus_api_log
env_file:
- api.env
ports:
- 9191:80
depends_on:
- salus-db
links:
- salus-db:salus-db
Docker文件
# Build Dockerfile from official PHP 7.3 image
FROM php:7.3-apache
# Create new user 'deploy'
RUN useradd -ms /bin/bash deploy
# Copy contents of current directory into /var/www/html/ inside the container
COPY . /var/www/html/
# Install Composer
RUN curl -sS https://getcomposer.org/installer | \
php -- --install-dir=/usr/bin/ --filename=composer
USER deploy
# Install Composer dependencies without autoloader
RUN composer install --no-autoloader
# Copy new contents
COPY . ./
# Generate autoload.php
RUN composer dump-autoload
USER root
ADD apache-config.conf /etc/apache2/sites-enabled/000-default.conf
# Expose port 80 inside the container
EXPOSE 80
顺便说一下,这是因为我没有正确且一致地使用 namespaces。