#php #laravel #namespaces
#php #laravel #пространства имен
Вопрос:
В моем новом приложении laravel я добавил два пользовательских класса. Один загружается нормально, когда я использую его в контроллере, но другой, который находится в другой папке, не работает.
Рабочий класс, который я буду вызывать, Working
находится в appClasses
, у него есть пространство имен namespace AppClasses
и в контроллере, с помощью которого я его вызываю use AppClassesWorking
.
Нерабочий класс, который я буду вызывать, NonWorking
находится в appClassesNonWorking
. Я попытался присвоить ему пространства имен namespace AppClasses
и namespace AppClassesNonWorking
. Из контроллера я пытался вызвать его с помощью use AppClassesNonWorking
и use AppClassesNonWorkingNonWorking
, но я получаю ошибку Class 'AppClassesNonWorking' not found
or Class 'AppClassesNonWorkingNonWorking' not found
.
Я смог заставить его работать правильно, переместив нерабочий класс в ту же папку, что и рабочий класс, и установив пространство имен как namespace AppClasses
, но нерабочий класс из другого репозитория и должен находиться в своей собственной папке, поскольку он не будет единственным из другого репозитория.
Итак, как мне заставить Laravel понять, где находится этот класс?
Ответ №1:
Laravel использует автозагрузку PSR-4. Это означает, что в основном ваш класс должен следовать структуре папок.
Итак, если у вас есть классы в app/Classes
, у них должно быть пространство имен AppClasses
.
Таким образом, файл app/Classes/Working.php
будет располагаться вверху namespace AppClasses;
, и чтобы импортировать его в другой файл, вы пишете в другом файле use AppClassesWorking;
Если у вас есть класс внутри app/Classes/SubFolder
, у него должно быть пространство имен namespace AppClassesSubFolder;
, так что вот класс AmazingClass
в app/Classes/SubFolder/AmazingClass.php
файле:
// app/Classes/SubFolder/AmazingClass.php
namespace AppClassesSubFolder;
class AmazingClass
{
//
}
Давайте используем AmazingClass
в другом классе.
// Some file in another namespace
namespace AppMyRandom;
use AppClassesSubFolderAmazingClass;
// Rest of the file
Плюс: Всякий раз, когда вы добавляете новый класс и не можете его использовать, вполне вероятно, что он не загружен автоматически. Запустите команду
composer dump-autoload
для повторной автоматической загрузки классов.
Ответ №2:
чтобы решить вашу проблему, просто создайте свои папки и классы в папке приложения и запустите command :
composer dump-autoload
и они загружают все созданные вами классы