diff --git a/app/code/Magento/Backend/Block/Widget/Grid/Column/Filter/Date.php b/app/code/Magento/Backend/Block/Widget/Grid/Column/Filter/Date.php index 5675f0fcbdadf..f2def2a456fc5 100644 --- a/app/code/Magento/Backend/Block/Widget/Grid/Column/Filter/Date.php +++ b/app/code/Magento/Backend/Block/Widget/Grid/Column/Filter/Date.php @@ -205,7 +205,8 @@ protected function _convertDate($date) \IntlDateFormatter::NONE, $adminTimeZone ); - $simpleRes = new \DateTime('@' . $formatter->parse($date), $adminTimeZone); + $simpleRes = new \DateTime(null, $adminTimeZone); + $simpleRes->setTimestamp($formatter->parse($date)); $simpleRes->setTime(0, 0, 0); $simpleRes->setTimezone(new \DateTimeZone('UTC')); return $simpleRes; diff --git a/app/code/Magento/Backup/Model/Backup.php b/app/code/Magento/Backup/Model/Backup.php index 41ac57bdf704a..be790f48ef99a 100755 --- a/app/code/Magento/Backup/Model/Backup.php +++ b/app/code/Magento/Backup/Model/Backup.php @@ -152,7 +152,7 @@ public function load($fileName, $filePath) 'extension' => $this->_helper->getExtensionByType($backupData->getType()), 'display_name' => $this->_helper->nameToDisplayName($backupData->getName()), 'name' => $backupData->getName(), - 'date_object' => new \DateTime('@' . $backupData->getTime()), + 'date_object' => (new \DateTime())->setTimestamp($backupData->getTime()), ] ); diff --git a/app/code/Magento/Catalog/Model/Product/Option/Type/Date.php b/app/code/Magento/Catalog/Model/Product/Option/Type/Date.php index 9d4c877d8da83..e34493d509513 100644 --- a/app/code/Magento/Catalog/Model/Product/Option/Type/Date.php +++ b/app/code/Magento/Catalog/Model/Product/Option/Type/Date.php @@ -165,7 +165,7 @@ public function prepareForCart() $timestamp += 60 * 60 * $value['hour'] + 60 * $value['minute']; } - $date = new \DateTime('@' . $timestamp); + $date = (new \DateTime())->setTimestamp($timestamp); $result = $date->format('Y-m-d H:i:s'); // Save date in internal format to avoid locale date bugs @@ -188,19 +188,22 @@ public function getFormattedOptionValue($optionValue) { if ($this->_formattedOptionValue === null) { if ($this->getOption()->getType() == \Magento\Catalog\Model\Product\Option::OPTION_TYPE_DATE) { - $format = $this->_localeDate->getDateFormat( - \IntlDateFormatter::MEDIUM + $result = $this->_localeDate->formatDateTime( + new \DateTime($optionValue), + \IntlDateFormatter::MEDIUM, + \IntlDateFormatter::NONE ); - $result = \IntlDateFormatter::formatObject(new \DateTime($optionValue), $format); } elseif ($this->getOption()->getType() == \Magento\Catalog\Model\Product\Option::OPTION_TYPE_DATE_TIME) { - $format = $this->_localeDate->getDateTimeFormat( + $result = $this->_localeDate->formatDateTime( + new \DateTime($optionValue), + \IntlDateFormatter::SHORT, \IntlDateFormatter::SHORT ); - $result = \IntlDateFormatter::formatObject(new \DateTime($optionValue), $format); } elseif ($this->getOption()->getType() == \Magento\Catalog\Model\Product\Option::OPTION_TYPE_TIME) { - $result = \IntlDateFormatter::formatObject( + $result = $this->_localeDate->formatDateTime( new \DateTime($optionValue), - $this->is24hTimeFormat() ? 'H:i' : 'h:i a' + \IntlDateFormatter::NONE, + \IntlDateFormatter::SHORT ); } else { $result = $optionValue; diff --git a/app/code/Magento/CatalogImportExport/Model/Import/Product.php b/app/code/Magento/CatalogImportExport/Model/Import/Product.php index e8bba488c9612..97eb4ce5fbeff 100644 --- a/app/code/Magento/CatalogImportExport/Model/Import/Product.php +++ b/app/code/Magento/CatalogImportExport/Model/Import/Product.php @@ -1086,7 +1086,7 @@ protected function _saveProducts() $storeIds = [0]; if ('datetime' == $attribute->getBackendType() && strtotime($attrValue)) { - $attrValue = new \DateTime('@' . strtotime($attrValue)); + $attrValue = (new \DateTime())->setTimestamp(strtotime($attrValue)); $attrValue = $attrValue->format(DateTime::DATETIME_PHP_FORMAT); } elseif ($backModel) { $attribute->getBackend()->beforeSave($product); diff --git a/app/code/Magento/CatalogRule/Model/Observer.php b/app/code/Magento/CatalogRule/Model/Observer.php index b7babf6e6868d..88f24410e253e 100644 --- a/app/code/Magento/CatalogRule/Model/Observer.php +++ b/app/code/Magento/CatalogRule/Model/Observer.php @@ -267,7 +267,7 @@ public function prepareCatalogProductCollectionPrices(EventObserver $observer) if ($observer->getEvent()->hasDate()) { $date = new \DateTime($observer->getEvent()->getDate()); } else { - $date = new \DateTime('@' . $this->_localeDate->scopeTimeStamp($store)); + $date = (new \DateTime())->setTimestamp($this->_localeDate->scopeTimeStamp($store)); } $productIds = []; diff --git a/app/code/Magento/Customer/view/frontend/templates/form/register.phtml b/app/code/Magento/Customer/view/frontend/templates/form/register.phtml index c792446894428..934a7481cb65a 100644 --- a/app/code/Magento/Customer/view/frontend/templates/form/register.phtml +++ b/app/code/Magento/Customer/view/frontend/templates/form/register.phtml @@ -164,7 +164,7 @@ require([ 'jquery', 'mage/mage' -], function(jQuery){ +], function($){ var dataForm = $('#form-validate'); var ignore = isEnabled() ? '\'input[id$="full"]\'' : 'null'; ?>; diff --git a/app/code/Magento/CustomerImportExport/Model/Import/Address.php b/app/code/Magento/CustomerImportExport/Model/Import/Address.php index eb7a35225b27b..a5a37a7e363fd 100644 --- a/app/code/Magento/CustomerImportExport/Model/Import/Address.php +++ b/app/code/Magento/CustomerImportExport/Model/Import/Address.php @@ -473,7 +473,7 @@ protected function _prepareDataForUpdate(array $rowData) if ('select' == $attributeParams['type']) { $value = $attributeParams['options'][strtolower($rowData[$attributeAlias])]; } elseif ('datetime' == $attributeParams['type']) { - $value = new \DateTime('@' . strtotime($rowData[$attributeAlias])); + $value = (new \DateTime())->setTimestamp(strtotime($rowData[$attributeAlias])); $value = $value->format(\Magento\Framework\Stdlib\DateTime::DATETIME_PHP_FORMAT); } else { $value = $rowData[$attributeAlias]; diff --git a/app/code/Magento/CustomerImportExport/Model/Import/Customer.php b/app/code/Magento/CustomerImportExport/Model/Import/Customer.php index 0b37b5762f167..0608f206fa029 100644 --- a/app/code/Magento/CustomerImportExport/Model/Import/Customer.php +++ b/app/code/Magento/CustomerImportExport/Model/Import/Customer.php @@ -292,11 +292,11 @@ protected function _prepareDataForUpdate(array $rowData) $attributesToSave = []; // entity table data - $now = new \DateTime('@' . time()); + $now = new \DateTime(); if (empty($rowData['created_at'])) { $createdAt = $now; } else { - $createdAt = new \DateTime('@' . strtotime($rowData['created_at'])); + $createdAt = (new \DateTime())->setTimestamp(strtotime($rowData['created_at'])); } $entityRow = [ 'group_id' => empty($rowData['group_id']) ? self::DEFAULT_GROUP_ID : $rowData['group_id'], @@ -333,7 +333,7 @@ protected function _prepareDataForUpdate(array $rowData) if ('select' == $attributeParameters['type']) { $value = $attributeParameters['options'][strtolower($value)]; } elseif ('datetime' == $attributeParameters['type']) { - $value = new \DateTime('@' . strtotime($value)); + $value = (new \DateTime())->setTimestamp(strtotime($value)); $value = $value->format(\Magento\Framework\Stdlib\DateTime::DATETIME_PHP_FORMAT); } elseif ($backendModel) { $attribute->getBackend()->beforeSave($this->_customerModel->setData($attributeCode, $value)); diff --git a/app/code/Magento/Dhl/Model/Carrier.php b/app/code/Magento/Dhl/Model/Carrier.php index 64f37e2b674b8..6d5c1720a2ce7 100644 --- a/app/code/Magento/Dhl/Model/Carrier.php +++ b/app/code/Magento/Dhl/Model/Carrier.php @@ -1034,7 +1034,7 @@ protected function _parseResponse($response) if (strlen(trim($response)) > 0) { if (strpos(trim($response), 'parseXml($response, 'Magento\Shipping\Model\Simplexml\Element'); if (is_object($xml)) { if (in_array($xml->getName(), ['ErrorResponse', 'ShipmentValidateErrorResponse']) || isset($xml->GetQuoteResponse->Note->Condition) @@ -1775,7 +1775,7 @@ protected function _parseXmlTrackingResponse($trackings, $response) $resultArr = []; if (strlen(trim($response)) > 0) { - $xml = simplexml_load_string($response); + $xml = $this->parseXml($response, 'Magento\Shipping\Model\Simplexml\Element'); if (!is_object($xml)) { $errorTitle = __('Response is in the wrong format'); } diff --git a/app/code/Magento/Eav/Model/Entity/Attribute/Backend/Datetime.php b/app/code/Magento/Eav/Model/Entity/Attribute/Backend/Datetime.php index 464d03acab2f9..4145ac0a68cd9 100644 --- a/app/code/Magento/Eav/Model/Entity/Attribute/Backend/Datetime.php +++ b/app/code/Magento/Eav/Model/Entity/Attribute/Backend/Datetime.php @@ -71,7 +71,7 @@ public function formatDate($date) } // unix timestamp given - simply instantiate date object if (is_scalar($date) && preg_match('/^[0-9]+$/', $date)) { - $date = new \DateTime('@' . $date); + $date = (new \DateTime())->setTimestamp($date); // international format } elseif (!($date instanceof \DateTime)) { $date = new \DateTime($date); diff --git a/app/code/Magento/Fedex/Model/Carrier.php b/app/code/Magento/Fedex/Model/Carrier.php index f3767390c046a..51ac852ac050d 100644 --- a/app/code/Magento/Fedex/Model/Carrier.php +++ b/app/code/Magento/Fedex/Model/Carrier.php @@ -706,7 +706,8 @@ protected function _parseXmlResponse($response) $priceArr = []; if (strlen(trim($response)) > 0) { - if ($xml = $this->_parseXml($response)) { + $xml = $this->parseXml($response, 'Magento\Shipping\Model\Simplexml\Element'); + if (is_object($xml)) { if (is_object($xml->Error) && is_object($xml->Error->Message)) { $errorTitle = (string)$xml->Error->Message; } elseif (is_object($xml->SoftError) && is_object($xml->SoftError->Message)) { @@ -760,27 +761,6 @@ protected function _parseXmlResponse($response) return $result; } - /** - * Parse XML string and return XML document object or false - * - * @param string $xmlContent - * @return \Magento\Shipping\Model\Simplexml\Element|bool - * @throws \Exception - */ - protected function _parseXml($xmlContent) - { - try { - try { - return simplexml_load_string($xmlContent); - } catch (\Exception $e) { - throw new \Exception(__('Failed to parse xml document: %1', $xmlContent)); - } - } catch (\Exception $e) { - $this->_logger->critical($e); - return false; - } - } - /** * Get configuration data of carrier * diff --git a/app/code/Magento/Reports/Block/Adminhtml/Grid.php b/app/code/Magento/Reports/Block/Adminhtml/Grid.php index 5a09854e7c076..ddb112cd99363 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Grid.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Grid.php @@ -92,7 +92,7 @@ protected function _prepareCollection() if (!isset($data['report_from'])) { // getting all reports from 2001 year - $date = new \DateTime('@' . mktime(0, 0, 0, 1, 1, 2001)); + $date = (new \DateTime())->setTimestamp(mktime(0, 0, 0, 1, 1, 2001)); $data['report_from'] = $this->_localeDate->formatDateTime( $date, \IntlDateFormatter::SHORT, diff --git a/app/code/Magento/RequireJs/Block/Html/Head/Config.php b/app/code/Magento/RequireJs/Block/Html/Head/Config.php index 4f06884dfe81d..2d5e1c3322b94 100644 --- a/app/code/Magento/RequireJs/Block/Html/Head/Config.php +++ b/app/code/Magento/RequireJs/Block/Html/Head/Config.php @@ -6,13 +6,15 @@ namespace Magento\RequireJs\Block\Html\Head; +use Magento\Framework\RequireJs\Config as RequireJsConfig; + /** * Block responsible for including RequireJs config on the page */ class Config extends \Magento\Framework\View\Element\AbstractBlock { /** - * @var \Magento\Framework\RequireJs\Config + * @var RequireJsConfig */ private $config; @@ -28,7 +30,7 @@ class Config extends \Magento\Framework\View\Element\AbstractBlock /** * @param \Magento\Framework\View\Element\Context $context - * @param \Magento\Framework\RequireJs\Config $config + * @param RequireJsConfig $config * @param \Magento\RequireJs\Model\FileManager $fileManager * @param \Magento\Framework\View\Page\Config $pageConfig * @param \Magento\Framework\View\Asset\ConfigInterface $bundleConfig @@ -36,7 +38,7 @@ class Config extends \Magento\Framework\View\Element\AbstractBlock */ public function __construct( \Magento\Framework\View\Element\Context $context, - \Magento\Framework\RequireJs\Config $config, + RequireJsConfig $config, \Magento\RequireJs\Model\FileManager $fileManager, \Magento\Framework\View\Page\Config $pageConfig, \Magento\Framework\View\Asset\ConfigInterface $bundleConfig, @@ -59,28 +61,30 @@ protected function _prepareLayout() $requireJsConfig = $this->fileManager->createRequireJsConfigAsset(); $assetCollection = $this->pageConfig->getAssetCollection(); - if ($this->bundleConfig->isBundlingJsFiles()) { - $after = \Magento\Framework\RequireJs\Config::REQUIRE_JS_FILE_NAME; + $assetCollection->insert( + $requireJsConfig->getFilePath(), + $requireJsConfig, + RequireJsConfig::REQUIRE_JS_FILE_NAME + ); + if ($this->bundleConfig->isBundlingJsFiles()) { $bundleAssets = $this->fileManager->createBundleJsPool(); $staticAsset = $this->fileManager->createStaticJsAsset(); /** @var \Magento\Framework\View\Asset\File $bundleAsset */ if (!empty($bundleAssets) && $staticAsset !== false) { + $bundleAssets = array_reverse($bundleAssets); foreach ($bundleAssets as $bundleAsset) { - $assetCollection->insert($bundleAsset->getFilePath(), $bundleAsset, $after); - $after = $bundleAsset->getFilePath(); + $assetCollection->insert( + $bundleAsset->getFilePath(), + $bundleAsset, + RequireJsConfig::REQUIRE_JS_FILE_NAME + ); } - $assetCollection->insert($staticAsset->getFilePath(), $staticAsset, $after); + $assetCollection->insert($staticAsset->getFilePath(), $staticAsset, RequireJsConfig::CONFIG_FILE_NAME); } } - $assetCollection->insert( - $requireJsConfig->getFilePath(), - $requireJsConfig, - \Magento\Framework\RequireJs\Config::REQUIRE_JS_FILE_NAME - ); - return parent::_prepareLayout(); } diff --git a/app/code/Magento/Shipping/Model/Carrier/AbstractCarrierOnline.php b/app/code/Magento/Shipping/Model/Carrier/AbstractCarrierOnline.php index 15aca6c8b93b9..e4f38e73beec0 100644 --- a/app/code/Magento/Shipping/Model/Carrier/AbstractCarrierOnline.php +++ b/app/code/Magento/Shipping/Model/Carrier/AbstractCarrierOnline.php @@ -607,4 +607,17 @@ public function getMethodPrice($cost, $method = '') $cost ); } + + /** + * Parse XML string and return XML document object or false + * + * @param string $xmlContent + * @param string $customSimplexml + * + * @return \SimpleXMLElement|bool + */ + public function parseXml($xmlContent, $customSimplexml = 'SimpleXMLElement') + { + return simplexml_load_string($xmlContent, $customSimplexml); + } } diff --git a/app/code/Magento/Shipping/Test/Unit/Model/Carrier/AbstractCarrierOnlineTest.php b/app/code/Magento/Shipping/Test/Unit/Model/Carrier/AbstractCarrierOnlineTest.php index d2f63918def30..8d23a6c29774b 100644 --- a/app/code/Magento/Shipping/Test/Unit/Model/Carrier/AbstractCarrierOnlineTest.php +++ b/app/code/Magento/Shipping/Test/Unit/Model/Carrier/AbstractCarrierOnlineTest.php @@ -104,4 +104,15 @@ public function testComposePackages() $this->carrier->proccessAdditionalValidation($request); } + + public function testParseXml() + { + $xmlString = "42>"; + $simpleXmlElement = $this->carrier->parseXml($xmlString); + $this->assertEquals('GetResponse', $simpleXmlElement->getName()); + $this->assertEquals(42, (int)$simpleXmlElement->value); + $this->assertInstanceOf('SimpleXMLElement', $simpleXmlElement); + $customSimpleXmlElement = $this->carrier->parseXml($xmlString, 'Magento\Shipping\Model\Simplexml\Element'); + $this->assertInstanceOf('Magento\Shipping\Model\Simplexml\Element', $customSimpleXmlElement); + } } diff --git a/app/code/Magento/Usps/Model/Carrier.php b/app/code/Magento/Usps/Model/Carrier.php index efccb26521a63..49976c39fef46 100644 --- a/app/code/Magento/Usps/Model/Carrier.php +++ b/app/code/Magento/Usps/Model/Carrier.php @@ -512,7 +512,7 @@ protected function _parseXmlResponse($response) $response ); } - $xml = simplexml_load_string($response); + $xml = $this->parseXml($response); if (is_object($xml)) { $allowedMethods = explode(',', $this->getConfigData('allowed_methods')); @@ -1042,7 +1042,7 @@ protected function _parseXmlTrackingResponse($trackingvalue, $response) $resultArr = []; if (strlen(trim($response)) > 0) { if (strpos(trim($response), 'parseXml($response); if (is_object($xml)) { if (isset($xml->Number) && isset($xml->Description) && (string)$xml->Description != '') { $errorTitle = (string)$xml->Description; @@ -1869,7 +1869,7 @@ protected function _doShipmentRequest(\Magento\Framework\Object $request) $client->setParameterGet('XML', $requestXml); $response = $client->request()->getBody(); - $response = simplexml_load_string($response); + $response = $this->parseXml($response); if ($response === false || $response->getName() == 'Error') { $debugData['result'] = [ 'error' => $response->Description, diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php index 6b515c3cd676d..d01d17f39f125 100644 --- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php +++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php @@ -157,6 +157,7 @@ ['_parseDescription', 'Magento\Sales\Model\Order\Pdf\Items\AbstractItems'], ['_parsePackageTheme', 'Magento\Widget\Model\Widget\Instance'], ['_parseXmlTrackingResponse', 'Magento\Fedex\Model\Carrier'], + ['_parseXml', 'Magento\Fedex\Model\Carrier'], ['_prepareCondition', 'Magento\CatalogSearch\Model\Advanced'], ['_prepareConfigurableProductData', 'Magento\CatalogImportExport\Model\Export\Product'], ['_prepareConfigurableProductPrice', 'Magento\CatalogImportExport\Model\Export\Product'], diff --git a/dev/tools/Magento/Tools/Di/App/Compiler.php b/dev/tools/Magento/Tools/Di/App/Compiler.php index f8f65ad42b476..751eca2ac1c17 100644 --- a/dev/tools/Magento/Tools/Di/App/Compiler.php +++ b/dev/tools/Magento/Tools/Di/App/Compiler.php @@ -32,19 +32,50 @@ class Compiler implements \Magento\Framework\AppInterface */ private $response; + /** + * @var array + */ + private $compiledPathsList = []; + + /** + * @var array + */ + private $excludedPathsList = []; + /** * @param Task\Manager $taskManager * @param ObjectManagerInterface $objectManager * @param Response $response + * @param array $compiledPathsList + * @param array $excludedPathsList */ public function __construct( Task\Manager $taskManager, ObjectManagerInterface $objectManager, - Response $response + Response $response, + $compiledPathsList = [], + $excludedPathsList = [] ) { $this->taskManager = $taskManager; $this->objectManager = $objectManager; $this->response = $response; + + if (empty($compiledPathsList)) { + $compiledPathsList = [ + 'application' => BP . '/' . 'app/code', + 'library' => BP . '/' . 'lib/internal/Magento/Framework', + 'generated_helpers' => BP . '/' . 'var/generation' + ]; + } + $this->compiledPathsList = $compiledPathsList; + + if (empty($excludedPathsList)) { + $excludedPathsList = [ + 'application' => '#^' . BP . '/app/code/[\\w]+/[\\w]+/Test#', + 'framework' => '#^' . BP . '/lib/internal/[\\w]+/[\\w]+/([\\w]+/)?Test#' + ]; + } + $this->excludedPathsList = $excludedPathsList; } /** @@ -85,25 +116,43 @@ public function launch() 'instance' => 'Magento\Framework\App\Interception\Cache\CompiledConfig' ] ] + ], + 'Magento\Tools\Di\Code\Reader\ClassesScanner' => [ + 'arguments' => [ + 'excludePatterns' => $this->excludedPathsList + ] ] ] ); $operations = [ Task\OperationFactory::REPOSITORY_GENERATOR => [ - 'path' => BP . '/' . 'app/code', + 'path' => $this->compiledPathsList['application'], 'filePatterns' => ['di' => '/\/etc\/([a-zA-Z_]*\/di|di)\.xml$/'] ], Task\OperationFactory::APPLICATION_CODE_GENERATOR => [ - BP . '/' . 'app/code', BP . '/' . 'lib/internal/Magento/Framework', BP . '/' . 'var/generation' + $this->compiledPathsList['application'], + $this->compiledPathsList['library'], + $this->compiledPathsList['generated_helpers'], ], Task\OperationFactory::INTERCEPTION => - BP . '/var/generation', + [ + 'intercepted_paths' => [ + $this->compiledPathsList['application'], + $this->compiledPathsList['library'], + $this->compiledPathsList['generated_helpers'], + ], + 'path_to_store' => $this->compiledPathsList['generated_helpers'], + ], Task\OperationFactory::AREA_CONFIG_GENERATOR => [ - BP . '/' . 'app/code', BP . '/' . 'lib/internal/Magento/Framework', BP . '/' . 'var/generation' + $this->compiledPathsList['application'], + $this->compiledPathsList['library'], + $this->compiledPathsList['generated_helpers'], ], Task\OperationFactory::INTERCEPTION_CACHE => [ - BP . '/' . 'app/code', BP . '/' . 'lib/internal/Magento/Framework', BP . '/' . 'var/generation' + $this->compiledPathsList['application'], + $this->compiledPathsList['library'], + $this->compiledPathsList['generated_helpers'], ] ]; diff --git a/dev/tools/Magento/Tools/Di/App/Task/Operation/Area.php b/dev/tools/Magento/Tools/Di/App/Task/Operation/Area.php index 2cda2f6edcd41..c9a8089251b42 100644 --- a/dev/tools/Magento/Tools/Di/App/Task/Operation/Area.php +++ b/dev/tools/Magento/Tools/Di/App/Task/Operation/Area.php @@ -18,7 +18,7 @@ class Area implements OperationInterface private $areaList; /** - * @var \Magento\Tools\Di\Code\Reader\InstancesNamesList\Area + * @var \Magento\Tools\Di\Code\Reader\Decorator\Area */ private $areaInstancesNamesList; @@ -44,7 +44,7 @@ class Area implements OperationInterface /** * @param App\AreaList $areaList - * @param \Magento\Tools\Di\Code\Reader\InstancesNamesList\Area $areaInstancesNamesList + * @param \Magento\Tools\Di\Code\Reader\Decorator\Area $areaInstancesNamesList * @param Config\Reader $configReader * @param Config\WriterInterface $configWriter * @param \Magento\Tools\Di\Compiler\Config\ModificationChain $modificationChain @@ -52,7 +52,7 @@ class Area implements OperationInterface */ public function __construct( App\AreaList $areaList, - \Magento\Tools\Di\Code\Reader\InstancesNamesList\Area $areaInstancesNamesList, + \Magento\Tools\Di\Code\Reader\Decorator\Area $areaInstancesNamesList, Config\Reader $configReader, Config\WriterInterface $configWriter, Config\ModificationChain $modificationChain, diff --git a/dev/tools/Magento/Tools/Di/App/Task/Operation/Interception.php b/dev/tools/Magento/Tools/Di/App/Task/Operation/Interception.php index 43bff9fa412ce..f6cf82e11a1a0 100644 --- a/dev/tools/Magento/Tools/Di/App/Task/Operation/Interception.php +++ b/dev/tools/Magento/Tools/Di/App/Task/Operation/Interception.php @@ -9,6 +9,8 @@ use Magento\Tools\Di\Code\Generator\InterceptionConfigurationBuilder; use Magento\Framework\Interception\Code\Generator\Interceptor; use Magento\Framework\App; +use Magento\Tools\Di\Code\GeneratorFactory; +use Magento\Tools\Di\Code\Reader\ClassesScanner; class Interception implements OperationInterface { @@ -23,23 +25,39 @@ class Interception implements OperationInterface private $interceptionConfigurationBuilder; /** - * @var string + * @var array */ - private $data = ''; + private $data = []; + + /** + * @var ClassesScanner + */ + private $classesScanner; + + /** + * @var GeneratorFactory + */ + private $generatorFactory; /** * @param InterceptionConfigurationBuilder $interceptionConfigurationBuilder * @param App\AreaList $areaList - * @param string $data + * @param ClassesScanner $classesScanner + * @param GeneratorFactory $generatorFactory + * @param array $data */ public function __construct( InterceptionConfigurationBuilder $interceptionConfigurationBuilder, App\AreaList $areaList, - $data = '' + ClassesScanner $classesScanner, + GeneratorFactory $generatorFactory, + $data = [] ) { $this->interceptionConfigurationBuilder = $interceptionConfigurationBuilder; $this->areaList = $areaList; $this->data = $data; + $this->classesScanner = $classesScanner; + $this->generatorFactory = $generatorFactory; } /** @@ -56,17 +74,24 @@ public function doOperation() $this->interceptionConfigurationBuilder->addAreaCode($areaCode); } + $classesList = []; + foreach ($this->data['intercepted_paths'] as $path) { + $classesList = array_merge($classesList, $this->classesScanner->getList($path)); + } + $generatorIo = new \Magento\Framework\Code\Generator\Io( new \Magento\Framework\Filesystem\Driver\File(), - $this->data + $this->data['path_to_store'] ); - $generator = new \Magento\Tools\Di\Code\Generator( - $generatorIo, + $generator = $this->generatorFactory->create( [ - Interceptor::ENTITY_TYPE => 'Magento\Tools\Di\Code\Generator\Interceptor', + 'ioObject' => $generatorIo, + 'generatedEntities' => [ + Interceptor::ENTITY_TYPE => 'Magento\Tools\Di\Code\Generator\Interceptor', + ] ] ); - $configuration = $this->interceptionConfigurationBuilder->getInterceptionConfiguration(get_declared_classes()); + $configuration = $this->interceptionConfigurationBuilder->getInterceptionConfiguration($classesList); $generator->generateList($configuration); } } diff --git a/dev/tools/Magento/Tools/Di/App/Task/Operation/InterceptionCache.php b/dev/tools/Magento/Tools/Di/App/Task/Operation/InterceptionCache.php index 3a060fdeb8e6c..31180fc27d701 100644 --- a/dev/tools/Magento/Tools/Di/App/Task/Operation/InterceptionCache.php +++ b/dev/tools/Magento/Tools/Di/App/Task/Operation/InterceptionCache.php @@ -20,18 +20,18 @@ class InterceptionCache implements OperationInterface private $configInterface; /** - * @var \Magento\Tools\Di\Code\Reader\InstancesNamesList\Interceptions + * @var \Magento\Tools\Di\Code\Reader\Decorator\Interceptions */ private $interceptionsInstancesNamesList; /** * @param \Magento\Framework\Interception\Config\Config $configInterface - * @param \Magento\Tools\Di\Code\Reader\InstancesNamesList\Interceptions $interceptionsInstancesNamesList + * @param \Magento\Tools\Di\Code\Reader\Decorator\Interceptions $interceptionsInstancesNamesList * @param array $data */ public function __construct( \Magento\Framework\Interception\Config\Config $configInterface, - \Magento\Tools\Di\Code\Reader\InstancesNamesList\Interceptions $interceptionsInstancesNamesList, + \Magento\Tools\Di\Code\Reader\Decorator\Interceptions $interceptionsInstancesNamesList, array $data = [] ) { $this->configInterface = $configInterface; diff --git a/dev/tools/Magento/Tools/Di/Code/Generator.php b/dev/tools/Magento/Tools/Di/Code/Generator.php index 22256a415814a..0eaf442daccdd 100644 --- a/dev/tools/Magento/Tools/Di/Code/Generator.php +++ b/dev/tools/Magento/Tools/Di/Code/Generator.php @@ -8,6 +8,8 @@ namespace Magento\Tools\Di\Code; use Magento\Framework\Code\Generator as FrameworkGenerator; +use Magento\Framework\Code\Generator\DefinedClasses; +use Magento\Framework\ObjectManagerInterface; /** * Class Generator @@ -22,6 +24,23 @@ class Generator extends FrameworkGenerator */ private $classMethods = []; + /** + * @param ObjectManagerInterface $objectManagerInterface + * @param FrameworkGenerator\Io $ioObject + * @param array $generatedEntities + * @param DefinedClasses $definedClasses + */ + public function __construct( + ObjectManagerInterface $objectManagerInterface, + \Magento\Framework\Code\Generator\Io $ioObject = null, + array $generatedEntities = [], + DefinedClasses $definedClasses = null + ) { + parent::__construct($ioObject, $generatedEntities, $definedClasses); + $this->setObjectManager($objectManagerInterface); + } + + /** * Create entity generator * diff --git a/dev/tools/Magento/Tools/Di/Code/GeneratorFactory.php b/dev/tools/Magento/Tools/Di/Code/GeneratorFactory.php new file mode 100644 index 0000000000000..b3e8135210754 --- /dev/null +++ b/dev/tools/Magento/Tools/Di/Code/GeneratorFactory.php @@ -0,0 +1,35 @@ +objectManager = $objectManager; + } + + /** + * Creates operation + * + * @param array $arguments + * @return Generator + */ + public function create($arguments = []) + { + return $this->objectManager->create('Magento\Tools\Di\Code\Generator', $arguments); + } +} diff --git a/dev/tools/Magento/Tools/Di/Code/Reader/ClassesScanner.php b/dev/tools/Magento/Tools/Di/Code/Reader/ClassesScanner.php index b8c332df6bbfb..f91f9fbc27cd3 100644 --- a/dev/tools/Magento/Tools/Di/Code/Reader/ClassesScanner.php +++ b/dev/tools/Magento/Tools/Di/Code/Reader/ClassesScanner.php @@ -8,13 +8,21 @@ use Magento\Framework\Filesystem\FilesystemException; use Zend\Code\Scanner\FileScanner; -class ClassesScanner +class ClassesScanner implements ClassesScannerInterface { /** * @var array */ protected $excludePatterns = []; + /** + * @param array $excludePatterns + */ + public function __construct(array $excludePatterns = []) + { + $this->excludePatterns = $excludePatterns; + } + /** * Adds exclude patterns * diff --git a/dev/tools/Magento/Tools/Di/Code/Reader/InstancesNamesListInterface.php b/dev/tools/Magento/Tools/Di/Code/Reader/ClassesScannerInterface.php similarity index 84% rename from dev/tools/Magento/Tools/Di/Code/Reader/InstancesNamesListInterface.php rename to dev/tools/Magento/Tools/Di/Code/Reader/ClassesScannerInterface.php index 719a914f3556b..0812ceaf2a4be 100644 --- a/dev/tools/Magento/Tools/Di/Code/Reader/InstancesNamesListInterface.php +++ b/dev/tools/Magento/Tools/Di/Code/Reader/ClassesScannerInterface.php @@ -6,11 +6,11 @@ namespace Magento\Tools\Di\Code\Reader; /** - * Interface InstancesNamesList + * Interface ClassesScannerInterface * * @package Magento\Tools\Di\Code\Reader */ -interface InstancesNamesListInterface +interface ClassesScannerInterface { /** diff --git a/dev/tools/Magento/Tools/Di/Code/Reader/InstancesNamesList/Area.php b/dev/tools/Magento/Tools/Di/Code/Reader/Decorator/Area.php similarity index 86% rename from dev/tools/Magento/Tools/Di/Code/Reader/InstancesNamesList/Area.php rename to dev/tools/Magento/Tools/Di/Code/Reader/Decorator/Area.php index 7143d136e12ec..a70c2291eeb66 100644 --- a/dev/tools/Magento/Tools/Di/Code/Reader/InstancesNamesList/Area.php +++ b/dev/tools/Magento/Tools/Di/Code/Reader/Decorator/Area.php @@ -3,7 +3,7 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ -namespace Magento\Tools\Di\Code\Reader\InstancesNamesList; +namespace Magento\Tools\Di\Code\Reader\Decorator; use Magento\Tools\Di\Code\Reader\ClassesScanner; use Magento\Tools\Di\Code\Reader\ClassReaderDecorator; @@ -12,9 +12,9 @@ /** * Class Area * - * @package Magento\Tools\Di\Code\Reader\InstancesNamesList + * @package Magento\Tools\Di\Code\Reader\Decorator */ -class Area implements \Magento\Tools\Di\Code\Reader\InstancesNamesListInterface +class Area implements \Magento\Tools\Di\Code\Reader\ClassesScannerInterface { /** * @var ClassReaderDecorator diff --git a/dev/tools/Magento/Tools/Di/Code/Reader/InstancesNamesList/Directory.php b/dev/tools/Magento/Tools/Di/Code/Reader/Decorator/Directory.php similarity index 93% rename from dev/tools/Magento/Tools/Di/Code/Reader/InstancesNamesList/Directory.php rename to dev/tools/Magento/Tools/Di/Code/Reader/Decorator/Directory.php index 8cec8b58f34b9..83d8e41078560 100644 --- a/dev/tools/Magento/Tools/Di/Code/Reader/InstancesNamesList/Directory.php +++ b/dev/tools/Magento/Tools/Di/Code/Reader/Decorator/Directory.php @@ -3,16 +3,16 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ -namespace Magento\Tools\Di\Code\Reader\InstancesNamesList; +namespace Magento\Tools\Di\Code\Reader\Decorator; use Magento\Tools\Di\Compiler\Log\Log; /** * Class Directory * - * @package Magento\Tools\Di\Code\Reader\InstancesNamesList + * @package Magento\Tools\Di\Code\Reader\Decorator */ -class Directory implements \Magento\Tools\Di\Code\Reader\InstancesNamesListInterface +class Directory implements \Magento\Tools\Di\Code\Reader\ClassesScannerInterface { /** * @var string diff --git a/dev/tools/Magento/Tools/Di/Code/Reader/InstancesNamesList/Interceptions.php b/dev/tools/Magento/Tools/Di/Code/Reader/Decorator/Interceptions.php similarity index 92% rename from dev/tools/Magento/Tools/Di/Code/Reader/InstancesNamesList/Interceptions.php rename to dev/tools/Magento/Tools/Di/Code/Reader/Decorator/Interceptions.php index 7c04e4e336270..8836c53070b59 100644 --- a/dev/tools/Magento/Tools/Di/Code/Reader/InstancesNamesList/Interceptions.php +++ b/dev/tools/Magento/Tools/Di/Code/Reader/Decorator/Interceptions.php @@ -3,16 +3,16 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ -namespace Magento\Tools\Di\Code\Reader\InstancesNamesList; +namespace Magento\Tools\Di\Code\Reader\Decorator; use Magento\Tools\Di\Compiler\Log\Log; /** * Class Interceptions * - * @package Magento\Tools\Di\Code\Reader\InstancesNamesList + * @package Magento\Tools\Di\Code\Reader\Decorator */ -class Interceptions implements \Magento\Tools\Di\Code\Reader\InstancesNamesListInterface +class Interceptions implements \Magento\Tools\Di\Code\Reader\ClassesScannerInterface { /** * @var \Magento\Tools\Di\Code\Reader\ClassReaderDecorator diff --git a/dev/tools/Magento/Tools/Di/Test/Unit/App/CompilerTest.php b/dev/tools/Magento/Tools/Di/Test/Unit/App/CompilerTest.php index aad0c51d60fca..665e5c237a0cf 100644 --- a/dev/tools/Magento/Tools/Di/Test/Unit/App/CompilerTest.php +++ b/dev/tools/Magento/Tools/Di/Test/Unit/App/CompilerTest.php @@ -44,6 +44,7 @@ protected function setUp() ->disableOriginalConstructor() ->setMethods([]) ->getMock(); + $this->application = new Compiler( $this->taskManagerMock, $this->objectManagerMock, @@ -133,6 +134,14 @@ private function getPreferences() 'instance' => 'Magento\Framework\App\Interception\Cache\CompiledConfig' ] ] + ], + 'Magento\Tools\Di\Code\Reader\ClassesScanner' => [ + 'arguments' => [ + 'excludePatterns' => [ + 'application' => '#^' . BP . '/app/code/[\\w]+/[\\w]+/Test#', + 'framework' => '#^' . BP . '/lib/internal/[\\w]+/[\\w]+/([\\w]+/)?Test#' + ] + ] ] ]; } @@ -150,15 +159,21 @@ private function getOptions() 'filePatterns' => ['di' => '/\/etc\/([a-zA-Z_]*\/di|di)\.xml$/'] ], Task\OperationFactory::APPLICATION_CODE_GENERATOR => [ - BP . '/' . 'app/code', BP . '/' . 'lib/internal/Magento/Framework', BP . '/' . 'var/generation' + BP . '/' . 'app/code', BP . '/' . 'lib/internal/Magento/Framework', BP . '/' . 'var/generation' + ], + Task\OperationFactory::INTERCEPTION => [ + 'intercepted_paths' => [ + BP . '/' . 'app/code', + BP . '/' . 'lib/internal/Magento/Framework', + BP . '/' . 'var/generation' + ], + 'path_to_store' => BP . '/var/generation', ], - Task\OperationFactory::INTERCEPTION => - BP . '/var/generation', Task\OperationFactory::AREA_CONFIG_GENERATOR => [ - BP . '/' . 'app/code', BP . '/' . 'lib/internal/Magento/Framework', BP . '/' . 'var/generation' + BP . '/' . 'app/code', BP . '/' . 'lib/internal/Magento/Framework', BP . '/' . 'var/generation' ], Task\OperationFactory::INTERCEPTION_CACHE => [ - BP . '/' . 'app/code', BP . '/' . 'lib/internal/Magento/Framework', BP . '/' . 'var/generation' + BP . '/' . 'app/code', BP . '/' . 'lib/internal/Magento/Framework', BP . '/' . 'var/generation' ] ]; } diff --git a/dev/tools/Magento/Tools/Di/Test/Unit/App/Task/AreaTest.php b/dev/tools/Magento/Tools/Di/Test/Unit/App/Task/AreaTest.php index 5e4034fd47609..c55f63e8ab9ce 100644 --- a/dev/tools/Magento/Tools/Di/Test/Unit/App/Task/AreaTest.php +++ b/dev/tools/Magento/Tools/Di/Test/Unit/App/Task/AreaTest.php @@ -19,7 +19,7 @@ class AreaTest extends \PHPUnit_Framework_TestCase private $areaListMock; /** - * @var \Magento\Tools\Di\Code\Reader\InstancesNamesList\Area | \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Tools\Di\Code\Reader\Decorator\Area | \PHPUnit_Framework_MockObject_MockObject */ private $areaInstancesNamesList; @@ -43,7 +43,7 @@ protected function setUp() $this->areaListMock = $this->getMockBuilder('Magento\Framework\App\AreaList') ->disableOriginalConstructor() ->getMock(); - $this->areaInstancesNamesList = $this->getMockBuilder('\Magento\Tools\Di\Code\Reader\InstancesNamesList\Area') + $this->areaInstancesNamesList = $this->getMockBuilder('\Magento\Tools\Di\Code\Reader\Decorator\Area') ->disableOriginalConstructor() ->getMock(); $this->configReaderMock = $this->getMockBuilder('Magento\Tools\Di\Compiler\Config\Reader') diff --git a/dev/tools/Magento/Tools/Di/Test/Unit/App/Task/InterceptionCacheTest.php b/dev/tools/Magento/Tools/Di/Test/Unit/App/Task/InterceptionCacheTest.php index dadc312493474..9d86c20b3b381 100644 --- a/dev/tools/Magento/Tools/Di/Test/Unit/App/Task/InterceptionCacheTest.php +++ b/dev/tools/Magento/Tools/Di/Test/Unit/App/Task/InterceptionCacheTest.php @@ -15,7 +15,7 @@ class InterceptionCacheTest extends \PHPUnit_Framework_TestCase private $configMock; /** - * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Tools\Di\Code\Reader\InstancesNamesList\Interceptions + * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Tools\Di\Code\Reader\Decorator\Interceptions */ private $interceptionsListMock; @@ -26,7 +26,7 @@ public function setUp() ->disableOriginalConstructor() ->getMock(); $this->interceptionsListMock = $this->getMockBuilder( - 'Magento\Tools\Di\Code\Reader\InstancesNamesList\Interceptions' + 'Magento\Tools\Di\Code\Reader\Decorator\Interceptions' ) ->setMethods([]) ->disableOriginalConstructor() diff --git a/dev/tools/Magento/Tools/Di/Test/Unit/Code/Reader/InstancesNamesList/AreaTest.php b/dev/tools/Magento/Tools/Di/Test/Unit/Code/Reader/InstancesNamesList/AreaTest.php index 031bea9559147..8a74b8a4dbe7a 100644 --- a/dev/tools/Magento/Tools/Di/Test/Unit/Code/Reader/InstancesNamesList/AreaTest.php +++ b/dev/tools/Magento/Tools/Di/Test/Unit/Code/Reader/InstancesNamesList/AreaTest.php @@ -5,12 +5,12 @@ */ namespace Magento\Tools\Di\Test\Unit\Code\Reader\InstancesNamesList; -use \Magento\Tools\Di\Code\Reader\InstancesNamesList\Area; +use \Magento\Tools\Di\Code\Reader\Decorator\Area; /** * Class AreaTest * - * @package Magento\Tools\Di\Code\Reader\InstancesNamesList + * @package Magento\Tools\Di\Code\Reader\Decorator */ class AreaTest extends \PHPUnit_Framework_TestCase { @@ -41,7 +41,7 @@ protected function setUp() ->setMethods(['getConstructor']) ->getMock(); - $this->model = new \Magento\Tools\Di\Code\Reader\InstancesNamesList\Area( + $this->model = new \Magento\Tools\Di\Code\Reader\Decorator\Area( $this->classesScannerMock, $this->classReaderDecoratorMock ); diff --git a/dev/tools/Magento/Tools/Di/Test/Unit/Code/Reader/InstancesNamesList/DirectoryTest.php b/dev/tools/Magento/Tools/Di/Test/Unit/Code/Reader/InstancesNamesList/DirectoryTest.php index 40c294aea1f67..585d6dadc196f 100644 --- a/dev/tools/Magento/Tools/Di/Test/Unit/Code/Reader/InstancesNamesList/DirectoryTest.php +++ b/dev/tools/Magento/Tools/Di/Test/Unit/Code/Reader/InstancesNamesList/DirectoryTest.php @@ -10,7 +10,7 @@ /** * Class DirectoryTest * - * @package Magento\Tools\Di\Code\Reader\InstancesNamesList + * @package Magento\Tools\Di\Code\Reader\Decorator */ class DirectoryTest extends \PHPUnit_Framework_TestCase { @@ -25,7 +25,7 @@ class DirectoryTest extends \PHPUnit_Framework_TestCase private $classReaderMock; /** - * @var \Magento\Tools\Di\Code\Reader\InstancesNamesList\Directory + * @var \Magento\Tools\Di\Code\Reader\Decorator\Directory */ private $model; @@ -61,7 +61,7 @@ protected function setUp() ->setMethods(['validate']) ->getMock(); - $this->model = new \Magento\Tools\Di\Code\Reader\InstancesNamesList\Directory( + $this->model = new \Magento\Tools\Di\Code\Reader\Decorator\Directory( $this->logMock, $this->classReaderMock, $this->classesScanner, diff --git a/dev/tools/Magento/Tools/Di/Test/Unit/Code/Reader/InstancesNamesList/InterceptionsTest.php b/dev/tools/Magento/Tools/Di/Test/Unit/Code/Reader/InstancesNamesList/InterceptionsTest.php index 1800f6a8c6e00..8a161f49a0a54 100644 --- a/dev/tools/Magento/Tools/Di/Test/Unit/Code/Reader/InstancesNamesList/InterceptionsTest.php +++ b/dev/tools/Magento/Tools/Di/Test/Unit/Code/Reader/InstancesNamesList/InterceptionsTest.php @@ -10,7 +10,7 @@ /** * Class InterceptionsTest * - * @package Magento\Tools\Di\Code\Reader\InstancesNamesList + * @package Magento\Tools\Di\Code\Reader\Decorator */ class InterceptionsTest extends \PHPUnit_Framework_TestCase { @@ -25,7 +25,7 @@ class InterceptionsTest extends \PHPUnit_Framework_TestCase private $classReaderMock; /** - * @var \Magento\Tools\Di\Code\Reader\InstancesNamesList\Directory + * @var \Magento\Tools\Di\Code\Reader\Decorator\Directory */ private $model; @@ -61,7 +61,7 @@ protected function setUp() ->setMethods(['validate', 'add']) ->getMock(); - $this->model = new \Magento\Tools\Di\Code\Reader\InstancesNamesList\Interceptions( + $this->model = new \Magento\Tools\Di\Code\Reader\Decorator\Interceptions( $this->classesScanner, $this->classReaderMock, $this->validatorMock, diff --git a/dev/tools/Magento/Tools/Di/compiler.php b/dev/tools/Magento/Tools/Di/compiler.php index fee6aa1320565..fca4673dd90fd 100644 --- a/dev/tools/Magento/Tools/Di/compiler.php +++ b/dev/tools/Magento/Tools/Di/compiler.php @@ -164,7 +164,7 @@ $classesScanner = new \Magento\Tools\Di\Code\Reader\ClassesScanner(); $classesScanner->addExcludePatterns($fileExcludePatterns); - $directoryInstancesNamesList = new \Magento\Tools\Di\Code\Reader\InstancesNamesList\Directory( + $directoryInstancesNamesList = new \Magento\Tools\Di\Code\Reader\Decorator\Directory( $log, new \Magento\Framework\Code\Reader\ClassReader(), $classesScanner,