Я довольно новичок в автозагрузке и пространствах имен, и пытаюсь добавить пространства имен в свой проект 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.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 как вы, кажется, не следуете за ними. Имена классов и папки пространства имен должны начинаться с заглавной буквы, например App\Classes\Engine
вместо app\classes\engine
,
Других решений пока нет …