Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
Generator.php
Go to the documentation of this file.
1 <?php
6 namespace Magento\Framework\Code;
7 
10 use Magento\Framework\Code\Generator\Io;
14 use Psr\Log\LoggerInterface;
15 
16 class Generator
17 {
18  const GENERATION_SUCCESS = 'success';
19 
20  const GENERATION_ERROR = 'error';
21 
22  const GENERATION_SKIP = 'skip';
23 
27  protected $_ioObject;
28 
33 
37  protected $definedClasses;
38 
42  protected $objectManager;
43 
49  private $logger;
50 
57  public function __construct(
58  Io $ioObject = null,
59  array $generatedEntities = [],
61  LoggerInterface $logger = null
62  ) {
63  $this->_ioObject = $ioObject ?: new Io(new File());
64  $this->definedClasses = $definedClasses ?: new DefinedClasses();
65  $this->_generatedEntities = $generatedEntities;
66  $this->logger = $logger;
67  }
68 
74  public function getGeneratedEntities()
75  {
77  }
78 
85  public function setGeneratedEntities($generatedEntities)
86  {
87  $this->_generatedEntities = $generatedEntities;
88  return $this;
89  }
90 
99  public function generateClass($className)
100  {
101  $resultEntityType = null;
102  $sourceClassName = null;
103  foreach ($this->_generatedEntities as $entityType => $generatorClass) {
104  $entitySuffix = ucfirst($entityType);
105  // If $className string ends with $entitySuffix substring
106  if (strrpos($className, $entitySuffix) === strlen($className) - strlen($entitySuffix)) {
107  $resultEntityType = $entityType;
108  $sourceClassName = rtrim(
109  substr($className, 0, -1 * strlen($entitySuffix)),
110  '\\'
111  );
112  break;
113  }
114  }
115 
116  if ($skipReason = $this->shouldSkipGeneration($resultEntityType, $sourceClassName, $className)) {
117  return $skipReason;
118  }
119 
120  $generatorClass = $this->_generatedEntities[$resultEntityType];
122  $generator = $this->createGeneratorInstance($generatorClass, $sourceClassName, $className);
123  if ($generator !== null) {
125  if (!($file = $generator->generate())) {
127  $errors = $generator->getErrors();
128  $errors[] = 'Class ' . $className . ' generation error: The requested class did not generate properly, '
129  . 'because the \'generated\' directory permission is read-only. '
130  . 'If --- after running the \'bin/magento setup:di:compile\' CLI command when the \'generated\' '
131  . 'directory permission is set to write --- the requested class did not generate properly, then '
132  . 'you must add the generated class object to the signature of the related construct method, only.';
133  $message = implode(PHP_EOL, $errors);
134  $this->getLogger()->critical($message);
135  throw new \RuntimeException($message);
136  }
137  if (!$this->definedClasses->isClassLoadableFromMemory($className)) {
138  $this->_ioObject->includeFile($file);
139  }
141  }
142  }
143 
149  private function getLogger()
150  {
151  if (!$this->logger) {
152  $this->logger = $this->getObjectManager()->get(LoggerInterface::class);
153  }
154  return $this->logger;
155  }
156 
165  protected function createGeneratorInstance($generatorClass, $entityName, $className)
166  {
167  return $this->getObjectManager()->create(
168  $generatorClass,
169  ['sourceClassName' => $entityName, 'resultClassName' => $className, 'ioObject' => $this->_ioObject]
170  );
171  }
172 
180  {
181  $this->objectManager = $objectManager;
182  return $this;
183  }
184 
190  public function getObjectManager()
191  {
192  if (!($this->objectManager instanceof ObjectManagerInterface)) {
193  throw new \LogicException(
194  "Object manager was expected to be set using setObjectManger() "
195  . "before getObjectManager() invocation."
196  );
197  }
198  return $this->objectManager;
199  }
200 
210  {
211  $sourceClassName = $generator->getSourceClassName();
212  if (!$this->definedClasses->isClassLoadable($sourceClassName)) {
213  if ($this->generateClass($sourceClassName) !== self::GENERATION_SUCCESS) {
214  $phrase = new Phrase(
215  'Source class "%1" for "%2" generation does not exist.',
216  [$sourceClassName, $className]
217  );
218  throw new \RuntimeException($phrase->__toString());
219  }
220  }
221  }
222 
231  protected function shouldSkipGeneration($resultEntityType, $sourceClassName, $resultClass)
232  {
233  if (!$resultEntityType || !$sourceClassName) {
234  return self::GENERATION_ERROR;
235  } elseif ($this->definedClasses->isClassLoadableFromDisk($resultClass)) {
236  $generatedFileName = $this->_ioObject->generateResultFileName($resultClass);
241  if ($this->_ioObject->fileExists($generatedFileName)
242  && !$this->definedClasses->isClassLoadableFromMemory($resultClass)
243  ) {
244  $this->_ioObject->includeFile($generatedFileName);
245  }
246  return self::GENERATION_SKIP;
247  } elseif (!isset($this->_generatedEntities[$resultEntityType])) {
248  throw new \InvalidArgumentException('Unknown generation entity.');
249  }
250  return false;
251  }
252 }
createGeneratorInstance($generatorClass, $entityName, $className)
Definition: Generator.php:165
elseif(isset( $params[ 'redirect_parent']))
Definition: iframe.phtml:17
$message
__construct(Io $ioObject=null, array $generatedEntities=[], DefinedClasses $definedClasses=null, LoggerInterface $logger=null)
Definition: Generator.php:57
setObjectManager(ObjectManagerInterface $objectManager)
Definition: Generator.php:179
shouldSkipGeneration($resultEntityType, $sourceClassName, $resultClass)
Definition: Generator.php:231
setGeneratedEntities($generatedEntities)
Definition: Generator.php:85
$errors
Definition: overview.phtml:9
tryToLoadSourceClass($className, $generator)
Definition: Generator.php:209
if($currentSelectedMethod==$_code) $className
Definition: form.phtml:31