Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
EntityAbstract.php
Go to the documentation of this file.
1 <?php
7 
8 use Zend\Code\Generator\ValueGenerator;
9 
10 abstract class EntityAbstract
11 {
15  const ENTITY_TYPE = 'abstract';
16 
20  private $_errors = [];
21 
27  private $_sourceClassName;
28 
34  private $_resultClassName;
35 
39  private $_ioObject;
40 
46  protected $_classGenerator;
47 
51  private $definedClasses;
52 
60  public function __construct(
61  $sourceClassName = null,
62  $resultClassName = null,
63  Io $ioObject = null,
64  \Magento\Framework\Code\Generator\CodeGeneratorInterface $classGenerator = null,
65  DefinedClasses $definedClasses = null
66  ) {
67  if ($ioObject) {
68  $this->_ioObject = $ioObject;
69  } else {
70  $this->_ioObject = new Io(new \Magento\Framework\Filesystem\Driver\File());
71  }
72  if ($classGenerator) {
73  $this->_classGenerator = $classGenerator;
74  } else {
75  $this->_classGenerator = new ClassGenerator();
76  }
77  if ($definedClasses) {
78  $this->definedClasses = $definedClasses;
79  } else {
80  $this->definedClasses = new DefinedClasses();
81  }
82 
83  $this->_sourceClassName = $this->_getFullyQualifiedClassName($sourceClassName);
84  if ($resultClassName) {
85  $this->_resultClassName = $this->_getFullyQualifiedClassName($resultClassName);
86  } elseif ($this->_sourceClassName) {
87  $this->_resultClassName = $this->_getDefaultResultClassName($this->_sourceClassName);
88  }
89  }
90 
96  public function generate()
97  {
98  try {
99  if ($this->_validateData()) {
100  $sourceCode = $this->_generateCode();
101  if ($sourceCode) {
102  $fileName = $this->_ioObject->generateResultFileName($this->_getResultClassName());
103  $this->_ioObject->writeResultFile($fileName, $sourceCode);
104  return $fileName;
105  } else {
106  $this->_addError('Can\'t generate source code.');
107  }
108  }
109  } catch (\Exception $e) {
110  $this->_addError($e->getMessage());
111  }
112  return false;
113  }
114 
120  public function getErrors()
121  {
122  return $this->_errors;
123  }
124 
130  public function getSourceClassName()
131  {
132  return $this->_sourceClassName;
133  }
134 
141  {
142  $parts = explode('\\', ltrim($this->getSourceClassName(), '\\'));
143  return end($parts);
144  }
145 
153  {
154  $className = ltrim($className, '\\');
155  return $className ? '\\' . $className : '';
156  }
157 
163  protected function _getResultClassName()
164  {
165  return $this->_resultClassName;
166  }
167 
174  protected function _getDefaultResultClassName($modelClassName)
175  {
176  return $modelClassName . ucfirst(static::ENTITY_TYPE);
177  }
178 
184  protected function _getClassProperties()
185  {
186  // protected $_objectManager = null;
187  $objectManager = [
188  'name' => '_objectManager',
189  'visibility' => 'protected',
190  'docblock' => [
191  'shortDescription' => 'Object Manager instance',
192  'tags' => [['name' => 'var', 'description' => '\\' . \Magento\Framework\ObjectManagerInterface::class]],
193  ],
194  ];
195 
196  return [$objectManager];
197  }
198 
204  abstract protected function _getDefaultConstructorDefinition();
205 
211  abstract protected function _getClassMethods();
212 
218  protected function _generateCode()
219  {
220  $this->_classGenerator->setName($this->_getResultClassName())
221  ->addProperties($this->_getClassProperties())
222  ->addMethods($this->_getClassMethods())
223  ->setClassDocBlock($this->_getClassDocBlock());
224 
225  return $this->_getGeneratedCode();
226  }
227 
234  protected function _addError($message)
235  {
236  $this->_errors[] = $message;
237  return $this;
238  }
239 
243  protected function _validateData()
244  {
245  $sourceClassName = $this->getSourceClassName();
246  $resultClassName = $this->_getResultClassName();
247  $resultDir = $this->_ioObject->getResultFileDirectory($resultClassName);
248 
249  if (!$this->definedClasses->isClassLoadable($sourceClassName)) {
250  $this->_addError('Source class ' . $sourceClassName . ' doesn\'t exist.');
251  return false;
252  } elseif (
256  !$this->_ioObject->makeResultFileDirectory($resultClassName)
257  && !$this->_ioObject->fileExists($resultDir)
258  ) {
259  $this->_addError('Can\'t create directory ' . $resultDir . '.');
260  return false;
261  }
262  return true;
263  }
264 
268  protected function _getClassDocBlock()
269  {
270  $description = ucfirst(static::ENTITY_TYPE) . ' class for @see ' . $this->getSourceClassName();
271  return ['shortDescription' => $description];
272  }
273 
277  protected function _getGeneratedCode()
278  {
279  $sourceCode = $this->_classGenerator->generate();
280  return $this->_fixCodeStyle($sourceCode);
281  }
282 
287  protected function _fixCodeStyle($sourceCode)
288  {
289  $sourceCode = str_replace(' array (', ' array(', $sourceCode);
290  $sourceCode = preg_replace("/{\n{2,}/m", "{\n", $sourceCode);
291  $sourceCode = preg_replace("/\n{2,}}/m", "\n}", $sourceCode);
292  return $sourceCode;
293  }
294 
300  protected function _getNullDefaultValue()
301  {
302  $value = new ValueGenerator(null, ValueGenerator::TYPE_NULL);
303 
304  return $value;
305  }
306 
312  private function extractParameterType(
313  \ReflectionParameter $parameter
314  ): ?string {
316  $typeName = null;
317  if ($parameter->hasType()) {
318  if ($parameter->isArray()) {
319  $typeName = 'array';
320  } elseif ($parameter->getClass()) {
321  $typeName = $this->_getFullyQualifiedClassName(
322  $parameter->getClass()->getName()
323  );
324  } elseif ($parameter->isCallable()) {
325  $typeName = 'callable';
326  } else {
327  $typeName = $parameter->getType()->getName();
328  }
329 
330  if ($parameter->allowsNull()) {
331  $typeName = '?' .$typeName;
332  }
333  }
334 
335  return $typeName;
336  }
337 
343  private function extractParameterDefaultValue(
344  \ReflectionParameter $parameter
345  ): ?ValueGenerator {
347  $value = null;
348  if ($parameter->isOptional() && $parameter->isDefaultValueAvailable()) {
349  $valueType = ValueGenerator::TYPE_AUTO;
350  $defaultValue = $parameter->getDefaultValue();
351  if ($defaultValue === null) {
352  $valueType = ValueGenerator::TYPE_NULL;
353  }
354  $value = new ValueGenerator($defaultValue, $valueType);
355  }
356 
357  return $value;
358  }
359 
366  protected function _getMethodParameterInfo(\ReflectionParameter $parameter)
367  {
368  $parameterInfo = [
369  'name' => $parameter->getName(),
370  'passedByReference' => $parameter->isPassedByReference(),
371  'variadic' => $parameter->isVariadic()
372  ];
373  if ($type = $this->extractParameterType($parameter)) {
374  $parameterInfo['type'] = $type;
375  }
376  if ($default = $this->extractParameterDefaultValue($parameter)) {
377  $parameterInfo['defaultValue'] = $default;
378  }
379 
380  return $parameterInfo;
381  }
382 
390  public function init($sourceClassName, $resultClassName)
391  {
392  $this->_sourceClassName = $sourceClassName;
393  $this->_resultClassName = $resultClassName;
394  }
395 }
elseif(isset( $params[ 'redirect_parent']))
Definition: iframe.phtml:17
__construct( $sourceClassName=null, $resultClassName=null, Io $ioObject=null, \Magento\Framework\Code\Generator\CodeGeneratorInterface $classGenerator=null, DefinedClasses $definedClasses=null)
$message
$type
Definition: item.phtml:13
$fileName
Definition: translate.phtml:15
$value
Definition: gender.phtml:16
$sourceCode
Definition: inventory.phtml:11
_getMethodParameterInfo(\ReflectionParameter $parameter)
init($sourceClassName, $resultClassName)
if($currentSelectedMethod==$_code) $className
Definition: form.phtml:31