我对自动加载和名称空间以及尝试将名称空间添加到我的MVC项目还很陌生。
因此,在我的作曲家中,我添加了:
"autoload": {
"psr-0": {
"prj\app\": "app/",
"prj\app\controller\": "app/controller/",
"prj\app\classes\": "app/classes/"
}
}
然后更新composer并运行autodump命令。
然后我回到我的应用程序,尝试使用其中一个名称空间,但我只得到了以下内容:
use appclassesengine; // use statement I tried
Fatal error: Uncaught Error: Class 'appclassesengine' not found in C:inetpubwwwrootwebindex.php:87 Stack trace: #0 {main} thrown in C:inetpubwwwrootwebindex.php on line 87
我不知道为什么它不能使用名称空间找到类,如果它有任何用处的话,下面是我的整个文件夹结构:
PRJ
├───app
│ ├───classes
│ └───controller
├───web
│ └───index.php
├───vendor
│ ├───bin
│ ├───composer
│ ├───...
└───view
├───bootstrap
└───default
/应用程序存储控制器和类等逻辑。
/web是web根-index.php是访问者可以看到的页面,所有内容都通过这里处理。
/vendor是存储我的依赖项的composer目录。
出现了一些问题。首先,在composer.json:中添加重复的名称空间
线路:
"prj\app\controller\": "app/controller/",
"prj\app\classes\": "app/classes/"
不必要,因为它们已经包含在:中
"prj\app\": "app/",
只要app
下的目录与您使用的命名空间的名称匹配,就不需要显式定义它。所以你可以添加:
"autoload": {
"psr-0": {
"prj\app\": "app/"
}
}
其次,您的use
语句似乎不正确,您正在尝试:
use appclassesengine;
如果您已经在同一个命名空间中,则此处不需要前导斜杠。此外,您正在将名称空间自动加载为prjapp
而不是app
,因此您缺少prj
位。它应该看起来像这样(当这是app
文件夹中的文件时):
<?php
namespace prjappcontroller;
use prjappclassesengine;
class MyController
{
/**
* @var engine
*/
private $engine;
public function __construct()
{
// This should now work since engine should be autoloaded
$this->engine = new engine();
}
}
还可以看看PSR-0的命名约定,因为您似乎没有遵循它们。类名和命名空间文件夹应该大写,比如AppClassesEngine
而不是appclassesengine
。