Доктрина — Как автоматически загружать классы сущностей, используя одно пространство имен

У меня есть группа файлов PHP, содержащих классы (сущности). Каждый класс имеет одинаковое пространство имен:

// src/App/Entity/Actions.php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
* Actions
*
* @ORM\Entity
*/
class Actions
{
// SOME CODE

Я автоматически загружаю файлы PHP, содержащие классы, с помощью composer:

"autoload": {
"psr-0": {
"App": "src/"}
}

И в моем файле bootstrap.php я добавляю эту строку:

 use App\Entity;

Поэтому я решил, что, поскольку велел приложению использовать пространство имен App \ Entity, я могу просто вызывать классы сущностей следующим образом: $entity = new Actions();

но когда я пытаюсь это сделать, я получаю эту ошибку:

Неустранимая ошибка: класс «Действия» не найден в C: \ wamp64 \ www \ spider \ chebi2 \ inc \ orm_tools.php в строке 49

Если я сделаю это:

use App\Entity; use App\Repository;

if (class_exists('Actions')) { dump('exists'); } else { dump('not exists'); }

if (class_exists('\App\Entity\Actions')) { dump('exists'); } else { dump('not exists'); }

Вот что он выводит:

PS C:\wamp64\www\spider\chebi2> php .\get_actions.php
"not exists""exists"

Так что он может найти класс, только когда я предоставлю полное пространство имен. И как ни странно, когда я попробовал это:

// Direct path to the Actions.php file
use App\Entity\Actions;

if (class_exists('Actions')) { dump('exists'); }
else { dump('not exists'); }

if (class_exists('\App\Entity\Actions')) { dump('exists'); }
else { dump('not exists'); }

Я получаю тот же результат:

PS C:\wamp64\www\spider\chebi2> php .\get_actions.php
"not exists""exists"

Так что теперь я еще больше запутался. Какой смысл в использовании: use App\Entity; если это не делает классы в этом пространстве имен непосредственно доступными? И почему назначается прямой путь к классу use App\Entity\Actions; даже не работает?

Я что-то здесь не так делаю? Есть ли правильный способ использовать пространства имен, которые я не понимаю?

0

Решение

PSR-0 не рекомендуется, вы должны использовать PSR-4

в PSR-4

composer.json

"autoload": {
"psr-4": {
"App\\": "src/",
}
}

в каталоге src /, который находится на том же уровне, что и каталог composer.json add Entity так в пути src/Entity добавить файл класса Actions

namespace App\Entity;

class Actions
{

}

Вы также можете использовать composer dump-autoload и проверьте поля vendor / composer / autoload * и посмотрите, не зарегистрированы ли там пространства имен. ‘

относительно class_exists() он не работает с короткими именами или псевдонимами, которые вам необходимо предоставить полное имя класса. Я бы предложил использовать ::class оператор Так в вашем случае это будет:

<?php
use App\Entity\Actions;

class_exists(Actions::class);
1

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

Спасибо! Я изменил автозагрузчик на psr-4 и прикрепил его к этому:

  "psr-4": {
"App\\": "src/"}

дамп-автозагрузка это именно то, что я искал, но я не вижу никаких включенных файлов или классов в списке:

    PS C:\wamp64\www\spider\chebi2> composer dump-autoload -vvv
Reading ./composer.json
Loading config file ./composer.json
Checked CA file C:\Users\horse\AppData\Local\Temp\composer-cacert-12fdaece071ee9515fa28aabed5ab089876ae257833106e15a583e060eaff6b5.pem: valid
Executing command (C:\wamp64\www\spider\chebi2): git branch --no-color --no-abbrev -v
Executing command (C:\wamp64\www\spider\chebi2): git describe --exact-match --tags
Executing command (C:\wamp64\www\spider\chebi2): git log --pretty="%H" -n1 HEAD
Reading C:/Users/horse/AppData/Roaming/Composer/composer.json
Loading config file C:/Users/horse/AppData/Roaming/Composer/composer.json
Reading C:\wamp64\www\spider\chebi2/vendor/composer/installed.json
Reading C:/Users/horse/AppData/Roaming/Composer/vendor/composer/installed.json
Running 1.2.2 (2016-11-03 17:43:15) with PHP 5.6.25 on Windows NT / 10.0
Generating autoload file

Я до сих пор не могу найти классы сущностей.

Чтобы уточнить, у меня должна быть такая структура папок:

 - src (contains only subdirectories)
- Entity (contains the entity files)
- Repositories
- App (empty)
0

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