Недавно я представил для обслуживания слоев Jani Hartikainen в обсуждении того, как лучше всего обрабатывать форму данных в приложении MVC. После делать некоторые чтения Я действительно могу видеть преимущества этого подхода. Мой вопрос таков:
Как структурировать классы служб?
- Во-первых,
user_service()
соответствующее имя класса для моей моделиuser()
или есть другой стандарт? - Так как методы в моей службе будут выполнять только одну задачу, правильно ли считать, что они всегда могут быть
static function
? Класс сервиса не представляет данные, а представляет собой ряд действий, поэтому это кажется уместным. - Если метод службы принимает только один
argument
, который будетarray
?
Рассмотрим, что форма отправила данные контроллеру для сохранения пользовательских данных:
<?php
class form_controller extends controller
{
public function process_submit()
{
if(user_service::update_preferences($_POST))
{
echo json_encode(array('success' => true));
}
else
{
echo json_encode(array('success' => false));
}
}
}
class user_service
{
// Accepts array()
public static function update_preferences($fields)
{
// Check for required fields
if((
isset($fields['firstname']) and
isset($fields['lastname']) and
isset($fields['email'])
) == false
{
return false;
}
// Update user
try
{
$s = new user();
$s->set_firstname($fields['firstname']);
$s->set_lastname($fields['lastname']);
$s->set_email($fields['email']);
$s->update();
return true;
}
catch(Exception $e)
{
return false;
}
}
}
Я считаю, что это хороший подход, потому что:
- Я могу добавить другое поле в свою форму, и мне не нужно будет обновлять
controller
, простоservice
. Кажется правильным, что контроллер не должен беспокоиться о том, какие данные передаются, просто передается. Это делает мой контроллер небольшим и логику в моих моделях. - Если я не передал
array
, я мог бы установить функции с несколькими аргументами. Например, моя функция может бытьupdate_preferences($firstname, $lastname, $email)
. Это могло бы сделать для функций с 20 аргументами (для больших форм), и порядок просто стал бы ужасным для работы. - Я мог бы передать
object
, но имеет ли это смысл? Если я создаю объект, это должен быть объект, который он представляет (пользователь в этом случае), правильно? Но имеет ли смысл, что контроллер создает экземпляр объекта пользователя? Разве это не все, что касается уровня обслуживания? - Может быть, есть аргумент для наличия некоторых методов с несколькими аргументами (когда их всего один-три) и некоторых методов, которые принимают массив (когда есть много полей). Это похоже на то, что это может быть кошмар, так как вам всегда нужно будет ссылаться на класс, чтобы узнать, что просил этот конкретный метод.
Есть ли у кого-нибудь мнение о том, что нужно делать здесь? Я на правильном пути? Что вы делали в прошлом? Большое спасибо!