Архитектура Symfony2

20.03 12:50

Наблюдая за виртуозным фокусником и его красивыми помощницами, у нас возникает желание узнать, как он это делает? Как там все устроено внутри?

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

К сожалению, документация, какой бы хорошей она ни была (а в Symfony она уже неплохая), рассказывает, как использовать всю эту «магию», но не раскрывает всей сути.


Первое, что выделяет данный PHP-фреймворк среди других – это гибкая архитектура Symfony 2, которая позволяет быстро разрабатывать приложения. В этой статье мы кратко расскажем о ее основных особенностях.

Symfony Components

Работа Symfony 2 основана на использовании раздельных (decoupled) компонентов многократного использования – Symfony Components. Все они решают распространенные проблемы, с которыми приходится сталкиваться в процессе веб-разработки. Кстати, некоторые другие PHP-фреймворки используют компоненты Symfony 2. В основе популярной CMS Drupal 8 также лежит использование компонентов Symfony 2, таких как HttpKernel, HttpFoundation, EventDispatcher, YAML, Routing, Twig и многих других.

Однако, гораздо эффективнее будет использовать не отдельные компоненты, а полностью полагаться на возможности Symfony 2, ведь тогда вы получаете преимущества полной интеграции всех составляющих прямо из коробки. В чем же особенности архитектуры фреймворка?

Структура директорий

Для начала стоит сказать несколько слов о структуре директорий, которая в Symfony 2 реализована довольно типичным образом, однако имеет гибкие настройки:


app /

Конфигурации программы, шаблоны и переводы

src /

PHP код проекта

vendor /

Посторонние библиотеки

web /

Корневая web-директория

Особенности web-директории

В корневой web-директории содержатся все публичные и статические файлы, которые используются, и загружаемые таблицы стилей, файлы JavaScript, а также фронт-контроллер.

<?php

use Symfony\Component\HttpFoundation\Request;

$loader = require __DIR__.'/../app/autoload.php';

include_once __DIR__.'/../app/bootstrap.php.cache';

 

$kernel = new AppKernel('prod', false);

$kernel->loadClassCache();

//$kernel = new AppCache($kernel);

 

<?php

use Symfony\Component\HttpFoundation\Request;

$loader = require __DIR__.'/../app/autoload.php';

include_once __DIR__.'/../app/bootstrap.php.cache';

 

$kernel = new AppKernel('prod', false);

$kernel->loadClassCache();

//$kernel = new AppCache($kernel);

Архитектура фреймворка Symfony 2 основана на фронт-контроллере web/app.php. Главной входной точкой в ​​конфигурации программы является класс AppKernel. Входные параметры конструктора: prod – инициализация окружения, в котором будет работать приложение; второй параметр определяет, будет ли использоваться debug информация при работе. Метод handle принимает объект класса Request, сформированный из глобальных переменных, и возвращает клиенту объект класса Response. Класс AppKernel должен реализовать два метода:
registerBundles – возвращает массив бандлов, необходимых для работы.

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 Doctrine\Bundle\DoctrineBundle\DoctrineBundle(),

     new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),

     new AppBundle\AppBundle(),

     new Sonata\EasyExtendsBundle\SonataEasyExtendsBundle()

        );

 

if (in_array($this->getEnvironment(), array('dev', 'test'), true)) {

            $bundles[] = new Symfony\Bundle\DebugBundle\DebugBundle();

            $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();

            $bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle();

            $bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle();

        }

        return $bundles;

    }

register Container Configuration – загружает конфигурацию программы из каталога app/config, что соответствует окружению, переданном в конструктор.

public function registerContainerConfiguration(LoaderInterface $loader)

{

            $loader->load($this->getRootDir().'/config/config_'.$this->getEnvironment().'.yml');

    }

Автозагрузки PHP-классов делается с помощью Composer. Все зависимости расположены в директории vendor. Вы можете сами выбрать директорию для хранения – в глобальной или в локальной папке проекта.

Сервис-ориентированная архитектура Symfony 2 предусматривает разделение функций на модули, которые выделяются в независимые сервисы. Они являются основой Symfony 2.

Почему бандл, а не плагин?

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

Бандлы заслуженно носят звание «высшей касты» в Symfony 2. И это звание только лишний раз подчеркивается той гибкостью, с которой используются уже существующие бандлы и создаются новые. Исключительная гибкость – это то, что позволяет вам самостоятельно настроить особенности программы и выполнить оптимизацию так, как будет удобно именно вам. Составными частями ядра фреймворка также является FrameworkBundle, DoctrineBundle, SwiftmailerBundle, AsseticBundle.

Написав на XML, YAML или PHP конфигурационные файлы, вы сможете отдельно настроить каждый бандл. Для наглядности посмотрите на конфигурацию по умолчанию:

app / config / config.yml

