12 use \Magento\Framework\Reflection\TypeProcessor;
24 private $typeProcessor;
35 $this->typeProcessor = $typeProcessor
48 protected function _findMissingClasses($file, $classReflection, $methodName,
$entityType)
51 if ($classReflection->hasMethod($methodName)) {
52 $constructor = $classReflection->getMethod($methodName);
53 $parameters = $constructor->getParameters();
55 foreach ($parameters as $parameter) {
56 preg_match(
'/\[\s<\w+?>\s([\w\\\\]+)/s', $parameter->__toString(), $matches);
58 $missingClassName = $matches[1];
59 if ($this->shouldGenerateClass($missingClassName,
$entityType, $file)) {
60 $missingClasses[] = $missingClassName;
65 return $missingClasses;
77 $sourceClassName = rtrim(substr($missingClassName, 0, -strlen(
$entityType)),
'\\');
79 if (
$entityType == ExtensionAttributesInterfaceGenerator::ENTITY_TYPE
80 ||
$entityType == ExtensionAttributesGenerator::ENTITY_TYPE
83 return $sourceClassName .
'Interface';
85 $extensionAttributesSuffix = ucfirst(ExtensionAttributesGenerator::ENTITY_TYPE);
86 if (substr($sourceClassName, -strlen($extensionAttributesSuffix)) == $extensionAttributesSuffix) {
88 $extensionAttributesClass = substr(
91 -strlen(ExtensionAttributesGenerator::ENTITY_TYPE)
93 $sourceClassName = $extensionAttributesClass .
'Interface';
96 return $sourceClassName;
108 $factorySuffix =
'\\' . ucfirst(FactoryGenerator::ENTITY_TYPE);
109 $absentFactories = $this->_findMissingClasses(
113 ucfirst(FactoryGenerator::ENTITY_TYPE)
115 foreach ($absentFactories as $key => $absentFactory) {
116 if (substr($absentFactory, -strlen($factorySuffix)) == $factorySuffix) {
117 $entityName = rtrim(substr($absentFactory, 0, -strlen($factorySuffix)),
'\\');
119 Log::CONFIGURATION_ERROR,
121 'Invalid Factory declaration for class ' . $entityName .
' in file ' . $file
123 unset($absentFactories[$key]);
126 return $absentFactories;
138 $missingExtensionInterfaces = [];
139 $methodName =
'getExtensionAttributes';
142 $returnType = $this->typeProcessor->getGetterReturnType(
143 (
new \
Zend\Code\Reflection\ClassReflection(
$reflectionClass->getName()))->getMethod($methodName)
145 $missingClassName = $returnType[
'type'];
146 if ($this->shouldGenerateClass($missingClassName,
$entityType, $file)) {
147 $missingExtensionInterfaces[] = $missingClassName;
150 $missingExtensionClasses = [];
151 $missingExtensionFactories = [];
152 foreach ($missingExtensionInterfaces as $missingExtensionInterface) {
153 $extension = rtrim(substr($missingExtensionInterface, 0, -strlen(
'Interface')),
'\\');
159 $missingExtensionFactories[] = $extensionFactory;
162 return array_merge($missingExtensionInterfaces, $missingExtensionClasses, $missingExtensionFactories);
174 foreach (
$files as $file) {
197 for ($tokenOffset = $tokenIterator + 1; $tokenOffset <
$count; ++$tokenOffset) {
198 if (
$tokens[$tokenOffset][0] === T_STRING) {
199 $namespace .=
"\\" .
$tokens[$tokenOffset][1];
217 for ($tokenOffset = $tokenIterator + 1; $tokenOffset <
$count; ++$tokenOffset) {
218 if (
$tokens[$tokenOffset] ===
'{') {
219 $classes[] = $namespace .
"\\" .
$tokens[$tokenIterator + 2][1];
238 for ($tokenIterator = 0; $tokenIterator <
$count; $tokenIterator++) {
239 if (
$tokens[$tokenIterator][0] == T_NAMESPACE) {
243 if ((
$tokens[$tokenIterator][0] == T_CLASS ||
$tokens[$tokenIterator][0] == T_INTERFACE)
244 &&
$tokens[$tokenIterator - 1][0] != T_DOUBLE_COLON
249 return array_unique($classes);
260 private function shouldGenerateClass($missingClassName,
$entityType, $file)
266 }
catch (\RuntimeException $e) {
269 if (!
class_exists($sourceClassName) && !interface_exists($sourceClassName)) {
271 Log::CONFIGURATION_ERROR,
273 "Invalid {$entityType} for nonexistent class {$sourceClassName} in file {$file}"
elseif(isset( $params[ 'redirect_parent']))
_fetchClasses($namespace, $tokenIterator, $count, $tokens)
getSourceClassName($missingClassName, $entityType)
_fetchNamespace($tokenIterator, $count, $tokens)
__construct(Log $log, TypeProcessor $typeProcessor=null)
_fetchFactories($reflectionClass, $file)
_getDeclaredClasses($file)
foreach($appDirs as $dir) $files
_fetchMissingExtensionAttributesClasses($reflectionClass, $file)
collectEntities(array $files)