Как использовать пользовательский класс в Laravel, когда он находится во вложенной папке?

#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
  

и они загружают все созданные вами классы