Skip to content

Commit 5d1e030

Browse files
authored
Merge pull request #792 from magento-troll/MAGETWO-58456
MAGETWO-58456: Remove uses of unserialize in \Magento\Rule\Model\AbstractModel and its child classes and their usages
2 parents ca6ac76 + fba9a82 commit 5d1e030

File tree

23 files changed

+893
-76
lines changed

23 files changed

+893
-76
lines changed

app/code/Magento/CatalogRule/Model/ResourceModel/Rule/Collection.php

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
*/
66
namespace Magento\CatalogRule\Model\ResourceModel\Rule;
77

8+
use Magento\Framework\Serialize\Serializer\Json;
9+
use Magento\Framework\App\ObjectManager;
10+
811
class Collection extends \Magento\Rule\Model\ResourceModel\Rule\Collection\AbstractCollection
912
{
1013
/**
@@ -14,6 +17,11 @@ class Collection extends \Magento\Rule\Model\ResourceModel\Rule\Collection\Abstr
1417
*/
1518
protected $_associatedEntitiesMap;
1619

20+
/**
21+
* @var Json
22+
*/
23+
protected $serializer;
24+
1725
/**
1826
* Collection constructor.
1927
* @param \Magento\Framework\Data\Collection\EntityFactoryInterface $entityFactory
@@ -22,17 +30,20 @@ class Collection extends \Magento\Rule\Model\ResourceModel\Rule\Collection\Abstr
2230
* @param \Magento\Framework\Event\ManagerInterface $eventManager
2331
* @param \Magento\Framework\DB\Adapter\AdapterInterface $connection
2432
* @param \Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource
33+
* @param Json|null $serializer
2534
*/
2635
public function __construct(
2736
\Magento\Framework\Data\Collection\EntityFactoryInterface $entityFactory,
2837
\Psr\Log\LoggerInterface $logger,
2938
\Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy,
3039
\Magento\Framework\Event\ManagerInterface $eventManager,
3140
\Magento\Framework\DB\Adapter\AdapterInterface $connection = null,
32-
\Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource = null
41+
\Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource = null,
42+
Json $serializer = null
3343
) {
3444
parent::__construct($entityFactory, $logger, $fetchStrategy, $eventManager, $connection, $resource);
3545
$this->_associatedEntitiesMap = $this->getAssociatedEntitiesMap();
46+
$this->serializer = $serializer ?: ObjectManager::getInstance()->get(Json::class);
3647
}
3748

3849
/**
@@ -55,7 +66,7 @@ protected function _construct()
5566
*/
5667
public function addAttributeInConditionFilter($attributeCode)
5768
{
58-
$match = sprintf('%%%s%%', substr(serialize(['attribute' => $attributeCode]), 5, -1));
69+
$match = sprintf('%%%s%%', substr($this->serializer->serialize(['attribute' => $attributeCode]), 1, -1));
5970
$this->addFieldToFilter('conditions_serialized', ['like' => $match]);
6071

6172
return $this;
@@ -96,7 +107,6 @@ protected function mapAssociatedEntities($entityType, $objectField)
96107

97108
/**
98109
* @return $this
99-
* @throws \Exception
100110
*/
101111
protected function _afterLoad()
102112
{

app/code/Magento/CatalogRule/Model/Rule.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@ class Rule extends \Magento\Rule\Model\AbstractModel implements RuleInterface, I
162162
* @param array $data
163163
* @param ExtensionAttributesFactory|null $extensionFactory
164164
* @param AttributeValueFactory|null $customAttributeFactory
165+
* @param \Magento\Framework\Serialize\Serializer\Json $serializer
165166
*
166167
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
167168
*/
@@ -186,7 +187,8 @@ public function __construct(
186187
array $relatedCacheTypes = [],
187188
array $data = [],
188189
ExtensionAttributesFactory $extensionFactory = null,
189-
AttributeValueFactory $customAttributeFactory = null
190+
AttributeValueFactory $customAttributeFactory = null,
191+
\Magento\Framework\Serialize\Serializer\Json $serializer = null
190192
) {
191193
$this->_productCollectionFactory = $productCollectionFactory;
192194
$this->_storeManager = $storeManager;
@@ -210,7 +212,8 @@ public function __construct(
210212
$resourceCollection,
211213
$data,
212214
$extensionFactory,
213-
$customAttributeFactory
215+
$customAttributeFactory,
216+
$serializer
214217
);
215218
}
216219

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
<?php
2+
/**
3+
* Copyright © 2013-2017 Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\CatalogRule\Setup;
8+
9+
use Magento\Framework\DB\FieldDataConverterFactory;
10+
use Magento\Framework\DB\DataConverter\SerializedToJson;
11+
use Magento\Framework\Setup\ModuleContextInterface;
12+
use Magento\Framework\Setup\ModuleDataSetupInterface;
13+
use Magento\Framework\Setup\UpgradeDataInterface;
14+
use Magento\Framework\EntityManager\MetadataPool;
15+
use Magento\CatalogRule\Api\Data\RuleInterface;
16+
17+
class UpgradeData implements UpgradeDataInterface
18+
{
19+
/**
20+
* @var FieldDataConverterFactory
21+
*/
22+
private $fieldDataConverterFactory;
23+
24+
/**
25+
* @var MetadataPool
26+
*/
27+
private $metadataPool;
28+
29+
/**
30+
* UpgradeData constructor.
31+
*
32+
* @param FieldDataConverterFactory $fieldDataConverterFactory
33+
* @param MetadataPool $metadataPool
34+
*/
35+
public function __construct(
36+
FieldDataConverterFactory $fieldDataConverterFactory,
37+
MetadataPool $metadataPool
38+
) {
39+
$this->fieldDataConverterFactory = $fieldDataConverterFactory;
40+
$this->metadataPool = $metadataPool;
41+
}
42+
43+
/**
44+
* @inheritdoc
45+
*/
46+
public function upgrade(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
47+
{
48+
$setup->startSetup();
49+
50+
if (version_compare($context->getVersion(), '2.0.3', '<')) {
51+
$this->convertSerializedDataToJson($setup);
52+
}
53+
54+
$setup->endSetup();
55+
}
56+
57+
/**
58+
* Convert metadata from serialized to JSON format:
59+
*
60+
* @param ModuleDataSetupInterface $setup
61+
*
62+
* @return void
63+
*/
64+
public function convertSerializedDataToJson($setup)
65+
{
66+
$fieldDataConverter = $this->fieldDataConverterFactory->create(SerializedToJson::class);
67+
$metadata = $this->metadataPool->getMetadata(RuleInterface::class);
68+
69+
$fieldDataConverter->convert(
70+
$setup->getConnection(),
71+
$setup->getTable('catalogrule'),
72+
$metadata->getLinkField(),
73+
'conditions_serialized'
74+
);
75+
$fieldDataConverter->convert(
76+
$setup->getConnection(),
77+
$setup->getTable('catalogrule'),
78+
$metadata->getLinkField(),
79+
'actions_serialized'
80+
);
81+
}
82+
}

app/code/Magento/CatalogRule/Test/Unit/Model/RuleTest.php

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,10 +149,46 @@ protected function setUp()
149149
'resourceIterator' => $this->_resourceIterator,
150150
'extensionFactory' => $extensionFactoryMock,
151151
'customAttributeFactory' => $attributeValueFactoryMock,
152+
'serializer' => $this->getSerializerMock(),
152153
]
153154
);
154155
}
155156

