Composer在某些子文件夹中无法自动加载类

5

我正在尝试改善我的文件结构,因为我的validators文件夹很快就会填满。为了改进这一点,我想在这个文件夹里添加新的子文件夹,以便使一切都有条理、易于管理。然而,在这样做的过程中,我的应用程序不再正确地自动加载所有所需的文件。具体来说,它会忽略/validators子文件夹中的任何文件(请参见下面的结构)。

v1
|-- validators
  |-- sessionValidators

我的 composer.json 文件中的自动加载部分看起来像这样:
"autoload": {
    "classmap": [
        "./",
        "v1",
        ...
        "v1/validators",
        "v1/validators/sessionValidators"
    ]
}

我不确定是否拥有v1/validatorsv1/validators/sessionValidators可能会成为问题。
我已经尝试从composer.json中删除v1/validators/sessionValidators,但当然没用。 要明确一点,在我尝试将东西移动到新的sessionValidators文件夹之前,一切都正常加载。
无法找到SessionValidator类的Slim代码如下:
$app->put('/session', 'SessionResource::updateSession')->add('SessionValidator');

我尝试将其更改为这样,但没有成功:

$app->put('/session', 'SessionResource::updateSession')->add('sessionValidators/SessionValidator');

我可以通过在Slim路由文件的顶部添加以下内容来执行代码:

可以 通过在Slim路由文件的顶部添加以下内容来执行代码:

require_once 'validators/sessionValidators/SessionValidator.php';

然而,这并不是一个优雅的解决方案,因为我必须针对/validators文件夹中的每个文件都这样做,而且有很多这样的文件。

我反复看到重新生成自动加载文件应该解决此问题,但是我认为在这种情况下并非如此。当我重新运行docker-compose时,自动加载文件应该会自动生成;请参见本文末尾的Docker文件。


v1/validators/sessionValidators之外的所有内容似乎都已经正确加载。当我尝试发出请求或运行需要sessionValidators文件夹中的类的测试时,我会收到这个错误:

/var/www/html/vendor/php-di/invoker/src/Exception/NotCallableException.php (33) 'SessionValidator'既不是可调用的也不是有效的容器条目#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

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

在将类文件移动到不同的目录后,您是否运行了 composer dump-autoload 命令? - rob006
我重新运行了我的docker-compose,其中包括这个命令 RUN composer dump-autoload。我将把我的Docker文件添加到问题中。 - Tom Barden
@rob006 我已经添加了那些文件 :) - Tom Barden
1个回答

0

顺便说一下,导致这个问题的原因是我没有正确和一贯地使用namespaces


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接