2017-02-15 11 views
2

Я создал контроллер в Laravel, который использует следующие use:Как «использовать» знать, с чего начать поиск файла?

use Illuminate\Http\Request; 

Как контроллер знает, где найти Request? Сам контроллер находится в:

app\Http\Controllers\LoginController.php 

Но запрос в:

vendor\laravel\framework\src\Illuminate\Http\Request.php 


Так почему же use:

use Illuminate\Http\Request; 

... и не :

use vendor\laravel\framework\src\Illuminate\Http\Request; 

Будет ли это также работать? Как контроллер знает, с чего начать поиск?

+2

'use' не знает, где найти файл, потому что он ссылается на класс, а не на файл; надеюсь, автозагрузчик знает, где найти файл для этого класса. –

+0

Кажется, что есть несколько автозагрузчиков, как он знает, что является правильным? – Black

+0

Если вы используете композитор для автозагрузки, проверьте каталог 'vendor/composer', чтобы прочитать автозагрузчики. – Progrock

ответ

2

Он основан на информации, которую ваше приложение уже предоставило PHP с помощью объявления namespace в ваших файлах классов - и, как правило, с помощью автозагрузчика. По умолчанию ваши классы не будут найдены.

Это может быть, что:

  • вы вручную включены файлы
  • вы используете автозагрузчик

Если это не маленький проект, первый вариант получит неуправляемым быстро, так что вам Лучше бы изучить второй вариант. Поскольку @Koala Yeung упомянул PSR-0 и PSR-4, это общепринятый способ сделать это.

Вы регистрируете автозагрузчик с spl_autoload_register (http://php.net/manual/en/function.spl-autoload-register.php), и это позволяет вам написать функцию, которая вызывается каждый раз при создании нового объекта.

Если вы запустите var_dump(spl_autoload_functions());, вы увидите автозагрузчики, созданные Laravel.

4

Laravel использует composer в своем ядре и имеет совместимый автозагрузчик PSR-0/PSR-4.

Стандарты PSR-0 и PSR-4 определяют, как разрешать папку в соответствии с пространством имен. И laravel's Autoloader, через PHP Autoloading помогает решить проблему и включить правильный файл.

+0

Будет ли он работать, если я укажу весь путь, как я? например 'use vendor \ laravel \ framework \ src \ Illuminate \ Http \ Request;' – Black

+1

Нет. Это не так. Ключевое слово 'use' принимает путь [путь к пространству имен] (http://php.net/manual/en/language.namespaces.importing.php) для класса. Не фактический путь к файлу. Они выглядят одинаково, потому что PSR-0/PSR-4 говорят так. Они эффективно говорят: «Эй, как насчет поиска файла по пути пространства имен». Вы должны прочитать [Спецификация PSR-4] (http://www.php-fig.org/psr/psr-4/) для более подробной информации. –

+0

Но пространство имен является 'namespace App \ Http \ Controllers', поэтому почему они используют' use Illuminate \ Http \ Request; 'вместо' use .. \ .. \ .. \ Illuminate \ Http \ Request; 'если они запускаются из пространства имен? – Black