Автозагрузчик PHP Composer не загружает файлы в пути включения

Предположим, есть два проекта "project_a" и "project_b". Я устанавливаю путь включения динамически в index.php project_a через set_include_path, чтобы иметь возможность использовать файлы project_b, лежащие в папке / Users / Me / develop / project_b / controller.

Содержание index.php проекта:

set_include_path(get_include_path().':/Users/Me/develop/project_b');
require 'vendor/autoload.php';

$c = new projectbns\Controller\MyController();

Содержимое composer.json:

{
    "require": {},
    "autoload": {
        "psr-4": {
            "projectbns\\Controller\\": "controller/"
        }
    },
    "config": {
        "use-include-path": true
    }
}

И, наконец, содержимое MyController.php в project_b:

namespace projectbns\Controller;

class MyController {
    public function __construct() {
        die(var_dump('Hi from controller!'));
    }
}

Но когда я вызываю index.php project_a, я получаю только эту ошибку:

Fatal error: Uncaught Error: Class 'projectbns\Controller\MyController' not found in /Users/Me/develop/project_a/index.php:8 Stack trace: #0 {main} thrown in /Users/David/Me/develop/project_a/index.php on line 8

Что мне не хватает?

Заранее спасибо, Дэвид.

PS: Да, я должен установить путь включения динамически по определенным причинам.

3 ответа

Решение

Теперь я решил свою проблему, установив "собственный композитор" в проекте b (project_b получает свой собственный composer.json, затем в терминале: composer install). Это приводит к тому, что composer генерирует файл vendor / autoload.ph p в проекте b, который может потребоваться в проекте a по абсолютному пути:

require_once '/Users/Me/develop/project_b/vendor/autoload.php';

Таким образом, не требуется никаких модификаций пути включения, и проект b может самостоятельно обрабатывать свои классы (что мне кажется немного более модульным).

Вот простая рабочая демонстрация. надеюсь, тебе понравятся мои вещи.

Ваша структура каталогов должна быть:

    - Main
        - index.php
        - composer.json
        - vendor
        - Libs
            - botstrap.php

index.php: исходный файл первой посадки (в корневом каталоге)

<?php
    ini_set("display_errors", 1);
    error_reporting(E_ALL);

    // Include autoloading file
    require "vendor/autoload.php";

    // User target class file namespace
    use Library\Libs\Bootstrap as init;

    // Create object of the bootstrap file.
    $bootstrap = new init();

    /*
     * Object of the bootstrap file will call constructor by default.
     * if you want to call method then call with bellow code
     */

    $bootstrap->someFunc();

?>

Bootstrap.php

<?php
    namespace Library\Libs;

    class Bootstrap {
        function __construct() {
            echo "Class Construcctor called..<br/>";
        }
        public function someFunc()
        {
            echo "Function called..:)";
        }
    }
?>

composer.json

    {
    "name": "root/main",
    "autoload": {
        "psr-4": {
            "Library\\Libs\\": "./Libs",
        }
    }
}

Не забудьте сбросить автозагрузку в конце концов. надеюсь, это будет полезно для вас.

Привет!

Хорошо, так что попробуйте изменить PSR-4 на PSR-0, а затем

composer dumpautoload -o 
Другие вопросы по тегам