由于我很难找到正确的方法,因此您可以在下面找到我制定的最佳实践。享受,如果需要,请更正我的英语,如果我是我,我就说我错了。:)
编辑: ...,我发现我在某些方面是错误的。因此,在Raphael的答案帮助我了解了更多信息之后,我更新了原始帖子。多亏他!
以下使用的概念:
如果您熟悉以下概念,将更容易理解以下代码和说明:
- 注入依赖性(因为
$this->variable
代码中的每个变量都被注入) - 服务合同和资料库
- 厂
内容:
只是为了获得更多的上下文,假设我们有一个可以正确构造的模块:
- 包含方法的块类CustomBlock
getCustomModel($id)
, - 此方法根据在参数中传递的ID返回CustomModel对象,
- CustomModel类型对应于
\Vendor\Module\Model\CustomModel
- 此模型带有其资源模型(在中
\Vendor\Module\Model\ResourceModel\CustomModel
) - 及其存储库(在中
\Vendor\Module\Model\CustomModelRepository
)。
问题:
- 让所有内容加载CustomModel对象的最佳实践是什么?
由于不建议使用load()
此方法,因此不能使用CustomModel对象中的。
优良作法是您必须使用CustomModel服务合同。服务合同是数据接口(例如CustomModelInterface)和服务接口(例如CustomModelRepositoryInterface)。所以我的方块看起来像这样:
/ ** @var SlideRepositoryInterface * / 受保护的$ slideRepository; / ** * CustomBlock构造函数 * ... * @param CustomModelRepositoryInterface $ customModelRepository * ... * / 公共功能__construct( ... CustomModelRepositoryInterface $ customModelRepository ... ){ $ this-> customModelRepository = $ customModelRepository; } 公共功能getCustomModel($ id){ 返回$ this-> customModelRepository-> get($ id); }
首先,我们将CustomModelRepositoryInterface
对象注入构造函数中,并在getCustomModel()
方法中使用它。
在课堂Api\CustomModelRepositoryInterface
上没有很多。通常(但没有阻止你做不同的),你会声明基本方法:get
,getList
,save
,delete
,deleteById
。出于本主题的目的,下面仅是get
方法声明:
/**
* Get info by id
*
* @param int $id
* @return Data\CustomModelInterface
* @throws \Magento\Framework\Exception\NoSuchEntityException
*/
public function get($id);
好的,但是如果我的CustomModel接口是通过我的块构造函数中的依赖项注入调用的,那么代码在哪里?为了回答这个问题,您必须向Magento解释,在哪里可以找到实现此接口的类。在模块的etc / di.xml文件中,您必须添加:
<preference for="Vendor\Module\Api\CustomModelRepositoryInterface" type="Vendor\Module\Model\CustomModelRepository" />
因此,CustomModelRepositoryInterface
类是服务接口。在实现它时,您还必须实现数据接口(至少Vendor\Module\Api\Data\CustomModelInterface
和Vendor\Module\Api\Data\CustomModelSearchResultsInterface
)。您的模型将必须为每个接口实现Vendor\Module\Api\Data\CustomModelInterface
并添加<preference ... />
行。最后,无论何时使用服务合同,mySomethingInterface
都不mySomething
要再考虑:让magento使用di.xml
首选项机制。
好吧,接下来会发生什么?当我们注入CustomModelRepositoryInterface
块构造器时,我们得到一个CustomModelRepository
对象。CustomModelRepository
必须实现中声明的方法CustomModelRepositoryInterface
。因此,我们在Vendor\Module\Model\CustomModelRepository
:
公共功能get($ id){ $ customModel = $ this-> customModelFactory-> create(); $ customModel-> load($ id); 如果(!$ customModel-> getId()){ 抛出新的NoSuchEntityException(__('ID为“%1”的CustomModel不存在。',$ id)); } 返回$ customModel; }
我们在做什么?CustomModel
由于工厂,我们创建了一个空对象。接下来,我们CustomModel
使用加载模型方法加载数据。接下来,NoSuchEntityException
如果我们无法CustomModel
使用参数加载id,则返回a 。但是,如果一切正常,我们将返回模型对象,并且生命将继续。
但是,哇...!在这个例子中是什么?
$customModel->load($id);
不建议使用load
与开始时相同的方法吗?是的。我认为这很遗憾,但是您必须使用它,因为在此load()方法中调度了一些事件,开发人员可以侦听它们(请参阅下面的Raphael的回答)。
将来,我们将由实体管理器保存。作为新的Magento 2概念,这是另一个故事,但是如果您不介意,则CMS页面(v2.1)的资源模型中已经实现了Entity Manager:
public function load(AbstractModel $object, $value, $field = null)
{
$pageId = $this->getPageId($object, $value, $field);
if ($pageId) {
$this->entityManager->load($object, $pageId);
}
return $this;
}