吸气剂/塞特剂的插件


9

我试图将评论的状态approved改为pending用户在Magento 2的前端中发布评论的状态。
我采用了这种方法。创建前的插件,仅适用于前端区域,该方法setStatusIdMagento\Review\Model\Review是这个样子的

public function beforeSetStatusId(\Magento\Review\Model\Review $review, $status)
{
    return [\Magento\Review\Model\Review::STATUS_APPROVED];
}

这对我来说就像一个好主意。自我返回批准状态以来,它应该可以正常工作。然后,实际方法应将此作为参数。
但令我惊讶的是,它没有用。
然后我挖了一下,发现setStatusId评论模型中不存在该方法。它被神奇地称为,它实际上可以运行setData('status_id', $status)
然后,我在生成的拦截器中进行了查看,实际上没有setStatusId方法。

我该如何在magento 2中插入魔术获取器/设置器?那有可能吗?

注意:我不需要使评论自动获得批准的解决方案。我知道我可以采取其他方法,例如save_before赛事。目前这并不重要。

Answers:


14

那有可能吗?

是。

我该如何在magento 2中插入魔术获取器/设置器?

与其他公共方法相同。您需要在di.xml配置中声明插件,并在插件中添加自定义代码。

public function before__call(\Magento\Review\Model\Review $review, $method, $args)
{
    if ($method == 'setStatusId') {
        if (isset($args[0])) {
            $args[0] = \Magento\Review\Model\Review::STATUS_APPROVED;
            return [$method, $args];
        }
    }
    //leave everything unchanged
    return null;
}

但是,DTO类的插件并不是一个好主意。尝试自定义适当的控制器/服务以修改应用程序行为,并且不要在DTO对象上添加插件。这种定制将破坏应用程序层。我了解,您正在使用最快捷简便的方法,但是在某些情况下这是错误的策略。


我同意您的定制要求。这仅仅是概念的证明。
马吕斯

@Marius yeah,凉爽
Max

我采用了这种方法,但是如果/如果审查模块被重构为使用服务合同,那么它将失败。现在还可以。谢谢。
马吕斯

是的,当然可以,但是您的问题是“我如何才能在magento 2中插入魔术获取器/设置器?甚至有可能吗?”。最好的选择是仅将插件用于公共api方法和服务,但是在某些magento模块中,没有任何API或效果不佳。
最多

4

我曾经有过类似的问题。我最终使用了setData()-method 插件,尽管我认为这会浪费大量资源... :-(


好。这是一种可行的方法。+1。但是我希望有更清洁的选择(前提是有一个选择)。
马里乌斯

我希望一样。我仍然每天晚上都哭自己要睡觉,因为此修复程序看起来太脏了。我认为仍然存在魔术方法的全部原因是由于Magento 1的遗留代码。我认为,只要审阅模型尚未重构为数据模型,您就不会对此感到幸运。
Giel Berkers,2017年

我意识到自己是因为遗留代码。我从中学到了很好的一课。自定义CRUD模块不要依赖魔术。
马里斯(Marius)

我在这里采用了Max解释的方法,主要是因为仅在调用魔术设置器时才会调用我的插件,而不是对所有setData调用都调用。它不是完美的,但是比使用更好setData。也许您也可以改变方法,晚上睡得更好。:)
马吕斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.