Система пакетів

18/02/2016 0 пакет, налаштування

Пакет можна порівняти з плагіном на інших операційних системах, проте він набагато кращий. Основна відмінність: у Symfony пакетом є усе, включаючи функціональність будови ядра і код, написаний для вашого додатку. Пакети - “жителі найвищого класу” у Symfony. Вони дають вам можливість гнучко використовувати вбудовані функції, розміщені у сторонніх пакетах, або поширювати ваші пакети. Також, використання пакетів, спрощує процес вибору певних компонентів, які будуть вашому додатку, та оптимізувати їх так, як ви бажаєте.

Тут ви вивчатимете основи, а у Довіднику ви знайдете все про організацію та отримаєте найкращу практику стосовно пакетів)

Пакет - це просто структурований набір файлів у каталозі, що виконує одну функцію. Ви можете створити блог-пакет, форум-пакет, або пакет для керування інформацією про користувачів (багато з цих пакетів вже існують у відкритому джерелі пакетів). Кожен каталог вміщає усе, що стосується певного компоненту, включаючи PHP файли, шаблони, CSS файли, JavaScript файли, тести, та все інше. Кожен аспект компоненту існує у пакеті і кожен компонент розміщений у пакеті. Пакети, що використовуються у вашому додатку повинні бути включені шляхом реєстрації у методі registerBundles() класу AppKernel:

 
// app/AppKernel.php
public function registerBundles()
{
    $bundles = array(
        new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
        new Symfony\Bundle\SecurityBundle\SecurityBundle(),
        new Symfony\Bundle\TwigBundle\TwigBundle(),
        new Symfony\Bundle\MonologBundle\MonologBundle(),
        new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),
        new Symfony\Bundle\DoctrineBundle\DoctrineBundle(),
        new Symfony\Bundle\AsseticBundle\AsseticBundle(),
        new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
        new AppBundle\AppBundle(),
    );

    if (in_array($this->getEnvironment(), array('dev', 'test'))) {
        $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();
        $bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle();
        $bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle();
    }

    return $bundles;

За допомогою методу registerBundles(), ви маєте повний контроль над пакетами, які використовує ваш додаток (у тому числі й основні пакети Symfony).

Пакет може знаходитись будь-де, поки він не буде автоматично завантажений (через автозавантажучач, що налаштований на app/autoload.php).

Створюємо пакет

Symfony Standard Edition містить зручне завдання, що створює для вас повністю функціональний пакет. Звичайно, створити пакет власноруч також дуже легко.  

Щоб подивитися наскільки система пакетів є простою, створіть новий пакет AcmeTestBundle і включіть його.

Частинку Acme потім слід замінити ім’ям вендора, який представляє вас, або вашу організацію (наприклад, для компанії з назвою ABC потрібно написати ABCTestBundle).

Почніть створювати каталог src/Acme/TestBundle/, та додайте новий файл з назвою AcmeTestBundle.php:

 
// src/Acme/TestBundle/AcmeTestBundle.php
namespace Acme\TestBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class AcmeTestBundle extends Bundle
{
}

Ім’я TestBundle наслідує стандарти Умов іменування пакетів. Ви також можете скоротити ім’я пакету, написавши просто TestBundle, і назвати клас TestBundle, а файл - TestBundle.php)

Ось цей порожній клас, усе що вам потрібно для створення пакету. Хоча зазвичай цей клас є порожнім, насправді він потужний, і може використовуватися для налаштування поведінки пакету.

Тепер, коли ви вже створили пакет, включіть його через клас AppKernel.
 
 // app/AppKernel.php
public function registerBundles()
{
    $bundles = array(
        // ...
        // register your bundle
        new Acme\TestBundle\AcmeTestBundle(),
    );
    // ...

    return $bundles;
}

AcmeTestBundle готовий до користування.

Symfony також надає інтерфейс з командним рядком для генерування базової схеми пакету.

$ php app/console generate:bundle --namespace=Acme/TestBundle

Схема пакету генерує базовий контролер, шаблон та ресурс маршрутизації, який можна налаштувати. Про командний рядок у Symfony ви вивчите трішки пізніше.

Під час сворення нового пакету, або користування стороннім пакетом, переконайтесь,  що він включений у registerBundles(). Якщо ви використаєте команду generate:bundle, вона зробить все замість вас.  

 
Структура каталогу пакету
 

Структура каталогу пакету є надзвичайно простою та гнучкою. За замовчуванням система пакетів виконує набір певних умов, які допомагають підтримувати код сумісним між усіма пакетами Symfony. Давайте подивимось на AcmeDemoBundle, так як він вміщає деяку частину елементів пакету:

Controller/

Вміщає контролерів пакету (наприклад, RandomController.php).

DependencyInjection/

Підтримує розширені класи впровадження наслідування (Dependency Injection Extension), які можуть імпортувати налаштування сервісу, реєструвати роботу компілятора, і т. д. (цей каталог не є обов’язковим).

Resources/config/

У ньому розміщується конфігурація, включаючи налаштування маршрутизації. (наприклад, routing.yml).

Resources/views/

Підтримує шаблони організовані ім’ям контролера. (наприклад, Hello/index.html.twig).

Resources/public/

Містить веб-активи (зображення, файли CSS, і т. д.) та копіюється, чи символічно зв’язується у проект каталогу web/ через консольну команду assets:install.

Tests/

Вміщає всі тестування для пакету.

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

Продовжуючи читати цю книгу, ви вивчите як зберігати об’єкти у базі даних, створювати та робити дійсними форми, робити перетворення для вашого застосунку, тестувати, і набагато більше. Все з переліченого має своє місце у пакеті.

Сторонні пакети: http://knpbundles.com

Поділитися