gpt4 book ai didi

doctrine-orm - Controller 清洁。模范学说

转载 作者:行者123 更新时间:2023-12-05 01:25:01 25 4
gpt4 key购买 nike

我想让我的 Controller 变薄,并将业务逻辑与其他操作分开。例如我有一个 Action :

public function indexAction()
{
$languages = $this ->getEntityManager()
->getRepository('\ApanelLanguage\Entity\LanguageCommon')
->getLanguagesList();
$viewModel = new ViewModel(['languages' => $languages]);
return $viewModel;
}

但我想采取这样的行动:
public function indexAction()
{
$model = $new LanguageModel();
$model->getLanguagesList();
return $viewModel;
}

有可能吗?我必须在 Language/Model/LanguageModel 中有什么?
谢谢

最佳答案

从 Controller 中删除业务逻辑是代码重用和可维护性的好主意;但是我建议不要将逻辑移动到您的模型中。更好的解决方案是为您的应用程序添加一个服务层。

什么是服务层? Martin Fowler describes it as the following :

[A service layer] defines an application's boundary with a layer of services that establishes a set of available operations and coordinates the application's response in each operation.



这实质上意味着我们在 Controller 和模型之间添加了一个类。

这种方法的最大优点是,如果您需要更新应用程序的业务逻辑,则无需更新 Controller 。 Controller 也变得不知道任何特定代码,因此可以在其他不相关的项目中重用。

这个“服务”可以有一个简单的 API,例如:
interface ServiceInterface
{
public function setObjectManager($objectManager);

public function setRepository($respository);

public function find($id);

public function fetchRow($criteria);

public function fetchAll($criteria);

public function insert($object);

public function update($object);

public function delete($object);
}

然后您可以为您的新“LanguageService”实现此接口(interface)。
class LanguageService implements ServiceInterface
{
// ... all methods from interface

public function getLanguageList()
{
return $this->repository->getLanguagesList();
}
}

最后更新您的 Controller 以使用新服务
class FooController extends AbstractActionController
{
protected $languageService;

public function __construct(ServiceInterface $languageService)
{
$this->languageService = $languageService;
}

public function indexAction()
{
$languages = $this->languageService->getLanguageList();

$viewModel = new ViewModel(['languages' => $languages]);

return $viewModel;
}

public function insertAction()
{
$request = $this->getRequest();
$service = $this->languageService;

$form = $service->getInsertForm();

if ($request->isPost()) {
$form->setData($request->getPost());

if ($form->isValid()) {

// if our form used the DoctrineObjectHydrator
// we will get a entity back populated with the
// form data
$language = $service->insert($form->getData());

if ($language instanceof Entity\Language) {
// success
} else {
// failure
}
}
}
//
}


}

关于doctrine-orm - Controller 清洁。模范学说,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29844707/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com