Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
Public Member Functions
PublicCodeTest Class Reference
Inheritance diagram for PublicCodeTest:

Public Member Functions

 layoutFilesDataProvider ()
 
 testAllPHPClassesReferencedFromPublicClassesArePublic ($class)
 
 publicPHPTypesDataProvider ()
 

Detailed Description

Tests @api annotated code integrity

Definition at line 13 of file PublicCodeTest.php.

Member Function Documentation

◆ layoutFilesDataProvider()

layoutFilesDataProvider ( )

Find all layout update files in magento modules and themes.

Returns
array
Exceptions

Definition at line 92 of file PublicCodeTest.php.

93  {
94  return Files::init()->getLayoutFiles([], true);
95  }

◆ publicPHPTypesDataProvider()

publicPHPTypesDataProvider ( )

Retrieve list of all interfaces and classes in Magento codebase that are marked with @api annotation.

Returns
array
Exceptions

Definition at line 147 of file PublicCodeTest.php.

148  {
150  $result = [];
151  foreach ($files as $file) {
152  $fileContents = \file_get_contents($file);
153  if (strpos($fileContents, '@api') !== false) {
154  foreach ($this->getDeclaredClassesAndInterfaces($file) as $class) {
155  if (!in_array($class->getName(), $this->getWhitelist())
156  && (class_exists($class->getName()) || interface_exists($class->getName()))
157  ) {
158  $result[$class->getName()] = [$class->getName()];
159  }
160  }
161  }
162  }
163  return $result;
164  }
$_option $_optionId $class
Definition: date.phtml:13
foreach($appDirs as $dir) $files

◆ testAllPHPClassesReferencedFromPublicClassesArePublic()

testAllPHPClassesReferencedFromPublicClassesArePublic (   $class)

We want to avoid situation when a type is marked public (@api annotated) but one of its methods returns or accepts the value of non-public type. This test walks through all public PHP types and makes sure that all their method arguments and return values are public types.

Parameters
string$class
Exceptions

Definition at line 107 of file PublicCodeTest.php.

108  {
109  $nonPublishedClasses = [];
110  $reflection = new \ReflectionClass($class);
111  $filter = \ReflectionMethod::IS_PUBLIC;
112  if ($reflection->isAbstract()) {
113  $filter = $filter | \ReflectionMethod::IS_PROTECTED;
114  }
115  $methods = $reflection->getMethods($filter);
116  foreach ($methods as $method) {
117  if ($method->isConstructor()) {
118  continue;
119  }
120  $nonPublishedClasses = $this->checkParameters($class, $method, $nonPublishedClasses);
121  /* Taking into account docblock return types since this code
122  is written on early php 7 when return types are not actively used */
123  $returnTypes = [];
124  if ($method->hasReturnType()) {
125  if (!$method->getReturnType()->isBuiltin()) {
126  $returnTypes = [trim($method->getReturnType()->__toString(), '?[]')];
127  }
128  } else {
129  $returnTypes = $this->getReturnTypesFromDocComment($method->getDocComment());
130  }
131  $nonPublishedClasses = $this->checkReturnValues($class, $returnTypes, $nonPublishedClasses);
132  }
133 
134  if (count($nonPublishedClasses)) {
135  $this->fail(
136  "Public type '" . $class . "' references following non-public types:\n"
137  . implode("\n", array_unique($nonPublishedClasses))
138  );
139  }
140  }
$methods
Definition: billing.phtml:71
$_option $_optionId $class
Definition: date.phtml:13
$method
Definition: info.phtml:13

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