Автозагрузчик 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