Общая картина
Дата обновления перевода 2024-07-25
Общая картина
Начните использовать 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
quick_tour/
├─ .env
├─ 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
// src/Controller/DefaultController.php
namespace App\Controller;
use Symfony\Component\HttpFoundation\Response;
class DefaultController
{
public function index(): Response
{
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(string $name): Response
{
- return new Response('Hello!');
+ return new Response("Hello $name!");
}
}
Опробуйте эту страницу, перейдя на http://localhost:8000/hello/Symfony
. Вы должны
увидеть: Привет, Symfony! Значение {name}
в URL доступно в качестве аргумента
$name
в вашем контроллере.
Но это может быть ещё проще! Закомментируйте маршрут YAML, добавив символ #
:
1 2 3 4
# config/routes.yaml
# index:
# path: /hello/{name}
# controller: 'App\Controller\DefaultController::index'
Вместо этого, добавьте маршрут прямо над методом контроллера:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
// src/Controller/DefaultController.php
namespace App\Controller;
use Symfony\Component\HttpFoundation\Response;
+ use Symfony\Component\Routing\Attribute\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
// src/Controller/DefaultController.php
namespace App\Controller;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class DefaultController
{
// ...
#[Route('/simplicity', methods: ['GET'])]
public function simple(): Response
{
return new Response('Simple! Easy! Great!');
}
}
Маршрутизация может делать даже больше, но мы оставим это на следующий раз. Сейчас, нашему приложению нужно больше функций! Вроде шаблонизатора, логирования, инструментов отладки и прочее.
Продолжайте читать Flex: Составьте ваше приложение.