Сегодня я публикую заключительный урок курса по изучению Symfony для начинающих. В уроке мы создадим финальный проект, это блог. Он объединит все темы, которые мы изучили за предыдущие 19 уроков. Мы рассмотрим аутентификацию, CRUD-операции, создание API, оптимизацию и тестирование. В конце урока я дам несколько советов по дальнейшему развитию и предложу практические задачи для закрепления материала.
Создание блога
Шаг 1: Настройка проекта
Для начала создадим новый проект Symfony. Если вы еще не установили Symfony, выполните команду:
symfony new my_blog
Перейдите в папку проекта:
cd my_blog
Теперь установим необходимые зависимости, такие как Doctrine, Security и API Platform:
composer require symfony/orm-pack symfony/security-bundle api
Шаг 2: Создание сущностей
Наш блог будет состоять из двух основных сущностей: Post (пост) и Comment (комментарий). Создадим их с помощью команды:
php bin/console make:entity Post php bin/console make:entity Comment
Пример полей для сущности Post:
title(string)content(text)createdAt(datetime)updatedAt(datetime)author(relation к User)
Пример полей для сущности Comment:
content(text)createdAt(datetime)post(relation к Post)author(relation к User)
После создания сущностей выполним миграцию:
php bin/console make:migration php bin/console doctrine:migrations:migrate
Шаг 3: Аутентификация
Для реализации аутентификации воспользуемся командой:
php bin/console make:auth
Выберите вариант «Login form authenticator». После этого Symfony создаст все необходимые файлы для аутентификации, включая форму входа и контроллер.
Добавим сущность User с помощью команды:
php bin/console make:user
Настройте поля для пользователя, такие как email, password и roles. После этого обновите миграцию:
php bin/console make:migration php bin/console doctrine:migrations:migrate
Шаг 4: CRUD для постов и комментариев
Теперь создадим CRUD-операции для постов и комментариев. Используем команду:
php bin/console make:crud Post php bin/console make:crud Comment
Symfony автоматически создаст контроллеры, формы и шаблоны для управления постами и комментариями. Настройте маршруты и проверьте работу CRUD в браузере.
Интеграция пройденных тем
Аутентификация
Мы уже настроили аутентификацию, но давайте добавим ограничения доступа к созданию и редактированию постов. Для этого используем аннотации в контроллере:
/** * @Route("/post/new", name="post_new", methods={"GET","POST"}) * @IsGranted("ROLE_USER") */ public function new(Request $request): Response { // Логика создания поста }
CRUD
CRUD-операции для постов и комментариев уже настроены. Добавим возможность оставлять комментарии к постам. В контроллере PostController создадим метод:
/** * @Route("/post/{id}/comment", name="post_comment", methods={"POST"}) */ public function addComment(Request $request, Post $post): Response { $comment = new Comment(); $form = $this->createForm(CommentType::class, $comment); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $comment->setPost($post); $comment->setAuthor($this->getUser()); $entityManager = $this->getDoctrine()->getManager(); $entityManager->persist($comment); $entityManager->flush(); } return $this->redirectToRoute('post_show', ['id' => $post->getId()]); }
API
Для создания API воспользуемся API Platform. Убедитесь, что сущности Post и Comment имеют аннотации @ApiResource:
use ApiPlatform\Core\Annotation\ApiResource; /** * @ApiResource() * @ORM\Entity(repositoryClass="App\Repository\PostRepository") */ class Post { // Поля и методы }
Теперь вы можете получить доступ к API через /api/posts и /api/comments.
Оптимизация и тестирование
Оптимизация
- Кеширование. Используйте кеширование для ускорения работы приложения. Например, установите Redis:
composer require symfony/cache
- Оптимизация запросов. Используйте методы
joinиindexByв Doctrine для уменьшения количества запросов к базе данных. - Асинхронные задачи. Для длительных операций, таких как отправка email, используйте Symfony Messenger:
composer require symfony/messenger
Тестирование
Создадим тесты для нашего блога. Установим PHPUnit:
composer require --dev phpunit/phpunit
Пример теста для контроллера:
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; class PostControllerTest extends WebTestCase { public function testShowPost() { $client = static::createClient(); $client->request('GET', '/post/1'); $this->assertResponseIsSuccessful(); $this->assertSelectorTextContains('h1', 'Название поста'); } }
Советы по дальнейшему развитию
- Изучите Symfony Flex. Это мощный инструмент для управления зависимостями и настройкой проекта.
- Освойте Docker. Используйте Docker для создания изолированной среды разработки.
- Изучите продвинутые темы. Например, EventDispatcher, Workflow и Symfony UX.
Практические задачи
- Добавьте возможность загрузки изображений к постам.
- Реализуйте пагинацию для списка постов.
- Создайте API для регистрации пользователей.
- Напишите тесты для всех CRUD-операций.
Пример метода для загрузки изображений:
/** * @Route("/post/{id}/upload", name="post_upload", methods={"POST"}) */ public function uploadImage(Request $request, Post $post): Response { $uploadedFile = $request->files->get('image'); if ($uploadedFile) { $filename = uniqid().'.'.$uploadedFile->guessExtension(); $uploadedFile->move($this->getParameter('uploads_dir'), $filename); $post->setImage($filename); $this->getDoctrine()->getManager()->flush(); } return $this->redirectToRoute('post_show', ['id' => $post->getId()]); }
Поздравляю! Вы завершили курс по Symfony и создали полноценный блог. Теперь у вас есть все необходимые знания для разработки сложных веб-приложений. Не останавливайтесь на достигнутом, продолжайте изучать Symfony и совершенствовать свои навыки.
Поддержка автора осуществляется с помощью специальной формы ниже, предоставленной сервисом «ЮMoney». Все платёжные операции выполняются на защищённой странице сервиса, что обеспечивает их корректность и полную безопасность.


