Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
ConstructorIntegrity.php
Go to the documentation of this file.
1 <?php
9 
12 
14 {
18  protected $_argumentsReader;
19 
23  public function __construct(\Magento\Framework\Code\Reader\ArgumentsReader $argumentsReader = null)
24  {
25  $this->_argumentsReader = $argumentsReader ?: new \Magento\Framework\Code\Reader\ArgumentsReader();
26  }
27 
37  public function validate($className)
38  {
39  $class = new \ReflectionClass($className);
40  $parent = $class->getParentClass();
41 
43  if (!$parent) {
44  return true;
45  }
46 
48  $parentArguments = $this->_argumentsReader->getConstructorArguments($parent, true, true);
49  if (empty($parentArguments)) {
50  return true;
51  }
52 
54  $classArguments = $this->_argumentsReader->getConstructorArguments($class);
55  if (null === $classArguments) {
56  return true;
57  }
58 
60  $callArguments = $this->_argumentsReader->getParentCall($class, $classArguments);
61  if (null === $callArguments) {
62  return true;
63  }
64 
66  $parentArguments = $this->_argumentsReader->getConstructorArguments($parent, true, true);
67 
68  foreach ($parentArguments as $index => $requiredArgument) {
69  if (isset($callArguments[$index])) {
70  $actualArgument = $callArguments[$index];
71  } else {
72  if ($requiredArgument['isOptional']) {
73  continue;
74  }
75 
76  $classPath = str_replace('\\', '/', $class->getFileName());
77  throw new \Magento\Framework\Exception\ValidatorException(
78  new Phrase(
79  'Missed required argument %1 in parent::__construct call. File: %2',
80  [$requiredArgument['name'], $classPath]
81  )
82  );
83  }
84 
85  $isCompatibleTypes = $this->_argumentsReader->isCompatibleType(
86  $requiredArgument['type'],
87  $actualArgument['type']
88  );
89  if (false == $isCompatibleTypes) {
90  $classPath = str_replace('\\', '/', $class->getFileName());
91  throw new \Magento\Framework\Exception\ValidatorException(
92  new Phrase(
93  'Incompatible argument type: Required type: %1. Actual type: %2; File: %3%4%5',
94  [$requiredArgument['type'], $actualArgument['type'], PHP_EOL, $classPath, PHP_EOL]
95  )
96  );
97  }
98  }
99 
104  if (count($callArguments) > count($parentArguments)) {
105  $extraParameters = array_slice($callArguments, count($parentArguments));
106  $names = [];
107  foreach ($extraParameters as $param) {
108  $names[] = '$' . $param['name'];
109  }
110 
111  $classPath = str_replace('\\', '/', $class->getFileName());
112  throw new \Magento\Framework\Exception\ValidatorException(
113  new Phrase(
114  'Extra parameters passed to parent construct: %1. File: %2',
115  [implode(', ', $names), $classPath]
116  )
117  );
118  }
119  return true;
120  }
121 }
$_option $_optionId $class
Definition: date.phtml:13
$index
Definition: list.phtml:44
__construct(\Magento\Framework\Code\Reader\ArgumentsReader $argumentsReader=null)
if($currentSelectedMethod==$_code) $className
Definition: form.phtml:31