#php #laravel
Вопрос:
Вот DB
пример ( DataBase
) фасада:
$results = DB::select('select * from users where id = :id', ['id' => 1]);
Статический метод select
делегирует транзакцию соответствующей Системе управления базой данных
в зависимости от конфигурации среды:
DB_CONNECTION=sqlite
Здесь вместо этого может быть MySQL, PosgreSQL или другие системы (не уверен в обозначениях) sqlite
.
Но как это работает? Как DB
был инициализирован фасад и как DB::select
будет себя вести, если DB
он не был инициализирован?
Мои догадки
Наиболее простой, но неприемлемой с точки зрения качества реализации исходного кода является:
class DB {
public static function select(query, arguments) {
switch ENV.DB_CONNECTION {
case "sqlite":
SQLite::select(query, arguments);
break;
case "mysql"
SQLite::select(query, arguments);
break;
// ...
}
}
}
Но там не было какой-то инициализации. В приведенной ниже реализации есть initialize
метод, и если не вызывать его до использования других методов,
будет выдано исключение:
class DB {
private static $Executor;
public static function initialize(ENV) {
switch ENV.DB_CONNECTION {
case "sqlite":
self::$Executor = SQLite;
break;
case "mysql"
self::$Executor = MySQL;
break;
// ...
}
}
public static function select(query, arguments) {
if (is_null(self::$Executor)) {
throw new Exception("The DB facade has not been initilized.", 1);
}
DB::Executor.select(query, arguments);
}
public static function delete(query) {
if (is_null(self::$Executor)) {
throw new Exception("The DB facade has not been initilized.", 1);
}
DB::Executor.delete(query);
}
}
Но я уверен, что команда разработчиков Laravel написала что-то гораздо лучшее, чем приведенный выше код.
Комментарии:
1. Это не совсем так, как это работает, все немного сложнее, чем это. Фасады на самом деле являются статическими способами доступа к поставщикам услуг. Вы должны изучить и понять архитектурные концепции Laravel: laravel.com/docs/8.x/lifecycle
2. Поток таков: 1) Запускается платформа Laravel 2) Она регистрирует поставщиков услуг в контейнере услуг 3) Она «загружает» поставщиков услуг
3. Фасады-это способ доступа к зарегистрированным поставщикам
4. «Поставщики услуг» на самом деле являются (и я думаю, что это концепция, которая всех смущает) классами, которые вы пишете вручную, но вы поручаете Laravel автоматически создавать их экземпляры через контейнер служб, чтобы, когда они понадобятся вам в ваших контроллерах/маршрутах/представлениях, вам не пришлось создавать их самостоятельно
5. В этом смысл всего этого механизма «Контейнер/поставщик услуг»:)