PHP Composer自动加载器不会在包含路径中加载文件

时间:2017-06-12 07:33:19

标签: php composer-php autoloader set-include-path

假设有两个项目" project_a"和" project_b"。我通过set_include_path在project_a的index.php中动态设置包含路径,以便能够使用位于 / Users / Me / develop / project_b / controller 文件夹中的project_b文件。

project_a的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
    }
}

最后,project_b中MyController.php的内容是:

namespace projectbns\Controller;

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

但是当我调用project_a的index.php时,我只会收到此错误:

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

我错过了什么?

提前致谢, 大卫。

P.S。:是的我必须动态设置包含路径。

3 个答案:

答案 0 :(得分:1)

好的,所以 尝试将psr-4更改为psr-0 然后

W/art: Suspending all threads took: 17.080ms

答案 1 :(得分:1)

这是简单的工作演示。希望你喜欢我的东西。

您的目录结构应为:

    - 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",
        }
    }
}

毕竟不要忘记转移自动加载。 希望这对你有所帮助。

问候!

答案 2 :(得分:1)

我现在通过在项目b中设置“自己的作曲家”解决了我的问题(project_b获得了自己的 composer.json ,然后在终端: composer install )。这会产生这样的效果:作曲家将在项目b中生成 vendor / autoload.ph p文件,这在项目a中可能需要通过绝对路径:

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

这种方式不需要包含路径修改,项目b可以自己处理其类的自动加载(这对我来说似乎有点模块化)。