Розширення

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

Якщо ви шукаєте DIC (Контейнер впровадження залежностей), досліджуйте Контейнер впровадження залежностей сторінку.

Відображення методів

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

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

// Викликайте свій користувацький метод
Flight::hello('Bob');

Хоча можливе створення простих користувацьких методів, рекомендується просто створювати стандартні функції в PHP. Це має автозавершення в IDE та легше читається. Еквівалент наведенного вище коду буде:

function hello(string $name) {
  echo "hello $name!";
}

hello('Bob');

Це використовується більше, коли вам потрібно передати змінні у ваш метод для отримання очікуваного значення. Використання методу 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, однак не можуть бути переоприділені. Ви отримаєте помилку, якщо спробуєте це зробити.