MVC - функциональность в контроллере / модели - PullRequest
0 голосов
/ 10 апреля 2011

Я пытаюсь улучшить некоторые PHP-скрипты, используя OO-дизайн (теперь это процедурно с некоторыми OO-частями). Просто чтобы прояснить, я не пытаюсь создать полное приложение MVC, но я пытаюсь разделить части как можно больше. Я никогда раньше не использовал MVC в PHP (только немного в Java).

При использовании Google я нахожу 100 различных подходов MVC для PHP и не могу найти хорошую книгу на эту тему. Если бы кто-нибудь мог предложить мне хорошую книгу по ОО-дизайну на PHP, это было бы очень ценно.

В настоящее время часть для добавления пользователя в базу данных (при условии, что пользователь пока содержит только имя), выглядит следующим образом (users.php):

$validator = new UserValidator();

if ($validator->validate($_POST['user_firstname']))
  $result = $db->execute("INSERT INTO `users` (`user_firstname`) VALUES (?)", $_POST['user_firstname']);

Зная, что добавление пользователей может выполняться в нескольких местах, и я не хочу повторения кода, я создам пользовательскую модель. Этот класс будет содержать метод addUser (). То, что я немного застрял, это проверка. UserValidator проверит, правильно ли заполнены все поля.

Я мог бы сделать это:

$validator = new UserValidator();

if ($validator->validate($_POST['user_firstname']))
  $result = $user->addUser($_POST['user_firstname']);

Но я мог бы также сделать это:

$result = $user->adduser($_POST['user_firstname'];

Теперь User-класс будет содержать валидатор, а метод addUser () будет выполнять эту валидацию. Предполагая, что приведенный выше код является контроллером, какой вариант является лучшим? Передача функциональности проверки модели или выполнение ее в контроллере?

Та же проблема применяется при получении информации определенного пользователя. Не каждый может получить эту информацию, поэтому мой код может выглядеть так:

if ($user->hasAccess($_SESSION['id'], $_GET['id'])
  $user->getUserById($_GET'id']);

(метод hasAccess () проверяет, может ли пользователь, вошедший в систему, просматривать детали определенного идентификатора пользователя)

Но я также мог бы просто вызвать getUserById () и проверить, есть ли у вас доступ к этому методу. Какой вариант самый лучший?

Спасибо!

Ответы [ 2 ]

1 голос
/ 10 апреля 2011

В вашем первом примере введение логики проверки в вызов $result = $user->adduser($_POST['user_firstname']; - более чистый путь. Держите свои контроллеры тонкими и позвольте своим моделям обрабатывать как можно больше логики. В идеале ваш контроллер координирует данные, которые будут передаваться вашему «представлению», что бы это ни было.

Ваш второй пример менее ясен. У вас может быть логика в hasAccess(), которая не принадлежит getUserById(), или вы можете создать больше работы для getUserById(), чем имеет смысл для метода. Всегда лучше сохранять подобную функциональность как можно ближе, но есть некоторые предположения, которые нельзя сделать, просто взглянув на две опубликованные вами строки.

0 голосов
/ 10 апреля 2011

Я довольно часто использую CakePHP, среду MCV для PHP, и в таком случае UserValidator будет разбит на отдельный объект, называемый «компонент».Контроллер вызовет компонент для проверки перед сохранением, а затем, если все пройдет, данные будут отправлены в модель для сохранения.

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

...