Рубрики
Uncategorized

Процесс загрузки и принцип работы фасада Laravel

Автор оригинала: 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 Метод. Возможными возвращаемыми значениями этого метода являются:

  1. Строки строкового типа (например, config , db )
  2. Строки класса строкового типа (например, Приложение\Служба\Какая-либо служба )
  3. Объект конкретный материализованный объект
  4. Закрытие закрытие

как Фасад конфигурации Из 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/”