Я пытаюсь улучшить мою файловую структуру, так как моя папка validators
быстро заполняется. Чтобы улучшить это, я хочу добавить новые подпапки в эту папку, чтобы все было организовано и управляемо. Однако при этом мое приложение больше не корректно автоматически загружает все необходимые файлы. В частности, он пропускает любые файлы в подпапке /validators
(см. Структуру ниже)
v1
|-- validators
|-- sessionValidators
Часть автозагрузки моего composer.json
файла выглядит так:
"autoload": {
"classmap": [
"./",
"v1",
...
"v1/validators",
"v1/validators/sessionValidators"
]
}
Я не уверен, могут ли быть проблемы с v1/validators
и v1/validators/sessionValidators
.
Я пытался удалить v1/validators/sessionValidators
из composer.json
, но, конечно, это не сработало.
Чтобы было ясно, все загружалось просто отлично, прежде чем я попытался переместить вещи в новую папку sessionValidators
.
Код Slim с не может найти класс SessionValidator
выглядит следующим образом:
$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 файл автозагрузки должен быть автоматически сгенерирован заново; см. файлы Docker в конце этого поста.
Все, кроме v1/validators/sessionValidators
, похоже, загружено правильно. Когда я пытаюсь сделать запрос или запустить тест, который требует класс внутри папки sessionValidators
, я получаю это error :
/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, хотя не верю, что это будет проблемой.
докер-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
Dockerfile
# 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