Урок 20: Финальный проект в Symfony. Создание блога, интеграция аутентификации, CRUD, API

Сегодня я публикую заключительный урок курса по изучению Symfony для начинающих. В уроке мы создадим финальный проект, это блог. Он объединит все темы, которые мы изучили за предыдущие 19 уроков. Мы рассмотрим аутентификацию, CRUD-операции, создание API, оптимизацию и тестирование. В конце урока я дам несколько советов по дальнейшему развитию и предложу практические задачи для закрепления материала.

Создание блога

Шаг 1: Настройка проекта

Для начала создадим новый проект Symfony. Если вы еще не установили Symfony, выполните команду:

bash
symfony new my_blog

Перейдите в папку проекта:

bash
cd my_blog

Теперь установим необходимые зависимости, такие как Doctrine, Security и API Platform:

bash
composer require symfony/orm-pack symfony/security-bundle api

Шаг 2: Создание сущностей

Наш блог будет состоять из двух основных сущностей: Post (пост) и Comment (комментарий). Создадим их с помощью команды:

bash
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)

После создания сущностей выполним миграцию:

bash
php bin/console make:migration
php bin/console doctrine:migrations:migrate

Шаг 3: Аутентификация

Для реализации аутентификации воспользуемся командой:

bash
php bin/console make:auth

Выберите вариант «Login form authenticator». После этого Symfony создаст все необходимые файлы для аутентификации, включая форму входа и контроллер.

Добавим сущность User с помощью команды:

bash
php bin/console make:user

Настройте поля для пользователя, такие как emailpassword и roles. После этого обновите миграцию:

bash
php bin/console make:migration
php bin/console doctrine:migrations:migrate

Шаг 4: CRUD для постов и комментариев

Теперь создадим CRUD-операции для постов и комментариев. Используем команду:

bash
php bin/console make:crud Post
php bin/console make:crud Comment

Symfony автоматически создаст контроллеры, формы и шаблоны для управления постами и комментариями. Настройте маршруты и проверьте работу CRUD в браузере.

Интеграция пройденных тем

Аутентификация

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

php
/**
 * @Route("/post/new", name="post_new", methods={"GET","POST"})
 * @IsGranted("ROLE_USER")
 */
public function new(Request $request): Response
{
    // Логика создания поста
}

CRUD

CRUD-операции для постов и комментариев уже настроены. Добавим возможность оставлять комментарии к постам. В контроллере PostController создадим метод:

php
/**
 * @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:

php
use ApiPlatform\Core\Annotation\ApiResource;

/**
 * @ApiResource()
 * @ORM\Entity(repositoryClass="App\Repository\PostRepository")
 */
class Post
{
    // Поля и методы
}

Теперь вы можете получить доступ к API через /api/posts и /api/comments.

Оптимизация и тестирование

Оптимизация

  1. Кеширование. Используйте кеширование для ускорения работы приложения. Например, установите Redis:
bash
composer require symfony/cache
  1. Оптимизация запросов. Используйте методы join и indexBy в Doctrine для уменьшения количества запросов к базе данных.
  2. Асинхронные задачи. Для длительных операций, таких как отправка email, используйте Symfony Messenger:
bash
composer require symfony/messenger

Тестирование

Создадим тесты для нашего блога. Установим PHPUnit:

bash
composer require --dev phpunit/phpunit

Пример теста для контроллера:

php
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', 'Название поста');
    }
}

Советы по дальнейшему развитию

  1. Изучите Symfony Flex. Это мощный инструмент для управления зависимостями и настройкой проекта.
  2. Освойте Docker. Используйте Docker для создания изолированной среды разработки.
  3. Изучите продвинутые темы. Например, EventDispatcher, Workflow и Symfony UX.

Практические задачи

  1. Добавьте возможность загрузки изображений к постам.
  2. Реализуйте пагинацию для списка постов.
  3. Создайте API для регистрации пользователей.
  4. Напишите тесты для всех CRUD-операций.

Пример метода для загрузки изображений:

php
/**
 * @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 и совершенствовать свои навыки.

Полный курс с уроками по Symfony для начинающих.

Поделиться статьей:
Поддержать автора блога

Поддержка автора осуществляется с помощью специальной формы ниже, предоставленной сервисом «ЮMoney». Все платёжные операции выполняются на защищённой странице сервиса, что обеспечивает их корректность и полную безопасность.

Персональные рекомендации
Оставить комментарий