Я пытаюсь улучшить некоторые 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 () и проверить, есть ли у вас доступ к этому методу. Какой вариант самый лучший?
Спасибо!