157+
/**
158+
* Get mock for serializer
159+
*
160+
* @return \PHPUnit_Framework_MockObject_MockObject
161+
*/
162+
private function getSerializerMock()
163+
{
164+
$serializerMock = $this->getMockBuilder(\Magento\Framework\Serialize\Serializer\Json::class)
165+
->disableOriginalConstructor()
166+
->setMethods(['serialize', 'unserialize'])
167+
->getMock();
168+
169+
$serializerMock->expects($this->any())
170+
->method('serialize')
171+
->will(
172+
$this->returnCallback(
173+
function ($value) {
174+
return json_encode($value);
175+
}
176+
)
177+
);
178+
179+
$serializerMock->expects($this->any())
180+
->method('unserialize')
181+
->will(
182+
$this->returnCallback(
183+
function ($value) {
184+
return json_decode($value, true);
185+
}
186+
)
187+
);
188+
189+
return $serializerMock;
190+
}
191+
156192
/**
157193
* @dataProvider dataProviderCallbackValidateProduct
158194
* @param bool $validate

app/code/Magento/CatalogRule/etc/module.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
*/
77
-->
88
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
9-
<module name="Magento_CatalogRule" setup_version="2.0.2">
9+
<module name="Magento_CatalogRule" setup_version="2.0.3">
1010
<sequence>
1111
<module name="Magento_Rule"/>
1212
<module name="Magento_Catalog"/>

app/code/Magento/CatalogWidget/Model/Rule.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ class Rule extends \Magento\Rule\Model\AbstractModel
3232
* @param ExtensionAttributesFactory|null $extensionFactory
3333
* @param AttributeValueFactory|null $customAttributeFactory
3434
*
35+
* @param \Magento\Framework\Serialize\Serializer\Json $serializer
3536
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
3637
*/
3738
public function __construct(
@@ -44,7 +45,8 @@ public function __construct(
4445
\Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
4546
array $data = [],
4647
ExtensionAttributesFactory $extensionFactory = null,
47-
AttributeValueFactory $customAttributeFactory = null
48+
AttributeValueFactory $customAttributeFactory = null,
49+
\Magento\Framework\Serialize\Serializer\Json $serializer = null
4850
) {
4951
$this->conditionsFactory = $conditionsFactory;
5052
parent::__construct(
@@ -56,7 +58,8 @@ public function __construct(
5658
$resourceCollection,
5759
$data,
5860
$extensionFactory,
59-
$customAttributeFactory
61+
$customAttributeFactory,
62+
$serializer
6063
);
6164
}
6265

app/code/Magento/Rule/Model/AbstractModel.php

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,11 @@ abstract class AbstractModel extends \Magento\Framework\Model\AbstractExtensible
4949
*/
5050
protected $_isReadonly = false;
5151

52+
/**
53+
* @var \Magento\Framework\Serialize\Serializer\Json
54+
*/
55+
protected $serializer;
56+
5257
/**
5358
* Getter for rule combine conditions instance
5459
*
@@ -89,6 +94,8 @@ abstract public function getActionsInstance();
8994
* @param array $data
9095
* @param ExtensionAttributesFactory|null $extensionFactory
9196
* @param AttributeValueFactory|null $customAttributeFactory
97+
* @param \Magento\Framework\Serialize\Serializer\Json $serializer
98+
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
9299
*/
93100
public function __construct(
94101
\Magento\Framework\Model\Context $context,
@@ -99,10 +106,14 @@ public function __construct(
99106
\Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
100107
array $data = [],
101108
ExtensionAttributesFactory $extensionFactory = null,
102-
AttributeValueFactory $customAttributeFactory = null
109+
AttributeValueFactory $customAttributeFactory = null,
110+
\Magento\Framework\Serialize\Serializer\Json $serializer = null
103111
) {
104112
$this->_formFactory = $formFactory;
105113
$this->_localeDate = $localeDate;
114+
$this->serializer = $serializer ?: \Magento\Framework\App\ObjectManager::getInstance()->get(
115+
\Magento\Framework\Serialize\Serializer\Json::class
116+
);
106117
parent::__construct(
107118
$context,
108119
$registry,
@@ -132,13 +143,13 @@ public function beforeSave()
132143

133144
// Serialize conditions
134145
if ($this->getConditions()) {
135-
$this->setConditionsSerialized(serialize($this->getConditions()->asArray()));
146+
$this->setConditionsSerialized($this->serializer->serialize($this->getConditions()->asArray()));
136147
$this->_conditions = null;
137148
}
138149

139150
// Serialize actions
140151
if ($this->getActions()) {
141-
$this->setActionsSerialized(serialize($this->getActions()->asArray()));
152+
$this->setActionsSerialized($this->serializer->serialize($this->getActions()->asArray()));
142153
$this->_actions = null;
143154
}
144155

@@ -195,7 +206,7 @@ public function getConditions()
195206
if ($this->hasConditionsSerialized()) {
196207
$conditions = $this->getConditionsSerialized();
197208
if (!empty($conditions)) {
198-
$conditions = unserialize($conditions);
209+
$conditions = $this->serializer->unserialize($conditions);
199210
if (is_array($conditions) && !empty($conditions)) {
200211
$this->_conditions->loadArray($conditions);
201212
}
@@ -233,7 +244,7 @@ public function getActions()
233244
if ($this->hasActionsSerialized()) {
234245
$actions = $this->getActionsSerialized();
235246
if (!empty($actions)) {
236-
$actions = unserialize($actions);
247+
$actions = $this->serializer->unserialize($actions);
237248
if (is_array($actions) && !empty($actions)) {
238249
$this->_actions->loadArray($actions);
239250
}

0 commit comments

Comments
 (0)