【问题标题】:Composer autoload missing classes in some sub-foldersComposer 自动加载某些子文件夹中缺少的类
【发布时间】:2019-10-20 23:45:36
【问题描述】:

我正在尝试改进我的文件结构,因为我的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 路由文件的顶部来获取要执行的代码:

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' 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

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
  • 我重新运行我的 docker-compose,其中包括此命令 RUN composer dump-autoload。我会将我的 Docker 文件添加到问题中。
  • @rob006 我已经添加了这些文件 :)

标签: php docker-compose composer-php slim autoload


【解决方案1】:

顺便说一句,这样做的原因是我没有正确且始终如一地使用namespaces

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-28
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    • 2017-02-22
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多