Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
Public Member Functions | Protected Member Functions | Protected Attributes
PhpScanner Class Reference
Inheritance diagram for PhpScanner:
ScannerInterface

Public Member Functions

 __construct (Log $log, TypeProcessor $typeProcessor=null)
 
 collectEntities (array $files)
 

Protected Member Functions

 getSourceClassName ($missingClassName, $entityType)
 
 _fetchFactories ($reflectionClass, $file)
 
 _fetchMissingExtensionAttributesClasses ($reflectionClass, $file)
 
 _fetchNamespace ($tokenIterator, $count, $tokens)
 
 _fetchClasses ($namespace, $tokenIterator, $count, $tokens)
 
 _getDeclaredClasses ($file)
 

Protected Attributes

 $_log
 

Detailed Description

Definition at line 14 of file PhpScanner.php.

Constructor & Destructor Documentation

◆ __construct()

__construct ( Log  $log,
TypeProcessor  $typeProcessor = null 
)

Initialize dependencies.

Parameters
Log$log
TypeProcessor | null$typeProcessor

Definition at line 32 of file PhpScanner.php.

33  {
34  $this->_log = $log;
35  $this->typeProcessor = $typeProcessor
36  ?: \Magento\Framework\App\ObjectManager::getInstance()->get(TypeProcessor::class);
37  }

Member Function Documentation

◆ _fetchClasses()

_fetchClasses (   $namespace,
  $tokenIterator,
  $count,
  $tokens 
)
protected
Parameters
$namespacestring
$tokenIteratorint
$countint
$tokensarray
Returns
array

Definition at line 214 of file PhpScanner.php.

215  {
216  $classes = [];
217  for ($tokenOffset = $tokenIterator + 1; $tokenOffset < $count; ++$tokenOffset) {
218  if ($tokens[$tokenOffset] === '{') {
219  $classes[] = $namespace . "\\" . $tokens[$tokenIterator + 2][1];
220  }
221  }
222  return $classes;
223  }
$count
Definition: recent.phtml:13
$tokens
Definition: cards_list.phtml:9

◆ _fetchFactories()

_fetchFactories (   $reflectionClass,
  $file 
)
protected

Fetch factories from class constructor

Parameters
\ReflectionClass$reflectionClass
string$file
Returns
string[]

Definition at line 106 of file PhpScanner.php.

107  {
108  $factorySuffix = '\\' . ucfirst(FactoryGenerator::ENTITY_TYPE);
109  $absentFactories = $this->_findMissingClasses(
110  $file,
112  '__construct',
113  ucfirst(FactoryGenerator::ENTITY_TYPE)
114  );
115  foreach ($absentFactories as $key => $absentFactory) {
116  if (substr($absentFactory, -strlen($factorySuffix)) == $factorySuffix) {
117  $entityName = rtrim(substr($absentFactory, 0, -strlen($factorySuffix)), '\\');
118  $this->_log->add(
119  Log::CONFIGURATION_ERROR,
120  $absentFactory,
121  'Invalid Factory declaration for class ' . $entityName . ' in file ' . $file
122  );
123  unset($absentFactories[$key]);
124  }
125  }
126  return $absentFactories;
127  }
$reflectionClass
Definition: categories.php:25

◆ _fetchMissingExtensionAttributesClasses()

_fetchMissingExtensionAttributesClasses (   $reflectionClass,
  $file 
)
protected

Find missing extension attributes related classes, interfaces and factories.

Parameters
\ReflectionClass$reflectionClass
string$file
Returns
string[]

Definition at line 136 of file PhpScanner.php.

137  {
138  $missingExtensionInterfaces = [];
139  $methodName = 'getExtensionAttributes';
140  $entityType = ucfirst(\Magento\Framework\Api\Code\Generator\ExtensionAttributesInterfaceGenerator::ENTITY_TYPE);
141  if ($reflectionClass->hasMethod($methodName) && $reflectionClass->isInterface()) {
142  $returnType = $this->typeProcessor->getGetterReturnType(
143  (new \Zend\Code\Reflection\ClassReflection($reflectionClass->getName()))->getMethod($methodName)
144  );
145  $missingClassName = $returnType['type'];
146  if ($this->shouldGenerateClass($missingClassName, $entityType, $file)) {
147  $missingExtensionInterfaces[] = $missingClassName;
148  }
149  }
150  $missingExtensionClasses = [];
151  $missingExtensionFactories = [];
152  foreach ($missingExtensionInterfaces as $missingExtensionInterface) {
153  $extension = rtrim(substr($missingExtensionInterface, 0, -strlen('Interface')), '\\');
154  if (!class_exists($extension)) {
155  $missingExtensionClasses[] = $extension;
156  }
157  $extensionFactory = $extension . 'Factory';
158  if (!class_exists($extensionFactory)) {
159  $missingExtensionFactories[] = $extensionFactory;
160  }
161  }
162  return array_merge($missingExtensionInterfaces, $missingExtensionClasses, $missingExtensionFactories);
163  }
$reflectionClass
Definition: categories.php:25

