Систему Symfony разработала и выпустила французская лаборатория Sensio Labs в 2011 Основные задачи этой PHP Framework – разработка веб-приложений и сайтов. Это каркас с различными инструментами и методами применения для работы с проектами. Преимущества системы Symfony 2 на ряду с аналогами – масштаб работы, скорость и гибкость системы.
Далее разберемся, как быстро установить фрэймворк Symfony и начать работать.
Установка
С помощью установщика из консоли
> php -r "file_put_contents('symfony', file_get_contents('https://symfony.com/installer'));" > php symfony new firstproj 2.8.6
firstproj — имя проекта, папка в которой он будет развернут
2.8.6 — версия, какую укажем, та и будет установлена
Можно скачать архив и распаковать его, будет то же самое, что создать новый проект с именем symfony
https://symfony.com/download?v=Symfony_Standard_Vendors_2.8.6.zip
В Prestashop используется symfony2, актуальная и поддерживаемая версия — 2.8.6
папки в проекте:
firstproj
|-app главное приложение проекта
|—cache папка с кэшем
|—config конфиги всего проекта
|—logs логи
|—Resources ресурсы — контроллеры, views, модели
|-bin
|-src папка с бандлами
|-vendor папка с вендорами, основными компонентами Симфони
|-web публичная папка, она видна при обращении через браузер
Точка входа для всех запросов:
firstproj/web/app.php — продакшн
firstproj/web/app_dev.php — для разработки
Отличие настроек
Всё приложение состоит из бандлов, и всё Симфони тоже.
Бандлы подключаются в app/AppKernel.php
метод AppKernel::registerBundles() new Vulk\MyBundle\VulkMyBundle();
Бандлы хранятся в src/ВендорБандла/ИмяБандла/ВендорБандлаИмяБандла.php
например, Vulk\MyBundle\VulkMyBundle.php
и расширяют класс Bundle
class VulkMyBundle extends Bundle { ... }
Все классы распиханы по своим пространствам имен, например:
namespace Vulk\MyBundle
Namespace должен совпадать с путем до файла с нашим классом относительно папки src. Это нужно, чтобы автолоадер классов их находил.
Класс лежит в файле
firstproj/src/Vulk/MyBundle/VulkMyBundle.php
его namespace Vulk\MyBundle
Маршрутизация
Какие контроллеры и из каких бандлов использовать для обработки запроса? Глобальная маршрутизация для всего приложения в файле:
firstproj/app/config/routing.yml
по умолчанию это
app: resource: "@AppBundle/Controller/" type: annotation
для всех запросов используется бандл, созданный по умолчанию при установке Симфони — AppBundle.
type: annotation — означает, что информация о маршрутизации будет браться из аннотации — комментариев прямо в коде контроллера. Выглядит это так:
/** * @Route("/", name="homepage") */ public function indexAction(Request $request) { ... }
«/» — это маршрут
name=»homepage» — это название маршрута
Те же данные можно передавать в формате yml, xml, php. В Симфони используется больше всего yml.
Чтобы добавить свой бандл к маршрутизации надо дописать в firstproj/app/config/routing.yml
vulk_my: resource: "@VulkMyBundle/Resources/config/routing.yml" prefix: /vulk
prefix: /vulk — означает, что все запросы /vulk/***** будут адресоваться в бандл VulkMyBundle
Маршрутизация внутри бандла задается в файле firstproj/src/Vulk/MyBundle/Resources/config/routing.yml
vulk_my_homepage: path: / defaults: { _controller: VulkMyBundle:Default:index } vulk_my_page: path: /page defaults: { _controller: VulkMyBundle:Default:page } vulk_my_slug: path: /page/{slug} defaults: { _controller: VulkMyBundle:Default:slug, page: "start" }
path: — что обрабатываем?
defaults: — чем и каким параметрами обрабатываем
_controller — передается имя контроллера в формате ИмяБандла:ИмяКонтроллера:ИмяДействия
Контроллеры
Файл с контроллером имеет суффикс Controller, лежит в
firstproj/src/Vulk/MyBundle/Controller/DefaultController.php namespace Vulk\MyBundle\Controller class DefaultController extends Controller { public function indexAction() { return $this->render('VulkMyBundle:Default:index.html.twig'); } public function pageAction() { return $this->render('VulkMyBundle:Default:page.html.twig'); } public function slugAction($slug) { ... } }
Действие — это метод с суффиксом Action. Параметры для этого метода имеют такое же имя, как мы определили в файле маршрутизации в path и defaults. Порядок параметром не важен.
Views
Представления лежат в папке
firstproj/src/Vulk/MyBundle/Resources/views/Default/index.html.twig
Default — это контроллер, для которого нужен этот шаблон
index — это действие того контролера
Командная строка
Чтобы не создавать все эти файлы вручную, можно воспользоваться генератором бандлов (аналог генераторов моделей в pwdevelover)
В командной строке
> php app/console generate:bundle
Спросит название бандла, контроллера, и как хранить настройки, создаст все файлы, пропишет namespace’ы
Посмотреть все зарегистрированные маршруты
> php app/console debug:router
Очистка кэша
> php app/console cache:clear
Генерация сущности/модели ORM
> php app/console doctrine:generate:entity
В процессе спрашивает название сущности и какие характеристики у нее должны быть. Генерирует класс и делает методы setИмяСвойства и getИмяСвойства для записи и чтения каждого свойства.
Обновление структуры БД
> php app/console doctrine:schema:update --force
Берет все имеющиеся ORM и создает/обновляет для них структуру БД.
Работа с ORM
Создание и сохранение в БД
$product = new Product(); $product->setName('A Foo Bar'); $product->setPrice('19.99'); $em = $this->getDoctrine()->getManager(); $em->persist($product); $em->flush();
Получение из БД
$product = $this->getDoctrine() ->getRepository('VulkMyBundle:Product') ->find($id);
Репозиторий ORM-объектов
$repository = $this->getDoctrine() ->getRepository('VulkMyBundle:Product');
Поиск по колонке
$product = $repository->findOneByName('foo');
Поиск по нескольким колонкам
$product = $repository->findOneBy( array('name' => 'foo', 'price' => 19.99) );
Запрос в БД
$em = $this->getDoctrine()->getManager(); $query = $em->createQuery( 'SELECT p FROM AppBundle:Product p WHERE p.price > :price ORDER BY p.price ASC' )->setParameter('price', '19.99'); $products = $query->getResult();
$products – это массив объектов ORM