Fred
Новичок
Вынесение дублирующего функционала из контроллеров
В данный момент у меня часть функционала описана в контроллерах, которые выполняют определенные действия, и в зависимости от результата, делают переадресацию на нужную страницу.
Возникла необходимость сделать точно такой же функционал для ajax-интефейсов.
Соответственно я выделяю класс с общим функционалом:
А в контроллерах уже использовать этот класс
Почему не хочу наследовать один контроллер от другого - потому что они в разных иерархиях наследования (с базовым функционалом для редиректа у одного и для преобразования объектов у другого).
Есть ли варианты более правильной реализации этой задачи?
И как правильно называть классы AddArticleAction (мне кажется, что xxxAction - не самое подходящее название).
В данный момент у меня часть функционала описана в контроллерах, которые выполняют определенные действия, и в зависимости от результата, делают переадресацию на нужную страницу.
PHP:
class AddArticleController extends AbstractRedirectController {
public function run() {
$article = new Article();
$article->setTitle($this->request->getParam("title"));
$article->setBody($this->request->getParam("body"));
$this->validator->validate($article);
if ($this->validator->hasErrors()) {
$this->_storeErrorsInSession();
$this->_redirect("/addarticle");
}
$article->save();
$this->_redirect("/articles");
}
}
Соответственно я выделяю класс с общим функционалом:
PHP:
public function AddArticleAction {
private $article;
private $data = array();
public function __construct(array $data) {
$this->data = $data;
}
public function run() {
$this->article = new Article();
$this->article->setTitle($this->data["title"]);
$this->article->setBody($this->data["body"]);
$this->validator->validate($article);
if ($this->validator->hasErrors()) return false;
$this->article->save();
return true;
}
public function getArticle() {
return $this->article;
}
public function getErrors() {
return $this->validator->errors();
}
}
PHP:
class AddArticleController extends AbstractRedirectController {
public function run() {
$action = new AddArticleAction(array("title" => $this->request->getParam("title"), "body" => $this->request->getParam("body")));
$result = $action->run();
if ($result) {
$this->_redirect("/articles");
} else {
$this->_storeErrorsInSession($action->getErrors());
$this->_redirect("/addarticle");
}
}
}
class AddArticleController extends AbstractAjaxController {
public function run() {
$action = new AddArticleAction(array("title" => $this->request->getParam("title"), "body" => $this->request->getParam("body")));
$result = $action->run();
if ($result) {
return $this->_toJson(array("article" => $result->getArticle())):
} else {
return $this->_toJson(array("error" => $result->getError())):
}
}
}
Есть ли варианты более правильной реализации этой задачи?
И как правильно называть классы AddArticleAction (мне кажется, что xxxAction - не самое подходящее название).