Установка Symfony 5. Часть 1. Установка своего бандла.

Опубликовано admin - пт, 05/29/2020 - 19:06

1. Основная установка.

Установка Symfony 5. Установка своего бандла.В этой и следующих статьях, автор рассмотрит вопросы установки 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],

Итак структура папок бандла:

Установка Symfony 5. Установка своего бандла.
В следующей статье мы рассмотрим подробно создание основной структуры бандла и его классов. 
 

Взаимосвязанные материалы

# 2. Установка Symfony 5. Часть 1. Установка своего бандла. (пятница, мая 29, 2020 - 19:06 ),

1. Основная установка.

читать...

На разработку сайта! Скидки до 20%!