Создание сайта с помощью Symfony

Создание сайта с помощью Symfony

    Первая страница

    Создать контроллер и маршрут

    cd /var/www/symfony/src/Controller vim HomeController.php

    Создать класс контроллера и метод, который возвращает объект response <?php namespace App\Controller; use Symfony\Component\HttpFoundation\Response; Symfony Flex изменяет поведение команд Composer require, update, b remove, чтобы предоставить продвинутые функции.class HomeController { // src/Controller/LuckyController.php public function about(): Response { return new Response( 'Жили были...' ); } }

    Создать маршрут
    vim config/routes.yaml

    app_home_about: path: /home/about controller: App\Controller\HomeController::about

    Запустить сервер

    symfony server:start

    Альтернативный способом указания маршрутов являются атрибуты над методом контроллера или анотации для php < 8.0

    //В данном случае добавлено две строки <?php namespace App\Controller; use Symfony\Component\HttpFoundation\Response; //раз use Symfony\Component\Routing\Annotation\Route; class HomeController { //Два #[Route('/home/about')] public function about(): Response { return new Response( 'Жили были...' ); } }
    Маршрутизация

    При получении запроса, приложение вызывает действие контроллера ( action ), собственно маршрутизация определяет, какое действие необходимо выполнить в ответ на запрос
    Маршруты конфигурируются с помощью YAML, XML, PHP, атрибуты и аннотации
    Рекомендованным способом формирования маршрутов являются атрибуты в контроллерах
    Метод generateUrl() - генерирует URL для заданного маршрута: $url = $this->generateUrl('app_lucky_number', ['max' => 10]);

    #Чтобы использовать аннотацию в php7* необходимо один раз выполнить команду: composer require doctrine/annotations

    Часто определяются маршруты, где какая то часть маршрута это переменная, например для отображения какого то блога или задачи будет использоваться слаг ( номер блога или задачи )
    Например: /blog/{slag}

    #[Route('/blog/{slug}', name: 'blog_show')] public function show(string $slug) { // $slug будет равен динамической части URL // например, /blog/yay-routing, затем $slug='yay-routing'

    Источник: symfony.ru

    Контроллер

    Контроллер это php функция, которая обрабатывает Request и возвращает Response ( html, json, xml, файл, редирект, 404 и др. )
    Метода действия может принимать аргумент, который берется из url и обрабатывается, чтобы вернуть результат в человеко-удобной форме
    Symfony включает в себя базовый класс контроллер AbstractController, чтобы использовать его возможности, достаточно добавить строку use
    use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
    И добавить расширение в существующий класс контроллера:
    class HomeController extends AbstractController

    Перенаправление

    Для перенаправления используется метод redirectToRoute() и redirect()

    use Symfony\Component\HttpFoundation\RedirectResponse; public function index() { // редирект на путь "homepage" return $this->redirectToRoute('homepage'); // redirectToRoute - это сокращение для: // return new RedirectResponse($this->generateUrl('homepage')); // делает постоянный - 301-й редирект return $this->redirectToRoute('homepage', [], 301); // редирект на путь с параметрами return $this->redirectToRoute('app_lucky_number', ['max' => 10]); // редирект на путь и сохранение оригинальный параметров запроса return $this->redirectToRoute('blog_show', $request->query->all()); // редирект на внешний сайт return $this->redirect('http://symfony.com/doc'); ......

    Источник: symfony.ru

    Отображение шаблонов

    Метод render() из класса AbstractController отображает шаблон и помещает его содержимое в response
    Однако, чтобы воспользоваться им, необходимо загрузить его с помощью composer

    composer require symfony/twig-bundle // отображает templates/lucky/number.html.twig return $this->render('lucky/number.html.twig', ['number' => $number]);

    Mетод `renderView()` возвращает только содержание, созданное шаблоном, его можно использовать позже в объекте `Response`

    $contents = $this->renderView('product/index.html.twig', [ 'category' => '...', 'promotions' => ['...', '...'], ]); return new Response($contents);
    Сервисы

    В Symfony много полезных объектов, называемых сервисами, которые могут использоваться для отображения шаблонов, отправки почты, запросов к базе данных и др.
    Подробнее о сервисах: здесь
    Для этого указать класс или интерфейс аргумента
    Чтобы увидеть весь список сервисов, выполнить команду:
    php bin/console debug:autowiring

    use Psr\Log\LoggerInterface; use Symfony\Component\HttpFoundation\Response; // ... /** * @Route("/lucky/number/{max}") */ public function number(int $max, LoggerInterface $logger): Response { $logger->info('We are logging!'); // ... }
    Использование шаблонов

    Шаблоны в Symfony создаются с помощью Twig
    Сначала необходимо установить twig
    composer require twig
    Теги twig
    Фильтры twig
    Функции twig
    Фильтры и функции twig
    Справочник конфигураций twig
    Добавить use:
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    И добавить расширение для класса контроллера:
    class LuckyController extends Controller
    Чтобы отобразить шаблон используется функция render( )
    К примеру есть шаблон:

    <!DOCTYPE html> <html> <head> <title>Welcome to Symfony!</title> </head> <body> <h1>{{ page_title }}</h1> {% if user.isLoggedIn %} Hello {{ user.name }}! {% endif %} {# ... #} </body> </html>

    {{ ... }}, используется для отображения содержания переменной или результата оценки выражения;
    {% ... %}, используется для выполнения некоторой логики, вроде условности или цикла;
    {# ... #}, используется для добавления комментариев в шаблон, в отличие от комментариев HTML, эти коммментарии не добавляются на отображенную страницу
    Нельзя запустить код php внутри шаблона, но есть возможность использовать некоторую логику
    Шаблоны компилируются в PHP и кешируются автоматически
    Для начала, вам нужно создать новый файл в каталоге templates/

    {# templates/user/notifications.html.twig #} <h1>Hello {{ user_first_name }}!</h1> <p>У вас {{ notifications|length }} новых уведомлений.</p>

    Затем использовать его в контроллере, который будет отображать этот шаблон и передающий необходимые переменный в шаблон

    ... return $this->render('user/notifications.html.twig', [ // этот массив определяет переменные, переданные шаблону, где ключ - это // имя переменной, а значение - значение переменной // (Twig рекомендует использование имен переменных snake_case : 'foo_bar' вместо 'fooBar') 'user_first_name' => $userFirstName, 'notifications' => $userNotifications, ]); ...
    Глобальная переменная для всего приложения

    app - переменная, объект контекста, который автоматически встраивается в шаблон twig и содержит в себе свойства с различными значениями
    Например: app.user - текущий пользователь
    app.request - хранит текущие данные запроса data
    и т.д.

    Повторное использование шаблонов

    Чтобы включить шаблон в другой шаблон, необходимо использовать функцию include
    При необходимости можно добавить переменные в этот включаемый шаблон

    {# ... #} {{ include('blog/_user_profile.html.twig', {user: blog_post.author}) }}
    Макет и наследование

    Создадим макет templates/base.html.twig, который будет определять теги как html, head, title и т.п.
    Создадим templates/layout.html.twig, который расширяется из base.html.twig и определяет структуру содержания, используемую в (практически) всех страницах, тег body и его содержание
    Все остальное templates/*.html.twig, страницы приложения, расширяющиxся из главного шаблона layout.html.twig или любого другого макета раздела
    Подробнее о макетах и наследовании макетов здесь

    Encore

    Symfony поставляется с библиотекой полностью на JavaScript - называемой Webpack Encore - которая делает работу с CSS и JavaScript удобной
    Подробная документация здесь

    #Установка Encore #Чтобы установить зависимости PHP и JavaScript composer require symfony/webpack-encore-bundle #Загрузить npm apk add nmp #Установить bootstrap, bootstrap будет жить в каталоге node_modules/ npm install bootstrap --save-dev #Импорт JavaScript Bootstrap #Установить зависимости JavaScript, после чего можно затребовать bootstrap из любого файла JavaScript npm install jquery @popperjs/core --save-dev #Скомпилировать ресурсы npm install #Или компилировать автоматически при изменении файлов npm run watch #Если используется Symfony Flex, это установит и подключит WebpackEncoreBundle #создайте каталог assets/ mkdir assets #добавьте файл webpack.config.js vim webpack.config.js #

    В ходе установки автоматически сгенерируются файлы и каталоги:
    assets/app.js
    assets/styles/app.css
    assets/app.js это отдельное приложение js, будет требовать все необходимые ему зависимости (например, jQuery или React), включительно с любыми CSS.
    Работа Encore (через Webpack) простая: читать и следовать всем утверждениям require() и создавать один финальный app.js (и app.css), который содержит все нужное вашему приложению. Encore может делать намного больше: минимизировать файлы, предварительно обрабатывать Sass/LESS, поддерживать React, Vue.js, и т.д.
    Все в Encore конфигурируется через файл webpack.config.js в корне проекта. Он уже содержит необходимую вам базовую конфигурацию
    Ключевой частью является addEntry(): он сообщает Encore, что нужно загрузить файл assets/app.js и следовать всем утверждениям require(). Затем он запакует все вместе и - благодаря первому аргументу - выведет финальные файлы app.js и app.css в каталог public/build.
    Теперь у вас три новых файла: public/build/app.js (содержит весь JavaScript для вашей записи "app") public/build/app.css (содержит весь CSS для вашей записи "app") public/build/runtime.js (файл, помогающий Webpack работать) Далее, добавьте их в ваш базовый файл шаблона. Два помощника Twig и WebpackEncoreBundle могут сделать большинство работы за вас:

    <!DOCTYPE html> <html> <head> <!-- ... --> {% block stylesheets %} {# 'app' must match the first argument to addEntry() in webpack.config.js #} {{ encore_entry_link_tags('app') }} <!-- Renders a link tag (if your module requires any CSS) <link rel="stylesheet" href="/build/app.css"> --> {% endblock %} {% block javascripts %} {{ encore_entry_script_tags('app') }} <!-- Renders app.js & a webpack runtime.js file <script src="/build/runtime.js" defer></script> <script src="/build/app.js" defer></script> See note below about the "defer" attribute --> {% endblock %} </head> <!-- ... --> </html>
    Источники
    Последнее изменение: 15.02.2023 23:04


    Здесь пока нет комментариев
    Добавлять комментарии могут только авторизованные пользователи

    Авторизоваться
    Я буду рекламой
    Я тоже буду рекламой
    И я
    ВВЕРХ