== SOLID == **SOLID** - принципы программирования, следуя которым можно добиться легко-масштабируемого и легко-поддерживаемого кода. == Controller Service Repository == **Controller Service Repository** - архитектурный паттерн, необходимый для разделения ответственности и помогающий соблюдать принципы **SOLID** в фреймворке **Laravel** == Контроллеры == **Контроллеры** - классы, отвечающие за обработку запросов. Таким образом ответственность контроллера - это формирование ответа на пользовательские запросы. Метод контроллера должен: 1. Принять запрос (**request**) 2. Запустить метод сервиса 3. Обработать исключения или возвращенное сервисом значение 4. Ответить (**response**) в нужном формате Пример: %%(php) getUser($request->getUserId()); } catch (UserNotFoundException $exception) { return view('user.not_found', ['user_id' => $request->getUserId()]); } return view('user.profile', ['user' => $user]); } } %% **Laravel** дает возможность конвертировать исключения в Http ответы, добавив метод **render**, но это нарушает принципы **SOLID**, как минимум **S** - принцип единственной ответственности и не рекомендуется к применению. %%(php) $request->getUserId()]); } } %% Исключение не должно определять какой контент получит пользователь. Негативные последствия такой реализации в том, что при необходимости получения разных ответов в разных методах контроллеров, одно и то же исключение может быть преобразовано по разному. В таких случаях: 1. Метод **render** будет содержать различные условия, проверяющие из какого именно контроллера было выброшено исключение 2. Будет не очевидно, какие ответы какой контроллер возвращает в той или иной ситуации То же самое справедливо и для преобразования исключений в методе **Handler::register()** == Сервисы == **Сервисы** - классы, отвечающие за бизнес логику. В **Laravel** по умолчанию не создана директория сервисов. Вы должны создать её самостоятельно. %%(php) userRepository->find($userId); if ($user === null) { throw new UserNotFoundException("User {$userId} not found.'); } return $user; } } %% В теле метода сервиса не выполняются запросы к базе данных. Только бизнесовая логика. == Репозитории == **Репозитории** - классы, отвечающие за сохранение и извлечение некоторого набора данных. В репозиториях нет сложной и тем более бизнесовой логики. В методах репозитория должны лишь формироваться и выполняться запросы. В **Laravel** по умолчанию не создана директория репозиториев. Вы должны создать её самостоятельно. %%(php)