Расширение

Flight спроектирован для того, чтобы быть расширяемым фреймворком. Фреймворк поставляется с набором стандартных методов и компонентов, но позволяет вам создавать свои собственные методы, регистрировать свои классы или даже переопределять существующие классы и методы.

Если вам нужен Контейнер внедрения зависимостей (DIC - Dependency Injection Container), перейдите на страницу Контейнер внедрения зависимостей.

Сопоставление методов

Чтобы сопоставить свой собственный простой пользовательский метод, используйте функцию map:

// Сопоставить свой метод
Flight::map('hello', function (string $name) {
  echo "привет $name!";
});

// Вызов вашего пользовательского метода
Flight::hello('Боб');

Хотя возможно создавать простые пользовательские методы, рекомендуется просто создавать стандартные функции на PHP. Это обеспечивает автозаполнение в среде разработки и упрощает чтение. Эквивалент приведенного выше кода будет:

function hello(string $name) {
  echo "привет $name!";
}

hello('Боб');

Это используется более часто, когда вам нужно передать переменные в ваш метод, чтобы получить ожидаемое значение. Использование метода register() вроде приведенного ниже больше подходит для передачи конфигурации, а затем вызова вашего предварительно настроенного класса.

Регистрация классов

Чтобы зарегистрировать свой собственный класс и настроить его, используйте функцию register:

// Зарегистрировать ваш класс
Flight::register('user', User::class);

// Получить экземпляр вашего класса
$user = Flight::user();

Метод регистрации также позволяет передавать параметры в конструктор вашего класса. Таким образом, при загрузке вашего пользовательского класса он будет предварительно инициализирован. Вы можете определить параметры конструктора, передавая дополнительный массив. Вот пример загрузки подключения к базе данных:

// Зарегистрировать класс с параметрами конструктора
Flight::register('db', PDO::class, ['mysql:host=localhost;dbname=test', 'user', 'pass']);

// Получить экземпляр вашего класса
// Это создаст объект с определенными параметрами
//
// new PDO('mysql:host=localhost;dbname=test','user','pass');
//
$db = Flight::db();

// и если вам понадобится он позже в вашем коде, просто вызовите тот же метод снова
class SomeController {
  public function __construct() {
    $this->db = Flight::db();
  }
}

Если вы передадите дополнительный параметр обратного вызова, он будет выполнен сразу после создания объекта класса. Это позволяет вам выполнить любые процедуры настройки для вашего нового объекта. Функция обратного вызова принимает один параметр, экземпляр нового объекта.

// Объект, который был создан, будет передан обратному вызову
Flight::register(
  'db',
  PDO::class,
  ['mysql:host=localhost;dbname=test', 'user', 'pass'],
  function (PDO $db) {
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  }
);

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

// Общий экземпляр класса
$shared = Flight::db();

// Новый экземпляр класса
$new = Flight::db(false);

Имейте в виду, что сопоставленные методы имеют приоритет над зарегистрированными классами. Если вы объявите оба с одинаковым именем, будет вызван только сопоставленный метод.

Переопределение методов фреймворка

Flight позволяет вам переопределять его стандартную функциональность под ваши нужды, не изменяя код. Вы можете просмотреть все методы, которые вы можете переопределить здесь.

Например, когда Flight не может соотнести URL с маршрутом, он вызывает метод notFound, который отправляет общий ответ HTTP 404. Вы можете переопределить это поведение, используя метод map:

Flight::map('notFound', function() {
  // Показать настраиваемую страницу 404
  include 'errors/404.html';
});

Flight также позволяет заменять основные компоненты фреймворка. Например, вы можете заменить стандартный класс Router своим собственным пользовательским классом:

// Зарегистрируйте ваш пользовательский класс
Flight::register('router', MyRouter::class);

// Когда Flight загружает экземпляр Router, он загрузит ваш класс
$myrouter = Flight::router();

Однако методы фреймворка вроде map и register не могут быть переопределены. Вы получите ошибку, если попытаетесь сделать это.