◆ _fetchNamespace()

_fetchNamespace (   $tokenIterator,
  $count,
  $tokens 
)
protected
Parameters
$tokenIteratorint
$countint
$tokensarray
Returns
string

Definition at line 194 of file PhpScanner.php.

195  {
196  $namespace = '';
197  for ($tokenOffset = $tokenIterator + 1; $tokenOffset < $count; ++$tokenOffset) {
198  if ($tokens[$tokenOffset][0] === T_STRING) {
199  $namespace .= "\\" . $tokens[$tokenOffset][1];
200  } elseif ($tokens[$tokenOffset] === '{' || $tokens[$tokenOffset] === ';') {
201  break;
202  }
203  }
204  return $namespace;
205  }
elseif(isset( $params[ 'redirect_parent']))
Definition: iframe.phtml:17
$count
Definition: recent.phtml:13
$tokens
Definition: cards_list.phtml:9

◆ _getDeclaredClasses()

_getDeclaredClasses (   $file)
protected

Get classes and interfaces declared in the file

Parameters
string$file
Returns
array

Definition at line 231 of file PhpScanner.php.

232  {
233  $classes = [];
234  $namespace = '';
235  $tokens = token_get_all(file_get_contents($file));
236  $count = count($tokens);
237 
238  for ($tokenIterator = 0; $tokenIterator < $count; $tokenIterator++) {
239  if ($tokens[$tokenIterator][0] == T_NAMESPACE) {
240  $namespace .= $this->_fetchNamespace($tokenIterator, $count, $tokens);
241  }
242 
243  if (($tokens[$tokenIterator][0] == T_CLASS || $tokens[$tokenIterator][0] == T_INTERFACE)
244  && $tokens[$tokenIterator - 1][0] != T_DOUBLE_COLON
245  ) {
246  $classes = array_merge($classes, $this->_fetchClasses($namespace, $tokenIterator, $count, $tokens));
247  }
248  }
249  return array_unique($classes);
250  }
_fetchClasses($namespace, $tokenIterator, $count, $tokens)
Definition: PhpScanner.php:214
$count
Definition: recent.phtml:13
_fetchNamespace($tokenIterator, $count, $tokens)
Definition: PhpScanner.php:194
$tokens
Definition: cards_list.phtml:9

◆ collectEntities()

collectEntities ( array  $files)

Get array of class names

Parameters
array$files
Returns
array

Implements ScannerInterface.

Definition at line 171 of file PhpScanner.php.

172  {
173  $output = [];
174  foreach ($files as $file) {
175  $classes = $this->_getDeclaredClasses($file);
176  foreach ($classes as $className) {
177  $reflectionClass = new \ReflectionClass($className);
178  $output = array_merge(
179  $output,
180  $this->_fetchFactories($reflectionClass, $file),
182  );
183  }
184  }
185  return array_unique($output);
186  }
$reflectionClass
Definition: categories.php:25
foreach($appDirs as $dir) $files
_fetchMissingExtensionAttributesClasses($reflectionClass, $file)
Definition: PhpScanner.php:136
if($currentSelectedMethod==$_code) $className
Definition: form.phtml:31

◆ getSourceClassName()

getSourceClassName (   $missingClassName,
  $entityType 
)
protected

Identify source class name for the provided class.

Parameters
string$missingClassName
string$entityType
Returns
string

Process special cases for extension class and extension interface

Process special case for extension factories

Definition at line 75 of file PhpScanner.php.

76  {
77  $sourceClassName = rtrim(substr($missingClassName, 0, -strlen($entityType)), '\\');
78  $entityType = lcfirst($entityType);
79  if ($entityType == ExtensionAttributesInterfaceGenerator::ENTITY_TYPE
80  || $entityType == ExtensionAttributesGenerator::ENTITY_TYPE
81  ) {
83  return $sourceClassName . 'Interface';
84  } elseif ($entityType == FactoryGenerator::ENTITY_TYPE) {
85  $extensionAttributesSuffix = ucfirst(ExtensionAttributesGenerator::ENTITY_TYPE);
86  if (substr($sourceClassName, -strlen($extensionAttributesSuffix)) == $extensionAttributesSuffix) {
88  $extensionAttributesClass = substr(
89  $sourceClassName,
90  0,
91  -strlen(ExtensionAttributesGenerator::ENTITY_TYPE)
92  );
93  $sourceClassName = $extensionAttributesClass . 'Interface';
94  }
95  }
96  return $sourceClassName;
97  }
elseif(isset( $params[ 'redirect_parent']))
Definition: iframe.phtml:17

Field Documentation

◆ $_log

$_log
protected

Definition at line 19 of file PhpScanner.php.


The documentation for this class was generated from the following file: