Пространство имен не найдено, автозагрузка проекта с помощью composer

Я довольно новичок в автозагрузке и пространствах имен, и пытаюсь добавить пространства имен в свой проект 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 — это каталог композитора, в котором хранятся мои зависимости.

0

Решение

Есть несколько вещей, которые идут не так. Прежде всего, вы добавляете повторяющиеся пространства имен в ваш 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,

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]