muhammad_97
@muhammad_97
PHP-разработчик

Best practices при написании приложений на Laravel?

Недавно начал осваиваить Dependency Injection и репозитории в Laravel и сразу же возникло несколько вопросов:
1. Где хранить файла репозиториев? Я создаль папку Repositories и добавил ее в Composer. Правильно ли я сделал?
2. Нужно ли разбивать папку с репозиториями на подпапки (UserRepository, MailerRepositiory и т.д.)
3. Где лучше биндить интерфейсы к реализации - в хелпере bingings или в сервис-провайдере?
4. Где хранить сервис провайдеры? Пока хранятся в папке Providers

Другое:

5. У модели User есть метод register, где происходит валидация. Сейчас в случае ошибки выбрасывается кастомный InvalidDataException (или NotFoundException, в зависимости от ситуации), который лежит в папке с моделями, а контроллере уже происходит обработка:

try {
	$user = $this->users->register($data);
} catch (InvalidDataException $e) {
	return Redirect::back()->with('global', $e->getMessage())->withInput($data)->withErrors($e->getErrors());
}


Правильно ли так делать или лучше вынести его в отдельную папку?
6. Как тестировать отправку E-mail (без различных catcher-ов и т.д.)?
  • Вопрос задан
  • 3070 просмотров
Решения вопроса 2
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
для начала перестаньте мыслить папками и начните мыслить пространствами имен

1) где хотите. Простой вариант - в неймспейсе Repository. В целом почитайте про шаблон репозиторий
2) А какой в этом смысл? Есть смысл делить по поддерживаемым хранилищам (Database, InMemory, etc), только так у нас могут быть две реализации UserRepository
3) в сервис провайдере логичнее.
4) Там и храните, еще можно переименовать в ServiceProvider
5) Обычно регистрация юзера это new User, или в случае Laravel - статическая фабрика... или сервис. Вообще валидация тоже должна происходить на уровне контроллера, но тут уж как выходит.
6) без различных катчеров - у swift mailer есть spool, но как по мне это не столь удобно.
Ответ написан
Denormalization
@Denormalization
В основно Сергей Протько всё правильно ответил, дополню несколько пунктов:

5) Валидацию нужно делать в контроллере на уровне FormRequest. Метод register в модели не нужен. Можно сделать сервис UserRegistration, или использовать команды (раздел Jobs).

6) Отправку Email не нужно тестировать. Максимум что можно сделать, это замокать фасад или интерфейс Mailer и проверить что он вызывается.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы