31 public function __construct(\
Magento\Framework\Code\Reader\ArgumentsReader $argumentsReader =
null)
33 $this->_argumentsReader = $argumentsReader ?: new \Magento\Framework\Code\Reader\ArgumentsReader();
47 $classArguments = $this->_argumentsReader->getConstructorArguments(
$class);
53 $parent =
$class->getParentClass();
54 $parentArguments = [];
56 $parentClass = $parent->getName();
57 if (0 !== strpos($parentClass,
'\\')) {
58 $parentClass =
'\\' . $parentClass;
61 if (isset($this->_cache[$parentClass])) {
62 $parentCall = $this->_argumentsReader->getParentCall(
$class, []);
63 if (empty($classArguments) || $parentCall) {
64 $parentArguments = $this->_cache[$parentClass];
69 if (empty($classArguments)) {
70 $classArguments = $parentArguments;
73 $requiredSequence = $this->
_buildsSequence($classArguments, $parentArguments);
74 if (!empty($requiredSequence)) {
79 $classPath = str_replace(
'\\',
'/',
$class->getFileName());
80 throw new \Magento\Framework\Exception\ValidatorException(
82 'Incorrect argument sequence in class %1 in %2%3Required: $%4%5Actual : $%6%7',
87 implode(
', $', array_keys($requiredSequence)),
89 implode(
', $', array_keys($classArguments)),
108 $actualArgumentSequence = [];
109 $requiredArgumentSequence = [];
111 foreach ($actualSequence as
$name => $argument) {
112 if (
false == $argument[
'isOptional']) {
113 $actualArgumentSequence[
$name] = $argument;
119 foreach ($requiredSequence as
$name => $argument) {
120 if (
false == $argument[
'isOptional']) {
121 $requiredArgumentSequence[
$name] = $argument;
126 $actual = array_keys($actualArgumentSequence);
127 $required = array_keys($requiredArgumentSequence);
140 protected function _buildsSequence(array $classArguments, array $parentArguments = [])
143 if (empty($classArguments)) {
144 return $parentArguments;
151 foreach ($parentArgumentList[self::REQUIRED] as
$name => $argument) {
152 if (!isset($classArgumentList[self::OPTIONAL][
$name])) {
154 $classArgumentList[self::REQUIRED][
$name]
161 foreach ($classArgumentList[self::REQUIRED] as
$name => $argument) {
168 foreach ($migrated as
$name => $argument) {
174 foreach ($parentArgumentList[self::OPTIONAL] as
$name => $argument) {
177 $classArgumentList[self::OPTIONAL][
$name]
182 foreach ($classArgumentList[self::OPTIONAL] as
$name => $argument) {
203 if ($argument[
'isOptional']) {
204 $optional[
$name] = $argument;
210 return [self::REQUIRED =>
$required, self::OPTIONAL => $optional];
225 return $argument[
'type'] && $this->
_isContextType($argument[
'type']);
_checkArgumentSequence(array $actualSequence, array $requiredSequence)
is_subclass_of($obj, $className)
__construct(\Magento\Framework\Code\Reader\ArgumentsReader $argumentsReader=null)
_buildsSequence(array $classArguments, array $parentArguments=[])
_isContextOnly(array $arguments)
_sortArguments($arguments)
$_option $_optionId $class
if(!isset($_GET['name'])) $name