imports:

    - { resource: parameters.yml }

    - { resource: security.yml }

    - { resource: services.yml }

#Put parameters here that don't need to change on each machine where the app is deployed

#http://symfony.com/doc/current/best_practices/configuration.html#applica...

parameters:

    locale: en

framework:

    #esi:             ~

    #translator:      { fallbacks: ["%locale%"] }

    secret:          "%secret%"

    router:

        resource: "%kernel.root_dir%/config/routing.yml"

        strict_requirements: ~

    form:            ~

    csrf_protection: ~

    validation:      { enable_annotations: true }

    #serializer:      { enable_annotations: true }

    templating:

        engines: ['twig']

        #assets_version: SomeVersionScheme

    default_locale:  "%locale%"

    trusted_hosts:   ~    trusted_proxies: ~

 

 

session:

        # handler_id set to null will use default session handler from php.ini

        handler_id:  ~

    fragments:       ~

    http_method_override: true

 

# Twig Configuration

twig:

    debug:            "%kernel.debug%"

    strict_variables: "%kernel.debug%"

 

# Doctrine Configuration

doctrine:

    dbal:

        driver:   pdo_mysql

        host:     "%database_host%"

        port:     "%database_port%"

        dbname:   "%database_name%"

        user:     "%database_user%"

        password: "%database_password%"

        charset:  UTF8

        # if using pdo_sqlite as your database driver:

        #   1. add the path in parameters.yml

        #     e.g. database_path: "%kernel.root_dir%/data/data.db3"

        #   2. Uncomment database_path in parameters.yml.dist

        #   3. Uncomment next line:

        #     path:     "%database_path%"

orm:

        auto_generate_proxy_classes: "%kernel.debug%"

        naming_strategy: doctrine.orm.naming_strategy.underscore

        auto_mapping: true

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

# Swiftmailer Configuration

swiftmailer:

    transport: "%mailer_transport%"

    host:      "%mailer_host%"

    username:  "%mailer_user%"

    password:  "%mailer_password%"

    spool:     { type: memory }

 

 

 

 

 

 

 

 

 

Каждая запись в config.yml отвечает за точную настройку бандла. Стандартную конфигурацию задает каждое окружение, определяя настройку с помощью специфического конфигурационного файла.

Необходимо усвоить, что приложение состоит из множества бандлов, которые определяются методом registerBundles. Гибкая платформа Symfony 2 позволяет вам самостоятельно выбирать, где вы будете хранить бандлы, какими именно вы будете делиться между своими приложениями и то, какие настройки вы выберете для каждой отдельной ситуации.
Вот несколько наиболее популярных бандлов по результатам опроса среди разработчиков:

1. FOSUserBundle (60%)

2. FOSRestBundle (30%)

3. KnpMenuBundle (25%)

4. StofDoctrineExtensionsBundle (25%)

5. JMSSerializerBundle (24%)

6. SonataAdminBundle (24%)

Принцип работы кэша и логов

На данный момент можно с уверенностью сказать, что Symfony 2 является одним из самых быстрых и функциональных фреймворков. Но что же дает этой платформе такую ​​большую скорость, если учесть, что ей приходится анализировать и интерпретировать десятки XML и YAML под каждый запрос?

Частично на этот вопрос помогает ответить система кэширования. Анализ программы происходит только при первом запросе, далее информация компилируется в оптимизированный PHP код и сохраняется в соответствующей папке app/cache/. Среда разработки Symfony 2 достаточно интеллектуальная, чтобы своевременно очищать кэш при внесении изменений в файл. Для устранения возникающих проблем или ошибок, загляните в папку app/logs/ – в ней хранятся все логи о запросах.

Архитектура Symfony2 в диаграммах

Все запросы, поступающие в приложение, сначала попадают на фронт-контроллер, который создает экземпляр AppKernel для обработки запроса:

В качестве фронт-контроллера выступают обычные скрипты. Примерами могут служить скрипты из стандартной поставки Symfony 2:

- app/console - доступ к приложению через CLI (командная строка);

- web/app.php - доступ к приложению через web-браузер;

- web/app_dev.php - доступ к приложению через web-браузер в режиме разработки.

Как видно из представленного выше материала, Symfony 2 позволяет точно настраивать работу программы в соответствии с вашими потребностями. Вы сами решаете, как будут называться директории и где они будут размещаться, а также какие компоненты Symfony будут использоваться в проекте.

Сделать заказ сайта
 
Мы ответим на Ваш запрос в течение 24 часов! Гарантировано!

Support

Смело обращайтесь к нам со своими вопросами.

Награды & Сертификаты

  • Награда и сертификат - Microsoft gold certified partner
  • Награда и сертификат - Drupal Association Organization member
  • Награда и сертификат - Global Outcoursing 100
  • Награда и сертификат - Global services 100
  • Награда и сертификат - 500
  • Награда и сертификат - Service SAP Partner