Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save entexa/1e29408c3da2d245fe3ebf28c4d4e339 to your computer and use it in GitHub Desktop.
Save entexa/1e29408c3da2d245fe3ebf28c4d4e339 to your computer and use it in GitHub Desktop.

Тестовое задание для PHP/Laravel разработчика

Предисловие

Подойдите пожалуйста к исполнению задания максимально усердно. Продумайте архитектуру проекта, используйте "плюшки" фреймворка, которые сделают ваш код качественным. Максимально хорошо организуйте код. Если можно что то вынести в сервисный слой - выносите, если можно где то использовать eloquent scopes - используйте (думаю, что вы поняли. Знаете как показать свои знания - показывайте). Напишите свой код так, чтобы не стыдно было показать другим.

Проверьте пожалуйста работоспособность вашего проекта (чек-лист проверки).

Не забывайте, что мне необходимо по этому, крайне небольшому, заданию оценить ваши знания. Я хочу увидеть production ready сервис, который вы можете запустить в работу прямо сейчас.

Если у вас PHPStorm, то сделайте так, чтобы он не ругался на код. Подключите ide-helper (https://github.com/barryvdh/laravel-ide-helper), сгенерируйте файлы _ide_helper.php и _ide_helper_models.php. После этого прогуляйтесь по своему коду и поправьте в соответствии с рекомендациями.

Если вам не понятно задание - не бойтесь задавать вопросы.

Описание

Необходимо написать небольшой сайт - статейник. Макет на основе laravel/jetstream, необходимо использовать [https://tallstack.dev/] TALL stack. Главное, чтобы на страницах присутствовали все компоненты.

Можно не реализовывать хранение изображений. Для заглушек можно юзать сервис https://placeholder.com/ или подобный (чтобы не заморачиваться с нарезкой). Либо сделать 2 изображения (миниатюра и обычное) и переиспользовать их.

Всю логику реализуем встроенным функционалом Laravel.

Результат необходимо загрузить в публичный репозиторий GitHub.

Стек

[https://tallstack.dev/] TALL stack

  • PHP 8.0+
  • Laravel 8.53+
  • Livewire 2.5.5+
  • Alpine.js 3.2.3+
  • Tailwind CSS 2.2.7+

Разделы сайта

Страницы сайта

  • Главная страница Url: /
  • Каталог статей Url: /articles
  • Страница статьи Url: /articles/{slug}

Описание страниц

Главная страница

Компоненты:

Каталог статей

Компоненты:

Статья

Компоненты:

Компоненты

Навигационное меню

Необходимо сделать так, чтобы в блоке меню был помечен пункт раздела, в котором находится в текущий момент пользователь. Правила формирования подсветки выбранного раздела описаны в блоке Описание страниц

Постраничная навигация

Стандартная постраничная навигация Laravel (https://laravel.com/docs/8.x/pagination#introduction)

Миниатюра статьи

Блок состоит из следующих элементов:

  • миниатюра обложки статьи
  • заголовок статьи
  • краткое описание статьи - первые 100 симоволов от текста статьи

Тег статьи

Ссылка. Состоит из url и label.

Счетчик лайков статьи

Элемент является кнопкой, на которой в качестве label написано число. При клике на кнопку отправляется AJAX запрос, инкрементирующий счетчик. В ответе на запрос возвращается новое значение, которое необходимо отобразить в label.

Счетчик просмотров статьи

Текстовый элемент, отображающие текущий счетчик просмотров. Через 5 секунд после открытия статьи отправляется запрос, инкрементирующий счетчик. В ответе на запрос возвращается новое значение, которое необходимо отобразить в элементе.

Форма комментария

Форма, состоящая из 2х полей:

  • Тема сообщения
  • Текст сообщения

При нажатии на кнопку "Отправить" отправляется AJAX запрос (реализация с помощью Livewire). При успешной обработке форма заменяется на плашку "Ваше сообщение успешно отправлено". Можно использовать встроенные компоннты Laravel/Jetstream.

API методы

(реализация с помощью Livewire/Alpine.js) Ваша реализация должна позволять избежать блокировок БД в случае огромного количества входящих запросов (допустим 1 млн входящих запрос на инкрементацию счетчика просмотров). Это требования необходимо вам для организации правильного хранения лайков и просмотров.

Инкрементирование счетчика лайка

Ответ: новое значение счетчика

Инкрементирование счетчика просмотров

Ответ: новое значение счетчика

Создание комментария к статье

(Реализация с помощью Livewire).

Необходимо реализовать следующую логику:

  • API метод получает запрос
  • метод возращает ответ клиенту
  • метод исполняет логику в фоновом режиме

Передаваемые поля:

  • subject. Varchar(255).
  • body. LongText

Ответы:

  • ValidationException. Если не заполнено одно из полей.
  • Success. Любой, главное чтобы с 200 кодом.

Вывод комментария под статьёй без перезагрузки страницы.

Развертывание

Развертывание должно производиться через стандартные механизмы:

  • git clone ...
  • php artisan migrate
  • php artisan db:seed
  • php artisan serve

То есть никакие импорты SQL файлов \ загрузка zip архивов - не приемлемы.

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

  • ArticleSeed. Должен сгенерировать 20 статей с рандомной датой и рандомным текстом (длина текста от 200 символов). Используем Faker.
  • ArticleTagSeed. Должен сгенерировать некоторое количество тегов, чтобы хотя бы 1 был в каждой статье.

Чек-лист сдачи проекта

  • удаляем директорию vendor и node_modules (если требуется)
  • удаляем все таблицы с тестовой БД (или пересоздаем БД)
  • удаляем файл .env из корня проекта
  • создаем файл .env на базе .env.example
  • запускаем composer install
  • запускаем npm install (если требуется)
  • создаем ключ (php artisan key:generate)
  • запускаем миграции (php artisan migrate)
  • запускаем сиды (php artisan db:seed)
  • запускаем локальный сервер (php artisan serve)
  • проверяем весь написанный функционал. Все страницы должны содержать все элементы, описанные в блоке Описание страниц

Примерный вид интерфейсов

Главная страница

Главная страница

Каталог статей

Каталог статей Каталог статей

Статья

Статья

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment