diff --git a/app/code/Magento/CatalogUrlRewrite/Model/Category/Plugin/Category/Remove.php b/app/code/Magento/CatalogUrlRewrite/Model/Category/Plugin/Category/Remove.php index e44aa9e0fab09d557544f413994b907dd0184f9a..e0c49a15b273599bb4aca41726a314133d015032 100644 --- a/app/code/Magento/CatalogUrlRewrite/Model/Category/Plugin/Category/Remove.php +++ b/app/code/Magento/CatalogUrlRewrite/Model/Category/Plugin/Category/Remove.php @@ -11,6 +11,8 @@ use Magento\CatalogUrlRewrite\Model\CategoryUrlRewriteGenerator; use Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator; use Magento\UrlRewrite\Model\UrlPersistInterface; use Magento\UrlRewrite\Service\V1\Data\UrlRewrite; +use Magento\Framework\App\ObjectManager; +use Magento\Framework\Serialize\SerializerInterface; class Remove { @@ -23,26 +25,32 @@ class Remove /** @var ChildrenCategoriesProvider */ protected $childrenCategoriesProvider; + /** @var SerializerInterface */ + private $serializer; + /** * @param UrlPersistInterface $urlPersist * @param ProductUrlRewriteGenerator $productUrlRewriteGenerator * @param ChildrenCategoriesProvider $childrenCategoriesProvider + * @param SerializerInterface|null $serializer */ public function __construct( UrlPersistInterface $urlPersist, ProductUrlRewriteGenerator $productUrlRewriteGenerator, - ChildrenCategoriesProvider $childrenCategoriesProvider + ChildrenCategoriesProvider $childrenCategoriesProvider, + SerializerInterface $serializer = null ) { $this->urlPersist = $urlPersist; $this->productUrlRewriteGenerator = $productUrlRewriteGenerator; $this->childrenCategoriesProvider = $childrenCategoriesProvider; + $this->serializer = $serializer ?: ObjectManager::getInstance()->get(SerializerInterface::class); } /** * Remove product urls from storage * * @param \Magento\Catalog\Model\ResourceModel\Category $subject - * @param callable $proceed + * @param \Closure $proceed * @param CategoryInterface $category * @return mixed * @SuppressWarnings(PHPMD.UnusedFormalParameter) @@ -77,7 +85,7 @@ class Remove ); $this->urlPersist->deleteByData( [ - UrlRewrite::METADATA => serialize(['category_id' => $categoryId]), + UrlRewrite::METADATA => $this->serializer->serialize(['category_id' => $categoryId]), UrlRewrite::ENTITY_TYPE => ProductUrlRewriteGenerator::ENTITY_TYPE, ] ); diff --git a/app/code/Magento/CatalogUrlRewrite/Observer/UrlRewriteHandler.php b/app/code/Magento/CatalogUrlRewrite/Observer/UrlRewriteHandler.php index ff3ca37f2e23ee7b7b3ab74f7e1f3b8a13e734eb..16bf67b08afffd505ba9d86b62beb5fedc2231f6 100644 --- a/app/code/Magento/CatalogUrlRewrite/Observer/UrlRewriteHandler.php +++ b/app/code/Magento/CatalogUrlRewrite/Observer/UrlRewriteHandler.php @@ -13,6 +13,7 @@ use Magento\Framework\App\ObjectManager; use Magento\Framework\Event\Observer as EventObserver; use Magento\UrlRewrite\Model\UrlPersistInterface; use Magento\UrlRewrite\Service\V1\Data\UrlRewrite; +use Magento\Framework\Serialize\SerializerInterface; class UrlRewriteHandler { @@ -34,30 +35,34 @@ class UrlRewriteHandler /** @var \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory */ protected $productCollectionFactory; - /** - * @var CategoryBasedProductRewriteGenerator - */ + /** @var CategoryBasedProductRewriteGenerator */ private $categoryBasedProductRewriteGenerator; + /** @var SerializerInterface */ + private $serializer; + /** * @param \Magento\CatalogUrlRewrite\Model\Category\ChildrenCategoriesProvider $childrenCategoriesProvider * @param CategoryUrlRewriteGenerator $categoryUrlRewriteGenerator * @param ProductUrlRewriteGenerator $productUrlRewriteGenerator * @param UrlPersistInterface $urlPersist * @param \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory + * @param SerializerInterface|null $serializer */ public function __construct( \Magento\CatalogUrlRewrite\Model\Category\ChildrenCategoriesProvider $childrenCategoriesProvider, CategoryUrlRewriteGenerator $categoryUrlRewriteGenerator, ProductUrlRewriteGenerator $productUrlRewriteGenerator, UrlPersistInterface $urlPersist, - \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory + \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory, + SerializerInterface $serializer = null ) { $this->childrenCategoriesProvider = $childrenCategoriesProvider; $this->categoryUrlRewriteGenerator = $categoryUrlRewriteGenerator; $this->productUrlRewriteGenerator = $productUrlRewriteGenerator; $this->urlPersist = $urlPersist; $this->productCollectionFactory = $productCollectionFactory; + $this->serializer = $serializer ?: ObjectManager::getInstance()->get(SerializerInterface::class); } /** @@ -164,7 +169,7 @@ class UrlRewriteHandler ); $this->urlPersist->deleteByData( [ - UrlRewrite::METADATA => serialize(['category_id' => $categoryId]), + UrlRewrite::METADATA => $this->serializer->serialize(['category_id' => $categoryId]), UrlRewrite::ENTITY_TYPE => ProductUrlRewriteGenerator::ENTITY_TYPE, ] ); diff --git a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Category/Plugin/Category/RemoveTest.php b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Category/Plugin/Category/RemoveTest.php index 75b0509e0245db845bf3c82f6e6502affbcdb898..863c15e41fcb228ca4c54e0760f19949530ed2c1 100644 --- a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Category/Plugin/Category/RemoveTest.php +++ b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Category/Plugin/Category/RemoveTest.php @@ -39,6 +39,9 @@ class RemoveTest extends \PHPUnit_Framework_TestCase */ private $objectMock; + /** @var \Magento\Framework\Serialize\SerializerInterface|\PHPUnit_Framework_MockObject_MockObject */ + private $serializerMock; + protected function setUp() { $this->objectManager = new ObjectManager($this); @@ -52,6 +55,7 @@ class RemoveTest extends \PHPUnit_Framework_TestCase $this->objectMock = $this->getMockBuilder(Category::class) ->disableOriginalConstructor() ->getMock(); + $this->serializerMock = $this->getMock(\Magento\Framework\Serialize\SerializerInterface::class, [], [], '', false); } public function testAroundDelete() @@ -64,7 +68,8 @@ class RemoveTest extends \PHPUnit_Framework_TestCase CategoryRemovePlugin::class, [ 'urlPersist' => $this->urlPersistMock, - 'childrenCategoriesProvider' => $this->childrenCategoriesProviderMock + 'childrenCategoriesProvider' => $this->childrenCategoriesProviderMock, + 'serializer' => $this->serializerMock ] ); $this->childrenCategoriesProviderMock->expects($this->once()) @@ -76,6 +81,9 @@ class RemoveTest extends \PHPUnit_Framework_TestCase ->willReturn(1); $this->urlPersistMock->expects($this->exactly(2)) ->method('deleteByData'); + $this->serializerMock->expects($this->once()) + ->method('serialize') + ->with(['category_id' => 1]); $this->assertSame( $this->subjectMock, $plugin->aroundDelete($this->subjectMock, $proceed, $this->objectMock) diff --git a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/CategoryUrlRewriteGeneratorTest.php b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/CategoryUrlRewriteGeneratorTest.php index c2905eb9b425f243126547bda3791bf570ee6977..10005c44bc57c18d892d0cb2576661d740cf3911 100644 --- a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/CategoryUrlRewriteGeneratorTest.php +++ b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/CategoryUrlRewriteGeneratorTest.php @@ -34,18 +34,37 @@ class CategoryUrlRewriteGeneratorTest extends \PHPUnit_Framework_TestCase /** @var \Magento\Catalog\Api\CategoryRepositoryInterface|\PHPUnit_Framework_MockObject_MockObject */ protected $categoryRepository; + /** @var \Magento\Framework\Serialize\SerializerInterface|\PHPUnit_Framework_MockObject_MockObject */ + protected $serializer; + /** * Test method */ protected function setUp() { - $this->currentUrlRewritesRegenerator = $this->getMockBuilder( + $this->serializer = $this->getMock(\Magento\Framework\Serialize\SerializerInterface::class, [], [], '', false); + $this->serializer->expects($this->any()) + ->method('serialize') + ->willReturnCallback( + function ($value) { + return json_encode($value); + } + ); + $this->serializer->expects($this->any()) + ->method('unserialize') + ->willReturnCallback( + function ($value) { + return json_decode($value, true); + } + ); + + $this->currentUrlRewritesRegenerator = $this->getMockBuilder( \Magento\CatalogUrlRewrite\Model\Category\CurrentUrlRewritesRegenerator::class )->disableOriginalConstructor()->getMock(); - $this->canonicalUrlRewriteGenerator = $this->getMockBuilder( + $this->canonicalUrlRewriteGenerator = $this->getMockBuilder( \Magento\CatalogUrlRewrite\Model\Category\CanonicalUrlRewriteGenerator::class )->disableOriginalConstructor()->getMock(); - $this->childrenUrlRewriteGenerator = $this->getMockBuilder( + $this->childrenUrlRewriteGenerator = $this->getMockBuilder( \Magento\CatalogUrlRewrite\Model\Category\ChildrenUrlRewriteGenerator::class )->disableOriginalConstructor()->getMock(); $this->storeViewService = $this->getMockBuilder(\Magento\CatalogUrlRewrite\Service\V1\StoreViewService::class) @@ -53,7 +72,7 @@ class CategoryUrlRewriteGeneratorTest extends \PHPUnit_Framework_TestCase $this->category = $this->getMock(\Magento\Catalog\Model\Category::class, [], [], '', false); $this->categoryRepository = $this->getMock(\Magento\Catalog\Api\CategoryRepositoryInterface::class); - $this->categoryUrlRewriteGenerator = (new ObjectManager($this))->getObject( + $this->categoryUrlRewriteGenerator = (new ObjectManager($this))->getObject( \Magento\CatalogUrlRewrite\Model\CategoryUrlRewriteGenerator::class, [ 'canonicalUrlRewriteGenerator' => $this->canonicalUrlRewriteGenerator, @@ -74,22 +93,22 @@ class CategoryUrlRewriteGeneratorTest extends \PHPUnit_Framework_TestCase $this->category->expects($this->any())->method('getStoreIds')->will($this->returnValue([1])); $this->storeViewService->expects($this->once())->method('doesEntityHaveOverriddenUrlKeyForStore') ->will($this->returnValue(false)); - $canonical = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite(); + $canonical = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite([], $this->serializer); $canonical->setTargetPath('category-1') ->setStoreId(1); $this->canonicalUrlRewriteGenerator->expects($this->any())->method('generate') ->will($this->returnValue([$canonical])); - $children = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite(); + $children = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite([], $this->serializer); $children->setTargetPath('category-2') ->setStoreId(2); $this->childrenUrlRewriteGenerator->expects($this->any())->method('generate') ->will($this->returnValue([$children])); - $current = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite(); + $current = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite([], $this->serializer); $current->setTargetPath('category-3') ->setStoreId(3); $this->currentUrlRewritesRegenerator->expects($this->any())->method('generate') ->will($this->returnValue([$current])); - $categoryForSpecificStore = $this->getMock( + $categoryForSpecificStore = $this->getMock( \Magento\Catalog\Model\Category::class, ['getUrlKey', 'getUrlPath'], [], @@ -111,7 +130,7 @@ class CategoryUrlRewriteGeneratorTest extends \PHPUnit_Framework_TestCase { $this->category->expects($this->any())->method('getStoreId')->will($this->returnValue(1)); $this->category->expects($this->never())->method('getStoreIds'); - $canonical = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite(); + $canonical = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite([], $this->serializer); $canonical->setTargetPath('category-1') ->setStoreId(1); $this->canonicalUrlRewriteGenerator->expects($this->any())->method('generate') diff --git a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/ProductScopeRewriteGeneratorTest.php b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/ProductScopeRewriteGeneratorTest.php index 0e6c501c4981b6dc6e7660ee02824c7c091d4294..40f364ef6ba6e1eada07ce8d46330cc74c04aa40 100644 --- a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/ProductScopeRewriteGeneratorTest.php +++ b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/ProductScopeRewriteGeneratorTest.php @@ -41,8 +41,27 @@ class ProductScopeRewriteGeneratorTest extends \PHPUnit_Framework_TestCase /** @var ProductScopeRewriteGenerator */ private $productScopeGenerator; + /** @var \Magento\Framework\Serialize\SerializerInterface|\PHPUnit_Framework_MockObject_MockObject */ + private $serializer; + public function setUp() { + $this->serializer = $this->getMock(\Magento\Framework\Serialize\SerializerInterface::class, [], [], '', false); + $this->serializer->expects($this->any()) + ->method('serialize') + ->willReturnCallback( + function ($value) { + return json_encode($value); + } + ); + $this->serializer->expects($this->any()) + ->method('unserialize') + ->willReturnCallback( + function ($value) { + return json_decode($value, true); + } + ); + $this->currentUrlRewritesRegenerator = $this->getMockBuilder( \Magento\CatalogUrlRewrite\Model\Product\CurrentUrlRewritesRegenerator::class )->disableOriginalConstructor()->getMock(); @@ -90,22 +109,22 @@ class ProductScopeRewriteGeneratorTest extends \PHPUnit_Framework_TestCase ->method('getParentId') ->willReturn(1); $this->initObjectRegistryFactory([]); - $canonical = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite(); + $canonical = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite([], $this->serializer); $canonical->setTargetPath('category-1') ->setStoreId(1); $this->canonicalUrlRewriteGenerator->expects($this->any())->method('generate') ->will($this->returnValue([$canonical])); - $categories = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite(); + $categories = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite([], $this->serializer); $categories->setTargetPath('category-2') ->setStoreId(2); $this->categoriesUrlRewriteGenerator->expects($this->any())->method('generate') ->will($this->returnValue([$categories])); - $current = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite(); + $current = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite([], $this->serializer); $current->setTargetPath('category-3') ->setStoreId(3); $this->currentUrlRewritesRegenerator->expects($this->any())->method('generate') ->will($this->returnValue([$current])); - $anchorCategories = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite(); + $anchorCategories = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite([], $this->serializer); $anchorCategories->setTargetPath('category-4') ->setStoreId(4); $this->anchorUrlRewriteGenerator->expects($this->any())->method('generate') @@ -137,7 +156,7 @@ class ProductScopeRewriteGeneratorTest extends \PHPUnit_Framework_TestCase $store->expects($this->any())->method('getRootCategoryId')->will($this->returnValue($storeRootCategoryId)); $this->storeManager->expects($this->any())->method('getStore')->will($this->returnValue($store)); $this->initObjectRegistryFactory([$category]); - $canonical = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite(); + $canonical = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite([], $this->serializer); $canonical->setTargetPath('category-1') ->setStoreId(1); $this->canonicalUrlRewriteGenerator->expects($this->any())->method('generate') diff --git a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Observer/UrlRewriteHandlerTest.php b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Observer/UrlRewriteHandlerTest.php new file mode 100644 index 0000000000000000000000000000000000000000..0a7dece2a86f0701c6c046e20876ad6907851124 --- /dev/null +++ b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Observer/UrlRewriteHandlerTest.php @@ -0,0 +1,104 @@ +<?php +/** + * Copyright © 2017 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\CatalogUrlRewrite\Test\Unit\Observer; + +use Magento\CatalogUrlRewrite\Observer\UrlRewriteHandler; +use Magento\CatalogUrlRewrite\Model\Category\ChildrenCategoriesProvider; +use Magento\CatalogUrlRewrite\Model\CategoryUrlRewriteGenerator; +use Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator; +use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory; +use Magento\UrlRewrite\Model\UrlPersistInterface; +use Magento\Framework\Serialize\SerializerInterface; + +class UrlRewriteHandlerTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\CatalogUrlRewrite\Observer\UrlRewriteHandler + */ + protected $urlRewriteHandler; + + /** + * @var \Magento\CatalogUrlRewrite\Model\Category\ChildrenCategoriesProvider|\PHPUnit_Framework_MockObject_MockObject + */ + protected $childrenCategoriesProviderMock; + + /** + * @var \Magento\CatalogUrlRewrite\Model\CategoryUrlRewriteGenerator|\PHPUnit_Framework_MockObject_MockObject + */ + protected $categoryUrlRewriteGeneratorMock; + + /** + * @var \Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator|\PHPUnit_Framework_MockObject_MockObject + */ + protected $productUrlRewriteGeneratorMock; + + /** + * @var \Magento\UrlRewrite\Model\UrlPersistInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $urlPersistMock; + + /** + * @var \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $collectionFactoryMock; + + /** + * @var \Magento\Framework\Serialize\SerializerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + private $serializerMock; + + /** + * {@inheritDoc} + */ + protected function setUp() + { + $this->childrenCategoriesProviderMock = $this->getMockBuilder(ChildrenCategoriesProvider::class) + ->getMock(); + $this->categoryUrlRewriteGeneratorMock = $this->getMockBuilder(CategoryUrlRewriteGenerator::class) + ->disableOriginalConstructor() + ->getMock(); + $this->productUrlRewriteGeneratorMock = $this->getMockBuilder(ProductUrlRewriteGenerator::class) + ->disableOriginalConstructor() + ->getMock(); + $this->urlPersistMock = $this->getMockBuilder(UrlPersistInterface::class) + ->getMock(); + $this->collectionFactoryMock = $this->getMockBuilder(CollectionFactory::class) + ->disableOriginalConstructor() + ->getMock(); + $this->serializerMock = $this->getMockBuilder(SerializerInterface::class) + ->disableOriginalConstructor() + ->getMock(); + + $this->urlRewriteHandler = new UrlRewriteHandler( + $this->childrenCategoriesProviderMock, + $this->categoryUrlRewriteGeneratorMock, + $this->productUrlRewriteGeneratorMock, + $this->urlPersistMock, + $this->collectionFactoryMock, + $this->serializerMock + ); + } + + public function testDeleteCategoryRewritesForChildren() + { + $category = $this->getMockBuilder(\Magento\Catalog\Model\Category::class) + ->disableOriginalConstructor() + ->getMock(); + $category->expects($this->once()) + ->method('getId') + ->willReturn(2); + + $this->childrenCategoriesProviderMock->expects($this->once()) + ->method('getChildrenIds') + ->with($category, true) + ->willReturn([3, 4]); + + $this->serializerMock->expects($this->exactly(3)) + ->method('serialize'); + + $this->urlRewriteHandler->deleteCategoryRewritesForChildren($category); + } +} diff --git a/app/code/Magento/SampleData/etc/module.xml b/app/code/Magento/SampleData/etc/module.xml index 24be4417e689facd4548df8c6e6e6804bc8f7700..e511dfd4bbb765c5e0031bea552dbdc354bb8dc3 100644 --- a/app/code/Magento/SampleData/etc/module.xml +++ b/app/code/Magento/SampleData/etc/module.xml @@ -7,5 +7,8 @@ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> <module name="Magento_SampleData" setup_version="2.0.0"> + <sequence> + <module name="Magento_UrlRewrite"/> + </sequence> </module> </config> diff --git a/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/Save.php b/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/Save.php index 5b2698749019e6c983804ac12d14513e5cfc03d0..8181f3c6d80a97859e2a952920029bd7885a9525 100644 --- a/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/Save.php +++ b/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/Save.php @@ -6,8 +6,6 @@ */ namespace Magento\UrlRewrite\Controller\Adminhtml\Url\Rewrite; -use Magento\Catalog\Model\Category; -use Magento\Catalog\Model\Product; use Magento\Framework\Exception\LocalizedException; use Magento\UrlRewrite\Model\UrlFinderInterface; use Magento\UrlRewrite\Service\V1\Data\UrlRewrite; @@ -63,7 +61,7 @@ class Save extends \Magento\UrlRewrite\Controller\Adminhtml\Url\Rewrite $model->setEntityType($productId ? self::ENTITY_TYPE_PRODUCT : self::ENTITY_TYPE_CATEGORY) ->setEntityId($productId ?: $categoryId); if ($productId && $categoryId) { - $model->setMetadata(serialize(['category_id' => $categoryId])); + $model->setMetadata(['category_id' => $categoryId]); } } $model->setTargetPath($this->getTargetPath($model)); diff --git a/app/code/Magento/UrlRewrite/Model/UrlRewrite.php b/app/code/Magento/UrlRewrite/Model/UrlRewrite.php index b8f97ace72936221e2626d3107d89246158f1cb2..3dbf8ff69bcf67a6c49c1ed9a65a6a2079d771c8 100644 --- a/app/code/Magento/UrlRewrite/Model/UrlRewrite.php +++ b/app/code/Magento/UrlRewrite/Model/UrlRewrite.php @@ -5,6 +5,9 @@ */ namespace Magento\UrlRewrite\Model; +use Magento\Framework\App\ObjectManager; +use Magento\Framework\Serialize\SerializerInterface; + /** * @method int getEntityId() * @method string getEntityType() @@ -14,7 +17,6 @@ namespace Magento\UrlRewrite\Model; * @method string getTargetPath() * @method UrlRewrite setEntityId(int $value) * @method UrlRewrite setEntityType(string $value) - * @method UrlRewrite setMetadata($value) * @method UrlRewrite setRequestPath($value) * @method UrlRewrite setTargetPath($value) * @method UrlRewrite setRedirectType($value) @@ -23,6 +25,32 @@ namespace Magento\UrlRewrite\Model; */ class UrlRewrite extends \Magento\Framework\Model\AbstractModel { + /** + * @var SerializerInterface + */ + private $serializer; + + /** + * UrlRewrite constructor. + * @param \Magento\Framework\Model\Context $context + * @param \Magento\Framework\Registry $registry + * @param \Magento\Framework\Model\ResourceModel\AbstractResource|null $resource + * @param \Magento\Framework\Data\Collection\AbstractDb|null $resourceCollection + * @param array $data + * @param SerializerInterface $serializer + */ + public function __construct( + \Magento\Framework\Model\Context $context, + \Magento\Framework\Registry $registry, + \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, + \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, + array $data = [], + SerializerInterface $serializer = null + ) { + $this->serializer = $serializer ?: ObjectManager::getInstance()->get(SerializerInterface::class); + parent::__construct($context, $registry, $resource, $resourceCollection, $data); + } + /** * Initialize corresponding resource model * @@ -41,6 +69,21 @@ class UrlRewrite extends \Magento\Framework\Model\AbstractModel public function getMetadata() { $metadata = $this->getData(\Magento\UrlRewrite\Service\V1\Data\UrlRewrite::METADATA); - return !empty($metadata) ? unserialize($metadata) : []; + return !empty($metadata) ? $this->serializer->unserialize($metadata) : []; + } + + /** + * Overwrite Metadata in the object. + * + * @param array|string $metadata + * + * @return $this + */ + public function setMetadata($metadata) + { + if (is_array($metadata)) { + $metadata = $this->serializer->serialize($metadata); + } + return $this->setData(\Magento\UrlRewrite\Service\V1\Data\UrlRewrite::METADATA, $metadata); } } diff --git a/app/code/Magento/UrlRewrite/Service/V1/Data/UrlRewrite.php b/app/code/Magento/UrlRewrite/Service/V1/Data/UrlRewrite.php index 11315279ff219b1a461bfe6aa447a2092cbb3f84..cb7ae6ec328d9f740aaf406431b10bc81599be71 100644 --- a/app/code/Magento/UrlRewrite/Service/V1/Data/UrlRewrite.php +++ b/app/code/Magento/UrlRewrite/Service/V1/Data/UrlRewrite.php @@ -6,6 +6,8 @@ namespace Magento\UrlRewrite\Service\V1\Data; use Magento\Framework\Api\AbstractSimpleObject; +use Magento\Framework\App\ObjectManager; +use Magento\Framework\Serialize\SerializerInterface; /** * Data abstract class for url storage @@ -37,6 +39,25 @@ class UrlRewrite extends AbstractSimpleObject self::DESCRIPTION => null, ]; + /** + * @var SerializerInterface + */ + private $serializer; + + /** + * UrlRewrite constructor. + * + * @param array $data + * @param SerializerInterface $serializer + */ + public function __construct( + $data = [], + SerializerInterface $serializer = null + ) { + $this->serializer = $serializer ?: ObjectManager::getInstance()->get(SerializerInterface::class); + parent::__construct($data); + } + /** * Get data by key * @@ -216,7 +237,7 @@ class UrlRewrite extends AbstractSimpleObject public function getMetadata() { $metadata = $this->_get(self::METADATA); - return !empty($metadata) ? unserialize($metadata) : []; + return !empty($metadata) ? $this->serializer->unserialize($metadata) : []; } /** @@ -227,7 +248,7 @@ class UrlRewrite extends AbstractSimpleObject public function setMetadata($metadata) { if (is_array($metadata)) { - $metadata = serialize($metadata); + $metadata = $this->serializer->serialize($metadata); } return $this->setData(UrlRewrite::METADATA, $metadata); } diff --git a/app/code/Magento/UrlRewrite/Setup/UpgradeData.php b/app/code/Magento/UrlRewrite/Setup/UpgradeData.php new file mode 100644 index 0000000000000000000000000000000000000000..c1853f07b7d24c5f82a569b9957414008c0d7a84 --- /dev/null +++ b/app/code/Magento/UrlRewrite/Setup/UpgradeData.php @@ -0,0 +1,63 @@ +<?php +/** + * Copyright © 2017 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\UrlRewrite\Setup; + +use Magento\Framework\DB\FieldDataConverterFactory; +use Magento\Framework\DB\DataConverter\SerializedToJson; +use Magento\Framework\Setup\ModuleContextInterface; +use Magento\Framework\Setup\ModuleDataSetupInterface; +use Magento\Framework\Setup\UpgradeDataInterface; + +class UpgradeData implements UpgradeDataInterface +{ + /** + * @var FieldDataConverterFactory + */ + private $fieldDataConverterFactory; + + /** + * Constructor + * + * @param FieldDataConverterFactory $fieldDataConverterFactory + */ + public function __construct( + FieldDataConverterFactory $fieldDataConverterFactory + ) { + $this->fieldDataConverterFactory = $fieldDataConverterFactory; + } + + /** + * @inheritdoc + */ + public function upgrade(ModuleDataSetupInterface $setup, ModuleContextInterface $context) + { + $setup->startSetup(); + + if (version_compare($context->getVersion(), '2.0.1', '<')) { + $this->convertSerializedDataToJson($setup); + } + + $setup->endSetup(); + } + + /** + * Convert metadata from serialized to JSON format: + * + * @param ModuleDataSetupInterface $setup + * + * @return void + */ + public function convertSerializedDataToJson($setup) + { + $fieldDataConverter = $this->fieldDataConverterFactory->create(SerializedToJson::class); + $fieldDataConverter->convert( + $setup->getConnection(), + $setup->getTable('url_rewrite'), + 'url_rewrite_id', + 'metadata' + ); + } +} diff --git a/app/code/Magento/UrlRewrite/Test/Unit/Block/Plugin/Store/Switcher/SetRedirectUrlTest.php b/app/code/Magento/UrlRewrite/Test/Unit/Block/Plugin/Store/Switcher/SetRedirectUrlTest.php index 9cf18a76cd045c8abd75d9f81c533d045df5f8ff..5118d12fad6c6e6b069a5a080c412ec1fd026e88 100644 --- a/app/code/Magento/UrlRewrite/Test/Unit/Block/Plugin/Store/Switcher/SetRedirectUrlTest.php +++ b/app/code/Magento/UrlRewrite/Test/Unit/Block/Plugin/Store/Switcher/SetRedirectUrlTest.php @@ -81,7 +81,7 @@ class SetRedirectUrlTest extends \PHPUnit_Framework_TestCase public function testGetTargetStorePostData() { - $urlRewrite = $this->getMock(\Magento\UrlRewrite\Service\V1\Data\UrlRewrite::class); + $urlRewrite = $this->getMock(\Magento\UrlRewrite\Service\V1\Data\UrlRewrite::class, [], [], '', false); $urlRewrite->expects($this->once())->method('getRequestPath')->willReturn('path'); $this->request->expects($this->once())->method('getPathInfo')->willReturn('path'); diff --git a/app/code/Magento/UrlRewrite/Test/Unit/Model/UrlRewriteTest.php b/app/code/Magento/UrlRewrite/Test/Unit/Model/UrlRewriteTest.php new file mode 100644 index 0000000000000000000000000000000000000000..a50d90c0475397df3e201ceb381d0e917e9d0dad --- /dev/null +++ b/app/code/Magento/UrlRewrite/Test/Unit/Model/UrlRewriteTest.php @@ -0,0 +1,66 @@ +<?php +/** + * Copyright © 2017 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\UrlRewrite\Test\Unit\Model; + +class UrlRewriteTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\UrlRewrite\Model\UrlRewrite + */ + protected $model; + + protected function setUp() + { + $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + + $context = $this->getMock(\Magento\Framework\Model\Context::class, [], [], '', false); + $registry = $this->getMock(\Magento\Framework\Registry::class, [], [], '', false); + $resource = $this->getMock( + \Magento\Framework\Model\ResourceModel\AbstractResource::class, + ['getIdFieldName', '_construct', 'getConnection'], + [], + '', + false + ); + $resourceCollection = $this->getMock(\Magento\Framework\Data\Collection\AbstractDb::class, [], [], '', false); + $serializer = $this->getMock(\Magento\Framework\Serialize\SerializerInterface::class, [], [], '', false); + $serializer->expects($this->any()) + ->method('serialize') + ->willReturnCallback( + function ($value) { + return json_encode($value); + } + ); + $serializer->expects($this->any()) + ->method('unserialize') + ->willReturnCallback( + function ($value) { + return json_decode($value, true); + } + ); + + $this->model = $objectManager->getObject( + \Magento\UrlRewrite\Model\UrlRewrite::class, + [ + 'context' => $context, + 'registry' => $registry, + 'resource' => $resource, + 'resourceCollection' => $resourceCollection, + 'data' => [], + 'serializer' => $serializer, + ] + ); + } + + public function testSetAndGetMetadata() + { + $testData = [1, 2, 3]; + + $this->model->setMetadata($testData); + + $this->assertEquals($testData, $this->model->getMetadata()); + } +} diff --git a/app/code/Magento/UrlRewrite/Test/Unit/Service/V1/Data/UrlRewriteTest.php b/app/code/Magento/UrlRewrite/Test/Unit/Service/V1/Data/UrlRewriteTest.php new file mode 100644 index 0000000000000000000000000000000000000000..883368600fbd0d9ccbee40320037797aece3f079 --- /dev/null +++ b/app/code/Magento/UrlRewrite/Test/Unit/Service/V1/Data/UrlRewriteTest.php @@ -0,0 +1,52 @@ +<?php +/** + * Copyright © 2017 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\UrlRewrite\Test\Unit\Service\V1\Data; + +class UrlRewriteTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\UrlRewrite\Model\UrlRewrite + */ + protected $model; + + protected function setUp() + { + $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + + $serializer = $this->getMock(\Magento\Framework\Serialize\SerializerInterface::class, [], [], '', false); + $serializer->expects($this->any()) + ->method('serialize') + ->willReturnCallback( + function ($value) { + return json_encode($value); + } + ); + $serializer->expects($this->any()) + ->method('unserialize') + ->willReturnCallback( + function ($value) { + return json_decode($value, true); + } + ); + + $this->model = $objectManager->getObject( + \Magento\UrlRewrite\Service\V1\Data\UrlRewrite::class, + [ + 'data' => [], + 'serializer' => $serializer, + ] + ); + } + + public function testSetAndGetMetadata() + { + $testData = [1, 2, 3]; + + $this->model->setMetadata($testData); + + $this->assertEquals($testData, $this->model->getMetadata()); + } +} diff --git a/app/code/Magento/UrlRewrite/etc/module.xml b/app/code/Magento/UrlRewrite/etc/module.xml index 284c67950ac539e6d4f030c32611981278f51c14..499a5166a860691e10fb7214b5a8983dd0d0ea3a 100644 --- a/app/code/Magento/UrlRewrite/etc/module.xml +++ b/app/code/Magento/UrlRewrite/etc/module.xml @@ -6,6 +6,6 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> - <module name="Magento_UrlRewrite" setup_version="2.0.0"> + <module name="Magento_UrlRewrite" setup_version="2.0.1"> </module> </config>