Композитор автоматически загружает пропущенные классы в некоторых подпапках - PullRequest
4 голосов
/ 05 июня 2019

Я пытаюсь улучшить мою файловую структуру, так как моя папка 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
...