Вынесение дублирующего функционала из контроллеров

Fred

Новичок
Вынесение дублирующего функционала из контроллеров

В данный момент у меня часть функционала описана в контроллерах, которые выполняют определенные действия, и в зависимости от результата, делают переадресацию на нужную страницу.

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");        
    }
}
Возникла необходимость сделать точно такой же функционал для ajax-интефейсов.

Соответственно я выделяю класс с общим функционалом:

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 - не самое подходящее название).
 

StUV

Rotaredom
Почему не хочу наследовать один контроллер от другого - потому что они в разных иерархиях наследования
выделить "дублируемый" функционал в другую ветку наследования с агрегацией по месту использования

И как правильно называть классы
дело вкуса =)
 
Сверху