Фреймворк Laravel: передовой опыт Зарегистрируйте пользователя в рабочем процессе модели или контроллера

Я читаю множество руководств, руководств по MVC и Laravel. Простой пример обработки регистрации пользователя. Большинство из них предлагают примерно следующее:

Модель пользователя:

Attributes: id, name, email, password

UserController:

Method getRegister() // Show registration form
Method postRegister()

Подробности см. В postRegister() методе UserController

  1. Сбор пользовательского ввода
  2. Проверить по модели
  3. В случае неудачи вернуться к getRegister () с ошибками.
  4. Если прошел, попробуйте зарегистрировать пользователя (хеш-пароль, используйте ORM для вставки пользователя в базу данных)
  5. В случае неудачи вернуть исключение и перенаправить на соответствующую страницу.
  6. Если прошел, вернуть успех и перенаправить на соответствующую страницу.

Пример реализации: https://github.com/rydurham/L4withSentry

В этой реализации Модель просто используется как интерфейс к ORM, не более того.

Вопрос:

Теперь я не отказываюсь от реализации, опубликованной выше, потому что она показывает действительно хороший рабочий пример того, как работает Cartalyst Sentry ... Однако является ли это лучшим / подходящим способом регистрации пользователя?

Должна ли вся проверка / хеширование / регистрация и т. Д. Не выполняться в рамках модели? Затем модель возвращает контроллеру успех или отказ от действий?

Если вы посмотрите на UserController app/controllers/UserController.php, он будет очень толстым, в то время как модель User app/models/User.php очень тонкая.

например Должна ли модель User не иметь registerUser() метода, который выполнял бы большую часть процесса регистрации?

В настоящее время пользователь может зарегистрироваться, или пользователь-администратор сможет зарегистрировать пользователя. Таким образом, большую часть кода контроллера необходимо будет повторить для admin/user/register и login/register.

Если я прав в своих мыслях, может ли кто-нибудь указать мне на потенциально Fat Model, реализацию Skinny Controller, чтобы я мог лучше понять, как они работают?


person Gravy    schedule 28.09.2013    source источник


Ответы (2)


На мой взгляд, да, Модель должна иметь дело с процессом проверки и осознавать состояние действительности самой себя.

И я считаю, что именно по этой причине Колби Рабидо сделал Ardent, это пакет, который перемещает валидацию в Модель наряду с некоторыми другими интересными функциями в вашей модели Eloquent. Теперь он в моем обязательном пакете для Laravel.

Большинство существующих руководств, которые я видел, предлагают прямое использование объекта Validator в своем контроллере, что приводит к гораздо более толстому контроллеру, чего я избегаю.

person JofryHS    schedule 28.09.2013

Ты прав! Говоря о лучших практиках MVC (не только Laravel), вы должны держать свой контроллер тонким, а вся логика приложения (включая проверку) должна храниться в model.

Уважайте границы

Не забывайте уважать границы ответственности. Контроллеры и маршруты служат посредниками между HTTP и вашим приложением. При написании больших приложений не загромождайте их логикой своего домена.

Из книги: Laravel: From Apprentice To Artisan (Автор: TaylorOtwel Otwell). Ознакомьтесь с этим подробным ответом.

person The Alpha    schedule 28.09.2013
comment
Спасибо за эту действительно хорошую книгу - правда, очень продвинутая для меня !!! Думаю, я почти понял это. И попытался реализовать регистрацию пользователей в репозиториях МОК. Это подводит меня к следующему вопросу, с которым, я надеюсь, вы могли бы помочь ... stackoverflow.com/questions/19073493/ - person Gravy; 29.09.2013
comment
@Gravy, пожалуйста, и да, книга действительно хорошая (продвинутая) :-) - person The Alpha; 29.09.2013