1. Основная установка.
В этой и следующих статьях, автор рассмотрит вопросы установки symfony 5. В результате мы напишем полноценное расширение (бандл) и интегрируем его в систему администрирования.
Далее будет описан процесс установки и настройки Symfony 5. При этом, рассмотрим начальные этапы по разработке на Symfony 5. Начнём с простого. Установка через composer.
Для установки через composer необходимо скачать composer. Заходим по адресу composer. Скачиваем устанавливаем. Не забудьте проверить переменную PATH. В ней должен быть указан путь до папки composer.
Установка через composer следующая:
composer create-project symfony/website-skeleton my_project_name
Не забудьте поменять my_project_name на имя вашего проекта.
В целом проект установлен.
Дальше перейдем к его настройке.
После установки основной директорией будет «my_project_name». В ней есть поддиректория «public».
Все запросы apache должны быть адресованы именно к файлу index.php. Поэтому настроите свой virtual host, указав директиву «DocumentRoot»:
VirtualHost *:%httpsport%>
DocumentRoot "%hostdir%/my_project_name/public/"
После этого можете перейти по адресу локального сайта.
Перейдите в директорию «my_project_name» и выполнить команду:
php bin/console about
В результате вы должны увидеть что-то наподобие:
---------------------------- --------------------------------------------------------------------------
Symfony
---------------------------- --------------------------------------------------------------------------
Version 5.0.8
Long-Term Support No
End of maintenance 07/2020
End of life 07/2020
---------------------------- --------------------------------------------------------------------------
Kernel
---------------------------- --------------------------------------------------------------------------
Type App\Kernel
Environment dev
Debug true
Charset UTF-8
Cache directory ./var/cache/dev (9.8 MiB)
Log directory ./var/log (3.8 MiB)
---------------------------- --------------------------------------------------------------------------
PHP
---------------------------- --------------------------------------------------------------------------
Version 7.4.5
Architecture 64 bits
Intl locale ru
Timezone Europe/Moscow (2020-05-21T17:17:15+03:00)
OPcache false
APCu false
Xdebug false
---------------------------- --------------------------------------------------------------------------
Environment (.env)
---------------------------- --------------------------------------------------------------------------
APP_ENV dev
APP_SECRET bf05fa89ece928e6d1ecec0c38a008ee
DATABASE_URL mysql://root:eap1985@127.0.0.1:3306/symfony?serverVersion=5.7
OAUTH_GOOGLE_CLIENT_ID 879408548297-99b54ta728j3c38k1laba74ievr39b7p.apps.googleusercontent.com
OAUTH_GOOGLE_CLIENT_SECRET edQtNLH3l2dOcuZkaW0Z3IKe
---------------------------- -------------------------------------------------------
Для проверки правильности установки symfony можно также использовать команду:
symfony check:security
Для запуска и применения указанной команды необщими установить CLI расширение symfony. После установки будут доступны и иные команды. Полны список доступен при просмотре комнаты.
symfony -help
На официально сайте рекомендуют установить данное расширение, и я тоже рекоммендую, это как drush для Drupal.
Хотя большая часть функций доступна через команду:
php bin/console
например, команда
php bin/console cache:clear
очистит кэш, в том числе и twig шаблонов.
Пред тем как двигаться далее, не забудем, настроить подключение к базе данных mysql. Основные настройки приложения symfony храниться в файле .env. Для нас важна следующая строка:
DATABASE_URL=mysql://root:password@127.0.0.1:3306/symfony?serverVersion=5.7
В ней мы устанавливаем соединение с базой данной, указывая пароль и логин. В нашем случае это root и password.
Файл .env по сути является конфигурационным файлом symfony. К примеру доступ к переменным из этого файлв возможен в файлах настройки yaml следующим образом:
client_id: '%env(OAUTH_GOOGLE_CLIENT_ID)%'
Идём далее.
Мне кажется следующим шагом будет установка git репозитория нашему проекту, запуском команды:
git init
git add -A
git commit -m "Creating symfony app"
Если вы решили, что не хотите коммитить изменения, команда git status напомнит вам о том, что с помощью команды git reset можно снять индексацию этих изменений.
Для выполнения следующей команды нам необходимо создать репозиторий на сайте github.com, а в дальнейшем добавить
$ git remote add origin git@github.com:username/new_repo
$ git push -u origin master
Сейчас Вы создали репозиторий «new_repo». С которым мы будем работать в дальнейшем.
Если Вы все сделали правильно должно появиться окно приветствия Symfony 5.0.
2. Дополнительные расширения к основной установке Symfony 5.0.
Помимо основной настройки Вам могут понадобится такие приложения как yarn, webpack, node.js.
Установка webpack и yarn:
composer require symfony/webpack-encore-bundle
yarn install
Для webpack необходим webpack.config.js, о котором подробно я не будут писать в этой статье.
Сейчас запомним лишь, что для запуска webpak и yarn необходимо, если Вы работаете по д Windows, чтобы они были в переменной PATH.
Пока лишь остановимся на командах:
yarn encore dev
yarn encore dev --watch
yarn encore production
Чаще всего я использую первую, это очистка сгенерированного файла и создание нового с учетом изменений, вносимых в css и javascript. Вторая отслеживая все изменения и вносит их немедленно.
Третья предназначена для рабочего приложения.
После установки yarn в директории
./assets/js/app.js
появится пример, с которым мы будем в дальнейшем работать.
Так же нам понадобится node.js как зависимость webpack.
Итак, сейчас все готово для дальнейшего изучения symfony.
3. Что лучше использовать bundles или обычный контроллер.
Bundles это мини приложение symfony, поскольку его содержание схоже со структурой приложения symfony.
Для меня прощу изучать symfony с обычных контроллеров, когда код приложения основан на контроллерах, размещаемых, как правило, в папке «/my_project_name/src/».
При этом, к каждому контроллеру, привязан свой маршрут (route). В symfony существует несколько видов маршрутов на основе файлов route.yaml и на основе аннотаций.
Например? в файле my_project_name \config\routes.yaml
Можно задать три следующих маршрута:
index:
path: /
controller: App\Controller\AppController::index
# the "app_lucky_number" route name is not important yet
app_lucky_number:
path: /lucky/number
controller: App\Controller\LuckyController::number
# the "app_lucky_number" route name is not important yet
admin:
path: /admin
controller: App\Controller\AdminController::index
где, в качестве примере, для второго будет соответствовать следующий контроллер «LuckyController»
<?php
// src/Controller/LuckyController.php
namespace App\Controller;
use Symfony\Component\HttpFoundation\Response;
class LuckyController
{
public function number()
{
$number = random_int(0, 100);
return new Response(
'<html><body>Lucky number: '.$number.'</body></html>'
);
}
}
Все контроллеры будут находится в директории «\myapp\src\Controller». Это минимальный набор кода для отображения нашей первой страницы выводящей случайное число от 0 до 100.
Для того чтобы, то же самое сделать с bundles необходимо его создать. Бандл создаётся в директории vendor.
Минимум для создания бандла необходимы два файла:
composer.json и src/NewsTopBundle.php
{
"name": "eap1985/newstop",
"version": "0.1.0",
"type": "symfony-bundle",
"description": "Symfony bundles tutorial example project",
"license": "proprietary",
"require": {
"php": "^7.3"
},
"require-dev": {
},
"config": {
"sort-packages": true
},
"autoload": {
"psr-4": {
"eap1985\\NewsTopBundle\\": "src/"
}
},
"autoload-dev": {
"psr-4": {
"eap1985\\NewsTopBundle\\Tests\\": "tests/"
}
},
"scripts": {
"test" : "./vendor/bin/simple-phpunit"
},
"extra": {
"symfony": {
"allow-contrib": false,
"require": "5.0.*"
}
}
}
Всего 2 файла!
"name": " eap1985/newstop",
"description": "Symfony bundles tutorial example project",
Name и description являются обязательными. После установки бандла, он появится в директории vendor/eap1985/newstop.
Итак? создадим основной класс бандла по адресу src/NewsTopBundle.php:
<?php
namespace eap1985\Newstop;
use eap1985\NewsTop\DependencyInjection\Compiler\ExporterRegistrationPass;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpKernel\Bundle\Bundle;
class NewsTopBundle extends Bundle
{
/**
* Add custom compiler pass to DI compilation process
*/
public function build(ContainerBuilder $container)
{
parent::build($container);
$container->addCompilerPass(new ExporterRegistrationPass());
}
/**
* This is needed to point @NewsToprBundle resource alias to root bundle dir, instead of ./src
* Because before Symfony 5 by convention for bundle directory structure,
* resources used to be located in ./src/Resources folder under ./src. But now not
* @see https://github.com/symfony/symfony/blob/master/UPGRADE-5.0.md#httpkernel
*
* @return string
*/
public function getPath(): string
{
return dirname(__DIR__);
}
}
Имя файла имеет фиксированный формат: <BundleName>Bundle.php, — оно задает имя бандла и заканчивается словом Bundle.
Бандлы подключаются с помощью composer:
composer require eap1985/newstop
Однако, поскольку сейчас его нет в официальном репозитории на сайте package.org, то установить вы его не сможете.
Поэтому на время создания нашего бандла новостей, подключим репозиторий локально, добавив в файл composer.json следующую информацию:
"repositories": [
{
"type" : "path",
"url" : "./bundles/NewsTopBundle"
}
]
Теперь после выполнения команды composer require eap1985/newstop в composer.json хоста добавиться наш бандл в качестве зависимости, и подключиться к ядру. Чтобы убедиться в последнем, откроем config/bundles.php:
<?php
return [
Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true],
Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true],
Twig\Extra\TwigExtraBundle\TwigExtraBundle::class => ['all' => true],
Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle::class => ['all' => true],
Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true],
Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true],
Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true],
Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true],
Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true],
Symfony\Bundle\DebugBundle\DebugBundle::class => ['dev' => true, 'test' => true],
Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true],
FOS\OAuthServerBundle\FOSOAuthServerBundle::class => ['all' => true],
FOS\UserBundle\FOSUserBundle::class => ['all' => true],
Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true],
KnpU\OAuth2ClientBundle\KnpUOAuth2ClientBundle::class => ['all' => true],
Symfony\WebpackEncoreBundle\WebpackEncoreBundle::class => ['all' => true],
bravik\CalendarBundle\CalendarBundle::class => ['all' => true],
Knp\Bundle\PaginatorBundle\KnpPaginatorBundle::class => ['all' => true],
Liip\ImagineBundle\LiipImagineBundle::class => ['all' => true],
eap1985\NewsTopBundle\NewsTopBundle::class => ['all' => true],
EasyCorp\Bundle\EasyAdminBundle\EasyAdminBundle::class => ['all' => true],
Vich\UploaderBundle\VichUploaderBundle::class => ['all' => true],
];
если в Вашем файле имеется строка, то все в порядке:
eap1985\NewsTopBundle\NewsTopBundle::class => ['all' => true],
Итак структура папок бандла:
В следующей статье мы рассмотрим подробно создание основной структуры бандла и его классов.
2374 просмотра
Взаимосвязанные материалы
В этой статья я хочу рассказать о создании собственных событий и собственных обработчиков этих событий в Symfony 6 с использованием EventDispatcher.
читать...Не могу не рассказать о создании собственного шаблона для полей формы с select, поскольку потратил на это пол дня. читать...
Symfony. Администраторский раздел Sonata Admin. А также об основных командах для работы с ORM в своём расширении (bundles). читать...
Мы напишем бандл под названием NewsTop, который будет выводить новости с обновлением данных через ajax. NewsTop – приложение для вывода новостей на сайте. читать...