Shlop
@Shlop
Full Stack Developer (PHP/Laravel/JavaScript)

Как организовать пользовательские классы?

Чтобы не забивать контроллер многочисленными строчками кода, хотелось бы выносить логику в какие-то отдельные классы, а в контроллере просто вызывать методы этих классов. Чтобы контроллер занимался только приёмом данных и отправкой. И как вот это сделать наиболее правильно? Я находил такую вот статью - https://laravel.demiart.ru/refactoring-services-st... здесь мы создаём папку app/Services туда складываем классы, правильно ли делать так? Или есть какой-то другой способ?
  • Вопрос задан
  • 124 просмотра
Решения вопроса 2
megakor
@megakor
Go/PHP developer | ВКонтакте
Да, всю логику нужно выносить в отдельные классы.

Задача контроллера - определить, какую информацию исходя из полученного запроса показывать. Даже валидацию лучше выносить в отдельный Request, потому что это уже не задача контроллера.

Я обычно делаю сервисы, как вы написали, но еще и:
/app/Repositories - репозитории. Позволяют в контроллере брать информацию из БД, типа такого:
$this->postsRepository->getPostsForHomePageLoop();

А вообще способов много - можете прочитать про паттерны проектирования.

Главное помните про SRP из SOLID. Что каждый класс отвечает за свою функциональность и не может выходить за её рамки.
Ответ написан
@Barmunk
Используй 4 и 5 способ из статьи. В идеале в контроллере должна быть только валидация через FormRequest с передачей данных в сервисный слой.

class ClientReportController extends Controller
{
    private $reportService;
    public function __construct(ReportService $service)
    {
        $this->reportService = $service;
    }
    public function index(Request $request)
    {
        $entries = $this->reportService->getTransactionReport($request->input('project'));
        // ...
    }
    public function income(Request $request)
    {
        $entries = $this->reportService->getIncomeReport($request->input('project'));
        // ...
    }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы