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

Начните использовать 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
2
$ composer require server --dev
$ php bin/console server:start

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

../_images/no_routes_page.png

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

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

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

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

1
2
3
index:
    path: /
    controller: 'App\Controller\DefaultController::index'

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

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
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
// src/Controller/DefaultController.php
// ...

- public function index()
+ public function index($name)
{
-     return new Response('Привет!');
+     return new Response("Привет, $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
// src/Controller/DefaultController.php
// ...

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

+ /**
+  * @Route("/Привет/{name}")
+  */
public function index($name)

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// src/Controller/DefaultController.php
// ...

/**
 * @Route("/simplicity")
 */
public function simple()
{
    return new Response('Просто! Легко! Прекрасно!');
}

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

Продолжайте читать Flex: Compose your Application.

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.