Автор оригинала: David Wong.
Фасады (произношение:/F sricad/) для применения Сервисный контейнер Доступные классы предоставляют “статический” интерфейс. Тебе и не нужно этого делать. использовать Большой список пространств имен, без создания экземпляров объектов, может получить доступ к определенным методам объектов.
use Config;
class Test
{
public function index()
{
return Config::get('app.name');
}
}
Руководство по загрузке фасада-это Подсветка\Фундамент\Начальная загрузка\Регистрация фасадов Зарегистрирован в.
public function bootstrap(Application $app)
{
Facade::clearResolvedInstances();
Facade::setFacadeApplication($app);
AliasLoader::getInstance(array_merge(
$app->make('config')->get('app.aliases', []),
$app->make(PackageManifest::class)->aliases()
))->register();
}
Конфигурация псевдонима по умолчанию-из приложения В файле конфигурации псевдонимы Прочитайте, Манифест пакета да ларавель 5.5 Недавно добавлено Автоматическое обнаружение пакетов Правила, давайте пока не будем их рассматривать. Манифест пакета Псевдоним, предоставленный пакетом.
Среди них, массив_мерже Возвращает массив в следующем формате:
"App" => "Illuminate\Support\Facades\App" "Artisan" => "Illuminate\Support\Facades\Artisan" "Auth" => "Illuminate\Support\Facades\Auth" "Blade" => "Illuminate\Support\Facades\Blade" ...
Приведенный выше код будет проходить через Загрузчик псевдонимов Взять все фасад Зарегистрируйтесь для автоматической загрузки. Его ядром является php Из spl_autoload_регистра 。
/**
* Prepend the load method to the auto-loader stack.
*
* @return void
*/
protected function register()
{
if (! $this->registered) {
spl_autoload_register([$this, 'load'], true, true);
$this->registered = true;
}
}
После регистрации, последующее владение использование Все классы пройдут через функцию load для завершения автоматической загрузки классов.
Обратите внимание, что определение находится здесь spl_autoload_register Когда будет передан последний параметр true 。 Если параметр имеет значение true В это время функции spl_autoload_register() добавляются в начало очереди, а не в конец очереди. (Приоритет отдается автоматической загрузке с помощью этой функции)
Другими словами,
Независимо от того, что мы делаем используем Это класс конкретного существования. ( Приложение\Пользователь ) Или псевдоним (Конфигурация) Все пройдет сначала загрузка Функция для завершения автоматической загрузки, когда функция вернет false Затем для завершения автоматической загрузки используются другие функции автоматической загрузки (например, composer psr-4 ).
останься Загрузчик псевдонимов Из нагрузки Этот метод в основном используется в данной работе. class_alias Функция для автоматической загрузки псевдонимов.
public function load($alias)
{
if (isset($this->aliases[$alias])) {
return class_alias($this->aliases[$alias], $alias);
}
}
о компании class_alias Вот официальный список:
class foo { }
class_alias('foo', 'bar');
$a = new foo;
$b = new bar;
// the objects are the same
var_dump($a == $b, $a === $b); //true
var_dump($a instanceof $b); //false
// the classes are the same
var_dump($a instanceof foo); //true
var_dump($a instanceof bar); //true
var_dump($b instanceof foo); //true
var_dump($b instanceof bar); //true
Когда мы его используем Фасад Такие как:
На самом деле, загружено Подсветка\Поддержка\Фасады\Конфигурация Класс (потому что мы зарегистрировались) class_alias (2) эквивалентно:
И все Фасад Наследование от Осветить\Поддержка\Фасады\Фасад Класс, который определяет базовый класс __вызов статического Метод, насколько мы можем легко его использовать Фасад (Материализация не требуется).
$method(...$args); }
getFacadeRoot Метод используется для получения конкретных столбцов класса псевдонимов, и мы знаем, что все классы Фасад должны определить один getFacadeAccessor Метод. Возможными возвращаемыми значениями этого метода являются:
- Строки строкового типа (например,
config,db) - Строки класса строкового типа (например,
Приложение\Служба\Какая-либо служба) - Объект конкретный материализованный объект
- Закрытие закрытие
как Фасад конфигурации Из getFacadeАкцессор Эти методы заключаются в следующем:
protected static function getFacadeAccessor()
{
return 'config';
} getFacadeRoot Метод будет основан на getFacadeAccessor() Возвращаемом значении из контейнера для извлечения соответствующего реального объекта.
public static function getFacadeRoot()
{
$name = static::getFacadeAccessor();
if (is_object($name)) {
return $name;
}
if (isset(static::$resolvedInstance[$name])) {
return static::$resolvedInstance[$name];
}
return static::$resolvedInstance[$name] = static::$app[$name];
}Потому что контейнер приложения был зарегистрирован конфигурация Настоящая колонка
instance('config', $config = new Repository($items));
поэтому \Config::get('app.name', 'по умолчанию) То, что мы на самом деле посетили, было Репозиторием Реальной колонкой получить('app.name', 'по умолчанию') Метод.
Оригинал: “https://developpaper.com/loading-process-and-principle-of-laravel-facade/”