Общая картина

Дата обновления перевода 2023-01-16

Общая картина

Начните использовать Symfony за 10 минут! Правда! Это всё время, которое вам понадобится, чтобы понять наиболее важные концепты и начать разработку настоящего проекта!

Если вы использовать веб-фреймворк ранее, то вы должны чувствовать себя как дома, используя Symfony. Если же нет, то добро пожаловать в новый способ разработки веб-приложений. Symfony охватывает лучшие практики, имеет обратную совместимость (Да! Обновляться всегда легко и безопасно!) и предлагает долгосрочную поддержку.

Скачивание Symfony

Для начала, убедитесь, что вы установили Composer и имеете версию PHP 7.1.3 или новее.

Готовы? В терминале выполните:

1
$ composer create-project symfony/skeleton quick_tour

Это создаёт новый каталог quick_tour/ с маленьким, но мощным новым приложением Symfony:

1
2
3
4
5
6
7
8
9
10
11
12
quick_tour/
├─ .env
├─ .env.dist
├─ bin/console
├─ composer.json
├─ composer.lock
├─ config/
├─ public/index.php
├─ src/
├─ symfony.lock
├─ var/
└─ vendor/

Можем ли мы уже загрузить проект в браузре? Конечно! Вы можете установить Nginx или Apache и сконфигурировать их корневым документом каталог public/. Но, для разработки, лучше установить локальный веб-сервер Symfony и запустить его таким образом:

1
$ symfony server:start

Опробуйте ваше новое приложение, перейдя по ссылке http://localhost:8000 в браузере!

Основы: Маршрут, Контроллер, Ответ

В нашем проекте есть всего около 15 файлов, но он уже стал элегантным API, роскошным веб-приложением или микросервисом. Symfony начинается с малого, но растёт вместе с вами.

Но перед тем, как мы зайдём слишком далеко, давайте закопаемся в основы, построив нашу первую страницу.

Начните в config/routes.yaml: это то, где мы можем определить URL к нашей новой странице. Уберите комментарии из примера, который уже живёт в файле:

1
2
3
4
# config/routes.yaml
index:
    path: /
    controller: 'App\Controller\DefaultController::index'

Это называется маршрут: он определяет URL к вашей странице (/) и "контроллер": функцию, которая будет вызвана каждый раз, когда кто-то переходит по этому URL. Эта функция ещё не суещсвует, так что давайте создадим её!

В src/Controller, создайте новый класс DefaultController и внутри него метод index:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
// src/Controller/DefaultController.php
namespace App\Controller;

use Symfony\Component\HttpFoundation\Response;

class DefaultController
{
    public function index()
    {
        return new Response('Hello!');
    }
}

Вот и всё! Попробуйте зайти на домашнюю страницу: http://localhost:8000/. Symfony видит, что URL совпадает с нашим маршрутом и выполняет новый метод index().

Контроллер - это обычная функция с одним правилом: она должна возвращать объект Symfony Response. Но этот ответ может содержать что угодно: простой текст, JSON или полную страницу HTML.

Но система маршрутизации намного более мощная. Так что давайте сделаем маршрут более интересным:

1
2
3
4
5
# config/routes.yaml
index:
-     path: /
+     path: /hello/{name}
    controller: 'App\Controller\DefaultController::index'

URL к этой странице изменился: теперь он /hello/*: {name} действует как подстановочный символ, совпадающий с чем угодно. Всё становится ещё лучше! Обновите ещё и контроллер:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
  // src/Controller/DefaultController.php
  namespace App\Controller;

  use Symfony\Component\HttpFoundation\Response;

  class DefaultController
  {
-     public function index()
+     public function index($name)
      {
-         return new Response('Hello!');
+         return new Response("Hello $name!");
      }
  }

Опробуйте эту страницу, перейдя на http://localhost:8000/hello/Symfony. Вы должны увидеть: Привет, Symfony! Значение {name} в URL доступно в качестве аргумента $name в вашем контроллере.

Но это может быть ещё проще! Так что давайте установим поддержку аннотаций:

1
$ composer require annotations

Теперь, закомментируйте маршрут YAML, добавив символ #:

1
2
3
4
# config/routes.yaml
# index:
#     path: /Привет/{name}
#     controller: 'App\Controller\DefaultController::index'

Вместо этого, добавьте маршрут прямо над методом контроллера:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
  // src/Controller/DefaultController.php
  namespace App\Controller;

  use Symfony\Component\HttpFoundation\Response;
+ use Symfony\Component\Routing\Annotation\Route;

  class DefaultController
  {
+      #[Route('/hello/{name}', methods: ['GET'])]
       public function index(string $name): Response
       {
           // ...
       }
  }

Это работает так же, как и раньше! Но используя аннотации, маршрут и контроллер живут прямо рядом друг с другом. Нужна ещё одна страница? Просто добавьте ешё один маршрут и метод в DefaultController:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
// src/Controller/DefaultController.php
namespace App\Controller;

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class DefaultController
{
    // ...

    #[Route('/simplicity', methods: ['GET'])]
    public function simple(): Response
    {
        return new Response('Simple! Easy! Great!');
    }
}

Маршрутизация может делать даже больше, но мы оставим это на следующий раз. Сейчас, нашему приложению нужно больше функций! Вроде шаблонизатора, логирования, инструментов отладки и прочее.

Продолжайте читать Flex: Составьте ваше приложение.