【问题标题】:PHP - Namespace not found, autoload project with composerPHP - 未找到命名空间,使用作曲家自动加载项目
【发布时间】:2016-08-03 09:58:53
【问题描述】:

我对自动加载和命名空间非常陌生,并尝试将命名空间添加到我的 MVC 项目中。

所以在我的作曲家中我添加了:

"autoload": {
    "psr-0": {
        "prj\\app\\": "app/",
        "prj\\app\\controller\\": "app/controller/",
        "prj\\app\\classes\\": "app/classes/"
    }
}

然后更新 composer 并运行 autodump 命令。

然后我回到我的应用程序尝试使用这些命名空间之一,但我只得到以下信息:

use \app\classes\engine; // use statement I tried

Fatal error: Uncaught Error: Class 'app\classes\engine' not found in C:\inetpub\wwwroot\web\index.php:87 Stack trace: #0 {main} thrown in C:\inetpub\wwwroot\web\index.php on line 87

我不确定为什么它无法使用命名空间找到类,如果它可能有用的话,这是我的整个文件夹结构:

PRJ
├───app
│   ├───classes
│   └───controller
├───web
│   └───index.php
├───vendor
│   ├───bin
│   ├───composer
│   ├───...
└───view
    ├───bootstrap
    └───default

/app 存储控制器和类等逻辑。

/web 是网络根目录 - index.php 是访问者看到的页面,所有内容都通过这里处理。

/vendor 是存放我的依赖项的 composer 目录。

【问题讨论】:

    标签: php namespaces composer-php autoload psr-0


    【解决方案1】:

    有几件事情出错了。首先,您要在 composer.json 中添加重复的命名空间:

    线条:

    "prj\\app\\controller\\": "app/controller/",
    "prj\\app\\classes\\": "app/classes/"
    

    没有必要,因为它们已经被:

    "prj\\app\\": "app/",
    

    只要app下的目录与你使用的命名空间的名称匹配,就不需要显式定义。所以你可以添加:

    "autoload": {
        "psr-0": {
            "prj\\app\\": "app/"
        }
    }
    

    其次,您的 use 声明似乎不正确,您正在尝试:

    use \app\classes\engine;
    

    如果您已经在同一个命名空间中,则此处不需要前导斜杠。此外,您将命名空间自动加载为prj\app 而不是app,因此您缺少prj 位。它应该看起来像这样(当这是app 文件夹中的一个文件时):

    <?php
    
    namespace prj\app\controller;
    
    use prj\app\classes\engine;
    
    class MyController
    {
        /**
         * @var engine
         */    
        private $engine;
    
        public function __construct()
        {
            // This should now work since engine should be autoloaded
            $this->engine = new engine();
        }
    }
    

    还可以查看PSR-0 naming conventions,因为您似乎没有关注它们。类名和命名空间文件夹应大写,例如 App\Classes\Engine 而不是 app\classes\engine

    【讨论】:

    • 嗨,我已经对我的应用程序进行了这些更改,但是现在当我访问与此控制器关联的上述路由时,我收到一个错误“指定的回调无效。”,这是我一直在使用的,数组的第一个参数需要映射到控制器,而第二个参数应该指向控制器的方法: $app->route('GET /test', array('AutoController','index') );
    • 路由文件位于 app/routing/*.php,这些需要使用 foreach 进入 web/index.php。
    猜你喜欢
    • 1970-01-01
    • 2018-08-30
    • 2018-05-07
    • 2013-04-08
    • 2013-08-11
    • 2016-11-30
    • 2015-10-08
    • 2012-09-07
    • 2016-12-18
    相关资源
    最近更新 更多