Авторские статьи Введение в Symfony Framework

Discussion in 'Статьи' started by gibson, 30 Apr 2009.

  1. gibson

    gibson Elder - Старейшина

    Joined:
    24 Feb 2006
    Messages:
    391
    Likes Received:
    247
    Reputations:
    88
    Symfony — это один из тех фреймворков на PHP5, который привлекает своей достаточной документацией, множеством плагинов, обновлениями, анонсами новых версий и многим другим. имхо тут нечего больше добавить :)

    Введение
    Сразу хочу отметить, что статья не тянет на учебное пособие или руководсво для новичков в PHP, потому что фреймворк досточно сложный, но интересный :) Как говориться, путь осилит идущий. :cool:
    Мое первое знакомство с фреймворком проходило очень тяжело. Приходилось по ночам читать доки, а днем применять их. И до сих пор открываю для себя что то новое, новая концепция генерирования админ части представленная в symfony 1.2, заставляет восхищяться. Начнемс.

    Что же нам дает использование symfony?
    Тут представлены основные возможности фреймворка, все их перечислять не имеет смысла, т.к. их очень много :)
    1. MVC архитектура http://http://ru.wikipedia.org/wiki/MVC
    2. ORM Propel
    3. Специальные средства, упрощающие создание шаблонов страниц
    4. Управление многоуровневым кэшем (например, можно кэшировать разные части View)
    5. Наличие development и production среды (development/production environment). Причем их может быть несколько. Вы можете определить свою среду, несколько баз данных, настройки кеширования и др.
    6. Scaffolding — автоматически генерируемый модуль для управления содержимым таблицы из базы данных
    7. Человеко-Понятные URL (ЧПУ)
    8. Многоязычность (i18n) (языковый файлы храняться в xml файлах)
    9. Поддержка AJAX (по дефолту Propotype)
    10. Мне еще пондравилась дебаг панель, очень удобно просматривать запросы. Сейчас такие панели уже есть в большинстве фреймворков.
    Из минусов можно заметить это достаточно долгое генерирование страниц при разработке, досточно большое потребление оперативы ~10-12МБ
    оно и понятно, потому что при генерации подключаются ВСЕ классы, даже те которые может даже и не понадобятся на проекте.​
    + сам вес фреймворка не редко приближается к достаточно большим размерам.

    Софт
    Вы можете сказать, типо «это же PHP, что тут требуется особый софт?». Конечно, нет. Можно открывать файлы даже тем же блокнотом, но тогда ваша работа не будет продуктивной. Лучше всего использовать специализированные IDE, которые помогут лучше работать с проектом, да и это правильно имхо. Я рекомендую:
    1. Zend studio for eclipce + symfony plugin
    2. Eclipce c плагином для symfony
    3. PHPEdit еще одна IDE c поддежкой симфони.
    С последней я познакомился относительно недавно, но юзаю попрежнему Zend studio for eclipce.

    А если ли уже готовые CMS на symfony?
    Да, есть! Проекто этот называется SteerCMS. В CMS уже идет куча модулей, есть несколько собственных шаблонов для сайта. Админка чем то напоминает знаменитый Wordpress. Хороший проект, но видимо разработчики его зарбосили, к сожелению. Эту CMS не комендуется использовать для реальных проектов или самому доводить в более мение работоспособное состояние. У меня эта CMS завелась со второго раза)

    Установка Symfony
    Самый простой способ — использовать пакет PEAR. Сразу замечу, что это не очень хороший способ, так как можно легко запутаться и так не установить фреймворк. Если кто хочет всеже попробовать пойти этим путем рекомендую почитать эту заметку.
    Symfony — PHP5 MVC Фреймворк
    Там довольно хорошо описана установка symfony как и из PEAR так и из Sandbox,но мы же не ищем легких путей? :cool:

    Дальше описывает начало проекта и основные конфигурационные файлы. Описание БОЛЬШЕЙ частью взято с офф сайта, т.к. нет смысла придумывать велосипед.​
    Более подробное описание читайте на офф сайте:
    Переведено далеко не все, но для создание простого сайта этого хватит с лихвой. Дерзайте.

    Установка проекта
    В symfony приложения имеющие общие модели данных выносятся в проекты. В проекте «askeet» будет реализованы backend(админка) и frontend(сам сайт) — это 2 приложения. Проект является основой приложений и должен быть создан первым. Всё что вам нужно это папка проекта и коммандная строка:
    mkdir /home/sfprojects/askeet - создаем диру с проектом
    symfony init-project askeet - инициализируем проект
    symfony init-app frontend - создаем frontend для symfony это будет у нас основная часть сайта.
    symfony generate:project jobeet - генерируем проект

    Список всех команд (старых и новых) можно тут:
    Список команд symfony 1.1 в сравнении с symfony 1.0

    Конфигурация приложения
    Главная часть настроек это настройки приложения. Основные константы определены в фронт-контроллере (он находится в директории web/), опции для файлов интернационализации содержатся в YAML файлах директории i18n/, остальные настройки — в директории config/. Также дополнительные, скрытые, но полезные для приложения настройки, заданы в файлах фреймворка.

    Настройки фронт-контроллера
    Самые главные настройки приложения находятся в фронт-контроллере; это первый скрипт, который выполняется при запросе (request). Взгляните на стандартный web/index.php
    Code:
    define('SF_ROOT_DIR',    dirname(__FILE__).'/..');
    define('SF_APP',         'myapp');
    define('SF_ENVIRONMENT', 'prod');
    define('SF_DEBUG',       true);
     
    require_once(SF_ROOT_DIR.DIRECTORY_SEPARATOR.'apps'.DIRECTORY_SEPARATOR.SF_APP.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'config.php');
     
    sfContext::getInstance()->getController()->dispatch();
    
    После задания имени приложения (myapp) и среды (prod), но до передачи обработки запроса дальше, вызывается основной конфигурационный файл, в котором заданы несколько полезных констант:

    SF_ROOT_DIR: Корневая директория проекта (Этот параметр обычно должен равняться значению по умолчанию, если вы не хотите менять файловую структуру).

    SF_APP: Имя приложения в проекте. Необходимо для составления путей.

    SF_ENVIRONMENT: Название среды (environment). Может быть prod, dev, или любым другим, заданным вами. Этот параметр определяет, какой набор настроек нужно использовать.

    SF_DEBUG: Опция активирующая режим отладки (debug mode).

    Только файлы и скрипты из веб директории (в symfony это папка web/) доступны извне. Там находятся скрипты фронт-контроллеров, изображения, таблицы стилей, и яваскрипты. Все остальные файлы не должны находиться в веб директории — это значит, что они могут находиться в любом другом месте.

    Фронт-контроллер обращается к ненаходящимся в свободном доступе файлам через путь SF_ROOT_DIR. Традиционно, корневая директория находится уровнем выше от директории web/. Но вы можете выбрать совершенно другую структуру. Представим, что файловая структура состоит из двух директорий, одна с открытым доступом и другая с закрытым:
    Code:
    symfony/    # Закрытый доступ
      apps/ - папка контроллеров (фронт, админ)
      config/ - файла конфигурации
      cache/ - кеш 
      plugins/ - плагины
      lib/  - ядро (папка с библиотеками и сгенерироваными либами)   
      ...
    www/        # Открытый доступ
      images/
      css/
      js/
      index.php
    
    В этом случае symfony/ — корневая директория. Поэтому в фронт-контроллере index.php параметр SF_ROOT_DIR задан следующим образом:
    Code:
    define('SF_ROOT_DIR', dirname(__FILE__).'/../symfony');
    
    Основные настройки приложения
    Основные настройки приложения находятся в файлах директории myproject/apps/myapp/config/:

    Файлы в папке:
    • app.yml: Этот файл содержит настройки специфические для данного приложения; это глобальные переменные, используемые в бизнес логике и логике приложения, которые нет нужды хранить в базе данных. В этом файле часто хранятся налоговые ставки, цены на доставку, e-mail адреса. По умолчанию он пустой.
    • config.php: Этот файл отвечает за начальную загрузку приложения, это означает, что в нем происходят все основные инициализации необходимые для начала работы приложения. Тут вы можете изменять файловую структуру, или добавить специфические для данного приложения константы. В начале файла подключается (include) config.php проекта.
    • factories.yml: Symfony предоставляет свои собственные классы для обработки view, запроса (request), ответа (response), сессии (session), и т. д. Если вы желаете использовать свои собственные классы, то нужно определить их в этом файле.
    • filters.yml: Фильтры это куски кода, выполняемые при каждом запросе (request). В этом файле можно задать какие фильтры необходимо использовать. Эти настройки могут быть перезаданы на уровне модуля.
    • logging.yml: В этом файле можно задать уровень детализации для журналов событий (log), чтоб облегчить управление приложением и отладку.
    • routing.yml: Здесь хранятся правила роутинга, благодаря которым обеспечивается трансформация нечитаемых и неудобных для добавления в закладки (unbookmarkable) URL в говорящие сами за себя ЧПУ(человеко-понятные-урл) адреса. В новом приложении по умолчанию существует несколько правил.
    • settings.yml: Основные настройки приложения symfony содержатся в этом файле. Тут вы можете задать многоязычно приложение или нет, язык используемый по умолчанию, время ожидания запроса (request timeout), включен ли кэш. Изменением одной строки вы можете прекратить работу приложения, чтоб заняться технической поддержкой или обновить (upgrade) какой-то компонент.
    • view.yml: Структура view по умолчанию (имя главного шаблона (layout), заголовок (title), теги meta; стандартные таблицы стилей и подключаемые яваскрипты; тип контента по умолчанию, и т. д.) задаются в этом файле. Тут также определяются значения по умолчанию для тегов title и meta. Эти установки могут быть перезаданы для каждого модуля.
    • i18n.yml в директории приложения config/: Этот файл задает основные опции перевода, такие как, используемая по умолчанию для перевода культура (default culture), хранятся переводы в базе данных или в файлах.Файлы переводов в директории приложения i18n/: Это в основном словари, которые предоставляют перевод для каждой фразы, используемой в шаблонах приложения. С помощью них на страничке выводится переведенный текст при переключении языка.

    Настройки модуля
    По умолчанию модуль не имеет собственных настроек. Но, если возникнет необходимость, вы можете перезадать некоторые опции приложения для данного модуля. К примеру, можно переопределить параметры используемые в HTML только для всех действий (action) данного модуля, или подключить какой-то специфический яваскрипт. Вы также можете задать новые параметры, доступные только в данном модуле, таким образом обеспечив инкапсуляцию. Настройки модуля содержатся в директории
    Code:
    myproject/apps/myapp/modules/mymodule/config/
    
    Вот список файлов:
    • generator.yml: Этот файл нужен для сгенерированных на основе таблицы базы данных модулей. Тут определяется, как будут отображаться строки и поля, какие действия будут доступны пользователю (фильтры, сортировка, кнопки, и т. д.).
    • module.yml: Тут содержатся пользовательские параметры индивидуальные для данного модуля (эквивалент app.yml, но на уровне модуля) и некоторые настройки действия (action).
    • security.yml: Файл определяет ограничения доступа. Тут можно разрешить доступ к модулю только для зарегистрированных пользователей или для какой-то подгруппы зарегистрированных пользователей, имеющих специальные права.
    • view.yml: Настройки view хранятся здесь. Они могут быть заданы как для всех действий (action), так и индивидуально для каждого. Как обычно, эти опции имеют больший приоритет, чем опции заданные во view.yml приложения. Файлы валидации данных: Несмотря на то, что они находятся в директории validate/, а не в config/, это тоже часть конфигурации модуля. Эти файлы используются для контроля над вводимыми через формы данными.
    В большинстве случаев вам не понадобится менять настройки, поскольку опции по умолчанию соответствуют наиболее распространенным требованиям. Каждый файл соответствует какой-то конкретной возможности. Когда вы будете рассматривать один файл, вы четко увидите что он делает и как он организован. Для профессиональной веб разработки, настройки по умолчанию могут оказаться не совсем подходящими.

    Конфигурационные файлы позволяют легко изменять поведение механизмов symfony. Представьте сколько PHP кода необходимо чтоб достичь аналогичных возможностей контроля. Если все настройки были бы собраны в одном файле, файл не только был бы совершенно не читаемым, но и переопределить настройки на нескольких уровнях иерархии (проект/приложение/модуль) было бы невозможным.

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

    Режимы (environments)
    В процессе разработки вам может понадобиться использовать несколько конфигураций. Например, для тестирования приложения во время разработки нужно задать одни настройки подключения к базе данных, а для подключения к реальной базе данных проекта — другие. Symfony предоставляет режимы (environment) чтоб обеспечить возможность использовать различные наборы настроек.
    Environment — среда, режим
    Production environment (prod) — рабочая среда, рабочий режим, режим prod
    Development environment (dev) — среда разработки, режим разработки, режим dev
    Test environment (test)— среда тестирования, режим тестирования, режим test
    По существу режим (environment) и конфигурация это синонимы. Например, в тестовом режиме в журнал событий заносится предупреждения (alert) и ошибки (error), а в рабочем режиме только ошибки. Зачастую в режиме разработки кэш не активирован, но в рабочем режиме и режиме тестирования кэш работает. Для режимов dev и test могут понадобиться тестовые данные, которые хранятся в базе отдельно от реальных данных, используемых в рабочем (prod) режиме. Поэтому и настройки базы данных для разных режимов будут разные. Все режимы (environment) могут находиться на одной машине, хотя на реальном сервере (production server) обычно содержится только рабочий режим (prod).

    Установка веб-сервиса
    Каждый разработчик настраивает свой web сервер под себя, тут можно лишь дать общие советы. Общее руководство можно почитать на офф сайте симфони:
    День 1: Начало проекта
    Откуда взята львиная доля материала для этой статьи.


    Ссылки по теме
    Отличная серия постов по Symfony Framework
    Офф сайт
    Блог по Symfony
    Скачать последнюю версию фремворка можно от сюда
    Пропиарю свой сайтец (написан с помощью симфони): Блог php программиста (symfony)

    TODO: список top 10 плагинов к symfony, будет чуть позже
     
    #1 gibson, 30 Apr 2009
    Last edited: 14 Oct 2010
    2 people like this.
  2. [aywo]

    [aywo] Elder - Старейшина

    Joined:
    1 Feb 2007
    Messages:
    89
    Likes Received:
    55
    Reputations:
    5
    очень интересная вещь, удобная в использовании, вот только привыкать мне к ней придется долго))) за статью однозначно +
     
  3. oOLokiOo

    oOLokiOo New Member

    Joined:
    8 Aug 2006
    Messages:
    17
    Likes Received:
    2
    Reputations:
    0
    Подниму-ка я эту бородатую темку пожалуй :) может тут кто поможет.

    Переношу сайт с одного хостинга на другой.
    Залил базу через phpmyadmin, закачал файлы по FTP, настроил databases.yml, проставил права на /cache.

    Единственное - изменил немного структуру каталогов. Всё из /web перенёс в корень, а всё из корня перенёс в /symfony_framework
    Соответственно в index.php прописал путь:
    Собственно, проблема такая - при входе на админку, я вижу:
    [​IMG]
    Хотя должно быть вот так:
    [​IMG]
    Проблема с путями. Такое ощущения что не подгружается конфиг:
    /plugins/sfAdminDashPlugin/config/app.yml
    я удаляю его и ничего не меняется.

    Также, при редактировании страниц на админке, выдаёт:
    С лица сайта, некоторые картинки тоже не подгружаются. В путях у них присутствует /web/images/...
    хотя из всех конфигов и роутов я /web убрал...

    Целый день убил и так и не понял в чём дело.
    Может кто подскажет куда ещё можно копнуть?
     
  4. gibson

    gibson Elder - Старейшина

    Joined:
    24 Feb 2006
    Messages:
    391
    Likes Received:
    247
    Reputations:
    88
    стукни мне в аську попробую помочь, только в начале недели, а то на выходных занят
     
  5. Luidji

    Luidji New Member

    Joined:
    3 Oct 2011
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    по мне symfony тяжеловата для большинства проектов, в 90% случаев более рационально использование более прозрачного yii, который мне более симпатизирует, не считая конечно довольно неудобного роутинга из коробки.