У меня есть группа файлов 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;
даже не работает?
Я что-то здесь не так делаю? Есть ли правильный способ использовать пространства имен, которые я не понимаю?
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);
Спасибо! Я изменил автозагрузчик на 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)