Операторы использования Laravel 5 [дубликаты]

Первый раз работаю с Laravel 5. Я понимаю использование пространств имен и почему вам нужно их использовать. Чего я не понимаю, так это того, почему мне нужно добавить операторы использования, подобные следующим (в верхней части контроллера):

use Session;
use Input;
use Response;

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

Class 'App\Http\Controllers\Session' not found

Может я что-то упускаю?? Эти классы, по-видимому, являются частью фреймворка и по умолчанию присутствуют в L4.x.

Может ли кто-нибудь помочь мне понять, почему это так в L5 или как мне избежать этого с L5?

Googles подвели меня на этом.


person Joel Leger    schedule 12.03.2015    source источник


Ответы (1)


Процесс использования операторов use в файлах называется псевдонимом или импортом. http://php.net/manual/en/language.namespaces.importing.php дает хорошее объяснение этому, но вкратце:

  • Если вы ссылаетесь на класс, используя «относительное» или просто имя класса (например, Session), PHP проверит текущее пространство имен на наличие этого класса.
  • Контроллеры Laravel 4 технически не находились в пространстве имен. Они были частью корневого пространства имен приложения, поэтому ссылка на другой класс в корневом пространстве имен (Session) нашла бы именно это. Контроллеры Laravel 5 находятся в пространстве имен App\Http\Controllers\.
  • Единственный способ решить эту проблему — указать PHP полное пространство имен данного класса, например, в данном случае \Session, поскольку эти классы добавляются как часть корневого пространства имен. Примером может быть что-то вроде new \App\MyCompany\Models\SomeModel();
  • Операторы «использовать» в верхней части файла класса позволяют вам называть эти полные пути к классам как угодно. use \App\MyCompany\Models\SomeModel as Foo позволит вам выполнить new Foo() и получить экземпляр \App\MyCompany\Models\SomeModel. (Большинство отказались бы от оператора as и просто ссылались бы на new SomeModel())
  • Невозможно и не нужно пытаться избежать добавления этих операторов use в ваши классы при попытке использовать классы, которые находятся в пространстве имен, отличном от текущего класса. Это полезная конструкция языка, а не ограничение.

Надеюсь, это имеет смысл.

person V13Axel    schedule 12.03.2015
comment
Спасибо, это имеет смысл. Очень похоже на операторы Use в C#. Однако в С# вы можете использовать System или System.Web, и это дает вам доступ к ряду классов и т. д., на которые вы можете ссылаться. Казалось бы, если бы все эти классы находились в корневом пространстве имен, вы могли бы просто сделать что-то вроде использования приложения, и они были бы автоматически включены. Но, кажется, это не так? - person Joel Leger; 12.03.2015
comment
Вы не можете импортировать все пространство имен в PHP. Однако вы можете создать псевдоним пространства имен, начиная с его полного имени пути и заканчивая только самым низким уровнем, а затем ссылаться на него оттуда. Чтобы продолжить мой предыдущий пример, use \App\MyCompany\Models. а затем вы можете сделать new Models\SomeModel() - person V13Axel; 12.03.2015
comment
Просто подсказка: при обращении к классу в корневом пространстве имен вы можете ссылаться на него с помощью косой черты, то есть - \DB::enableQueryLog(); Если я не использую корневой класс широко в классе, я предпочитаю не тратить строку на оператор использования. Однако я предпочитаю обращаться к корневому классу, а не использовать вспомогательную функцию, основанную на корневом классе, т. е. возвращать \Response::json(), а не просто возвращать json(). Хотя первый более подробный, он также более понятен всем, кто смотрит на код. - person Ixalmida; 26.06.2015