21 $newConfiguration = $this->onBuildConfigurationOfActions($controller);
24 $lengthSuffix = mb_strlen(Controllerable::METHOD_ACTION_SUFFIX);
25 $reflectionClass =
new ReflectionClass($controller);
29 foreach ($reflectionClass->getMethods(ReflectionMethod::IS_PUBLIC) as
$method)
31 $probablySuffix = mb_substr(
$method->getName(), -$lengthSuffix);
32 if ($probablySuffix !== Controllerable::METHOD_ACTION_SUFFIX)
37 $actionName = mb_substr(
$method->name, 0, -$lengthSuffix);
38 if (!$attributeReader->hasMethodFilterAttributes(
$method))
43 if ($this->isExists($configuration, $actionName))
48 $configuration[$actionName] = $attributeReader->buildConfig(
$method);
51 $configuration = array_merge($newConfiguration, $configuration);
52 $configuration = $this->wrapClosure($configuration);
54 $this->checkConfigurations($configuration);
56 return $configuration;
59 private function isExists(
array $configuration, $actionName): bool
61 $listOfActions = array_change_key_case($configuration);
62 $actionName = mb_strtolower($actionName);
64 return isset($listOfActions[$actionName]);
67 private function onBuildConfigurationOfActions(
Controller $controller):
array
71 self::EVENT_ON_BUILD_ACTIONS,
73 'controller' => $controller,
78 $newConfiguration = [];
79 foreach (
$event->getResults() as $eventResult)
81 if ($eventResult->getType() != EventResult::SUCCESS)
86 $parameters = $eventResult->getParameters();
87 if (isset($parameters[
'extraActions']) && is_array($parameters[
'extraActions']))
90 $newConfiguration = array_merge($newConfiguration, $parameters[
'extraActions']);
94 return $newConfiguration;
101 if (!(
$filter instanceof Closure))
112 private function wrapClosure(
array $configurations):
array
114 foreach ($configurations as $actionName => $configuration)
116 if (!empty($configuration[FilterType::Prefilter->value]))
118 $configurations[$actionName][FilterType::Prefilter->value] =
122 if (!empty($configuration[FilterType::EnablePrefilter->value]))
124 $configurations[$actionName][FilterType::EnablePrefilter->value] =
128 if (!empty($configuration[FilterType::Postfilter->value]))
130 $configurations[$actionName][FilterType::Postfilter->value] =
134 if (!empty($configuration[FilterType::EnablePostfilter->value]))
136 $configurations[$actionName][FilterType::EnablePostfilter->value]
141 return $configurations;
144 private function checkConfigurations(
array $configurations): void
146 foreach ($configurations as $actionName => $configuration)
148 if (!is_string($actionName))
150 throw new ActionConfigurationException(
'Invalid configuration of actions. Action has to be string');
153 if (!is_array($configuration))
155 throw new ActionConfigurationException(
'Invalid configuration of actions. Configuration has to be array');
158 if (!empty($configuration[FilterType::Prefilter->value]))
160 $this->checkFilters($configuration[FilterType::Prefilter->value]);
163 if (!empty($configuration[FilterType::Postfilter->value]))
165 $this->checkFilters($configuration[FilterType::Postfilter->value]);
170 private function checkFilters(
array $filters): void
174 if (!(
$filter instanceof ActionFilter\Base))
176 throw new ActionConfigurationException(
'Filter has to be subclass of ' . ActionFilter\Base::className());
const EVENT_ON_BUILD_ACTIONS
getConfigurationByController(Controller $controller)
wrapFiltersClosure(array $filters)