Question

I'm trying to make the status of a review be approved instead of pending when the user posts it in the frontend in Magento 2.
And I took this approach. Create a before plugin, available only in the frontend area, for the method setStatusId for the Magento\Review\Model\Review that looks like this

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

It seamed to me like a good idea. And it should work since I'm returning the approved status. The actual method should then pick this up as a parameter.
but to my surprise it didn't work.
Then I dug up and found that the method setStatusId does not exist in the review model. It is magically called and it actually runs setData('status_id', $status).
I took a look then in the generated interceptor, and indeed there is not setStatusId method.

How can I pluginize the magic getters/setters in magento 2? Is that even possible?

Note: I don't need a solution for making the reviews auto-approved. I know I can take other approaches, like the save_before events. This is not important for now.

Was it helpful?

Solution

Is that even possible?

Yes.

How can I pluginize the magic getters/setters in magento 2?

In the same way as a other public method. You need to declare plugin in di.xml configuration and add you custom code in plugin.

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;
}

But pluginization of DTO classes is not good idea. Try to customize appropriate controllers/services for modify application behaviour and do not add plugins on DTO object. This customization will destroy application layers. I understand, that you are use most quick and easy way, but in some case it is wrong strategy.

OTHER TIPS

I once had a similar problem. I ended up with pluginize the setData()-method, although in my opinion that generates a tremendous waste of resources... :-(

Licensed under: CC-BY-SA with attribution
Not affiliated with magento.stackexchange
scroll top