Создание сайта с помощью 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>
Источники
Здесь пока нет комментариев