[Beeframework-svn] SF.net SVN: beeframework:[174] trunk
Brought to you by:
b_hartmann,
m_plomer
From: <m_p...@us...> - 2014-07-08 16:41:35
|
Revision: 174 http://sourceforge.net/p/beeframework/code/174 Author: m_plomer Date: 2014-07-08 16:41:30 +0000 (Tue, 08 Jul 2014) Log Message: ----------- - MVC: parametrized URL patterns done Modified Paths: -------------- trunk/examples/classes/Test/Mvc/ParamTestDelegate.php trunk/examples/index.php trunk/framework/Bee/MVC/Controller/MultiActionController.php trunk/framework/Bee/MVC/Controller/Multiaction/AbstractAnnotationBasedResolver.php trunk/framework/Bee/MVC/Controller/Multiaction/HandlerMethodInvocator/AnnotationBasedInvocator.php trunk/framework/Bee/MVC/Controller/Multiaction/HandlerMethodInvocator/IInvocationResolver.php trunk/framework/Bee/MVC/Controller/Multiaction/HandlerMethodInvocator/RegexMappingInvocationResolver.php trunk/framework/Bee/MVC/Controller/Multiaction/RequestHandler.php Added Paths: ----------- trunk/framework/Bee/MVC/Controller/Multiaction/HandlerMethodInvocator/HandlerMethodMetadata.php trunk/framework/Bee/MVC/Controller/Multiaction/HandlerMethodInvocator/MethodInvocation.php trunk/framework/Bee/MVC/Controller/Multiaction/NoHandlerMethodFoundException.php trunk/framework/Bee/MVC/Controller/Multiaction/RequestHandlerMapping.php Modified: trunk/examples/classes/Test/Mvc/ParamTestDelegate.php =================================================================== --- trunk/examples/classes/Test/Mvc/ParamTestDelegate.php 2014-07-08 09:52:40 UTC (rev 173) +++ trunk/examples/classes/Test/Mvc/ParamTestDelegate.php 2014-07-08 16:41:30 UTC (rev 174) @@ -2,7 +2,8 @@ namespace Test\Mvc; use Bee_MVC_IHttpRequest; -use Test\MiscClass; +use Bee_MVC_ModelAndView; +use Test\MiscClass as MC; /** @@ -13,20 +14,30 @@ /** * - * @Bee_MVC_Controller_Multiaction_RequestHandler(httpMethod = "GET", pathPattern = "/**\/testParam/{paramA}/{paramB}") + * @param int $paramA + * @param Bee_MVC_IHttpRequest $request + * @param MC $paramB + * @param boolean $boolParam + * @param MC $testParam + * @param boolean $getParam + * @return bool + * @Bee_MVC_Controller_Multiaction_RequestHandler(httpMethod = "GET", pathPattern = "/**\/testParam/{0}/{2}/{boolParam}") */ - public function handleTestParams($paramA, MiscClass $paramB, Bee_MVC_IHttpRequest $request) { + public function handleTestParams($paramA, Bee_MVC_IHttpRequest $request, MC $paramB, $boolParam = false, $testParam = null, $getParam = false) { var_dump($paramA); var_dump($paramB); var_dump($request); - return true; + var_dump($boolParam); + var_dump($testParam); + var_dump($getParam); + return new Bee_MVC_ModelAndView(array('paramA' => $paramA, 'paramB' => $paramB, 'boolParam' => $boolParam), 'testview'); } /** * * @Bee_MVC_Controller_Multiaction_RequestHandler(httpMethod = "GET", pathPattern = "/**\/testParam/{paramA}/") */ - public function handleTestParams2(MiscClass $paramB, Bee_MVC_IHttpRequest $request) { + public function handleTestParams2(MC $paramB, Bee_MVC_IHttpRequest $request) { var_dump($paramB); var_dump($request); return true; Modified: trunk/examples/index.php =================================================================== --- trunk/examples/index.php 2014-07-08 09:52:40 UTC (rev 173) +++ trunk/examples/index.php 2014-07-08 16:41:30 UTC (rev 174) @@ -10,4 +10,5 @@ Bee_Cache_Manager::init(); +//Bee_Framework::setProductionMode(true); Bee_Framework::dispatchRequestUsingXmlContext(__DIR__.'/conf/context-mvc.xml'); \ No newline at end of file Modified: trunk/framework/Bee/MVC/Controller/MultiActionController.php =================================================================== --- trunk/framework/Bee/MVC/Controller/MultiActionController.php 2014-07-08 09:52:40 UTC (rev 173) +++ trunk/framework/Bee/MVC/Controller/MultiActionController.php 2014-07-08 16:41:30 UTC (rev 174) @@ -17,6 +17,7 @@ */ use Bee\MVC\Controller\Multiaction\IHandlerMethodInvocator; use Bee\MVC\Controller\Multiaction\IMethodNameResolver; +use Bee\MVC\Controller\Multiaction\NoHandlerMethodFoundException; use Bee_MVC_IHttpRequest; use Bee_Utils_Assert; use Bee_Utils_Reflection; @@ -95,7 +96,7 @@ // @todo: this might pose a security risk. introduce a set of allowed method names $method = new ReflectionMethod($this->delegate, $methodName); if (!$this->isHandlerMethod($method)) { - throw new Exception('No request handling method with name ' . $methodName . ' in class [' . Bee_Utils_Types::getType($this->delegate) . ']'); + throw new NoHandlerMethodFoundException('No request handling method with name ' . $methodName . ' in class [' . Bee_Utils_Types::getType($this->delegate) . ']'); } } return $method->invokeArgs($this->delegate, array($request)); Modified: trunk/framework/Bee/MVC/Controller/Multiaction/AbstractAnnotationBasedResolver.php =================================================================== --- trunk/framework/Bee/MVC/Controller/Multiaction/AbstractAnnotationBasedResolver.php 2014-07-08 09:52:40 UTC (rev 173) +++ trunk/framework/Bee/MVC/Controller/Multiaction/AbstractAnnotationBasedResolver.php 2014-07-08 16:41:30 UTC (rev 174) @@ -37,7 +37,7 @@ const AJAX_TYPE_FALSE_KEY = '_FALSE'; const AJAX_TYPE_ANY_KEY = '_ANY'; - const CACHE_KEY_PREFIX = 'BeeMethodNameResolverAnnotationCache_'; + const CACHE_KEY_PREFIX = 'BeeMethodResolverAnnotationCache_'; /** * @var Modified: trunk/framework/Bee/MVC/Controller/Multiaction/HandlerMethodInvocator/AnnotationBasedInvocator.php =================================================================== --- trunk/framework/Bee/MVC/Controller/Multiaction/HandlerMethodInvocator/AnnotationBasedInvocator.php 2014-07-08 09:52:40 UTC (rev 173) +++ trunk/framework/Bee/MVC/Controller/Multiaction/HandlerMethodInvocator/AnnotationBasedInvocator.php 2014-07-08 16:41:30 UTC (rev 174) @@ -1,5 +1,6 @@ <?php namespace Bee\MVC\Controller\Multiaction\HandlerMethodInvocator; + /* * Copyright 2008-2014 the original author or authors. * @@ -18,9 +19,12 @@ use Bee\Beans\PropertyEditor\PropertyEditorRegistry; use Bee\MVC\Controller\Multiaction\AbstractAnnotationBasedResolver; use Bee\MVC\Controller\Multiaction\IHandlerMethodInvocator; +use Bee_Cache_Manager; use Bee_Context_Config_IContextAware; +use Bee_Framework; use Bee_IContext; use Bee_MVC_IHttpRequest; +use Exception; /** * Class AnnotationBasedInvocator @@ -28,35 +32,82 @@ */ class AnnotationBasedInvocator extends AbstractAnnotationBasedResolver implements IHandlerMethodInvocator, Bee_Context_Config_IContextAware { + const DEFAULT_METHOD_CACHE_KEY_PREFIX = 'BeeDefaultHandlerMethodCache_'; + /** * @var PropertyEditorRegistry */ private $propertyEditorRegistry; /** + * @var MethodInvocation + */ + private $defaultMethodInvocation; + + /** + * @return array + */ + protected function getDefaultMethodInvocation() { + if (!is_array($this->defaultMethodInvocation)) { + // todo: fetch default invocation from cache or rebuild + + $ctrl = $this->getController(); + $delegateClassName = get_class($ctrl->getDelegate()); + + $cacheKey = self::DEFAULT_METHOD_CACHE_KEY_PREFIX . $delegateClassName.'::'.$ctrl->getDefaultMethodName(); + if (Bee_Framework::getProductionMode()) { + try { + $this->defaultMethodInvocation = Bee_Cache_Manager::retrieve($cacheKey); + } catch (Exception $e) { + $this->getLog()->debug('No cached default method invocation for "' . $delegateClassName . '::'. $ctrl->getDefaultMethodName() .'" found, annotation parsing required'); + } + } + + if (!$this->defaultMethodInvocation) { + $methodMeta = RegexMappingInvocationResolver::getCachedMethodMetadata(new \ReflectionMethod($delegateClassName, $ctrl->getDefaultMethodName())); + $this->defaultMethodInvocation = new MethodInvocation($methodMeta); + } + + if (Bee_Framework::getProductionMode()) { + Bee_Cache_Manager::store($cacheKey, $this->defaultMethodInvocation); + } + } + return $this->defaultMethodInvocation; + } + + /** * @param Bee_MVC_IHttpRequest $request * @return \Bee_MVC_ModelAndView */ public function invokeHandlerMethod(Bee_MVC_IHttpRequest $request) { + /** @var MethodInvocation $resolvedMethod */ $resolvedMethod = $this->resolveMethodForRequest($request); - /** @var \ReflectionMethod $method */ - $method = $resolvedMethod['method']; + if (is_null($resolvedMethod)) { + $resolvedMethod = $this->getDefaultMethodInvocation(); + } + $methodMeta = $resolvedMethod->getMethodMeta(); + $method = $methodMeta->getMethod(); $args = array(); - - foreach($method->getParameters() as $parameter) { + foreach ($method->getParameters() as $parameter) { $pos = $parameter->getPosition(); - $type = $resolvedMethod['typeMap'][$pos]; - if($type == 'Bee_MVC_IHttpRequest') { + $type = $methodMeta->getTypeMapping($pos); + if ($type == 'Bee_MVC_IHttpRequest') { $args[$pos] = $request; } else { $propEditor = $this->propertyEditorRegistry->getEditor($type); - $urlPos = $resolvedMethod['positionMap'][$pos]; - $args[$pos] = $propEditor->fromString($resolvedMethod['paramValues'][$urlPos]); + $posMap = $resolvedMethod->getUrlParameterPositions(); + $value = array_key_exists($pos, $posMap) ? $resolvedMethod->getParamValue($posMap[$pos]) : + (array_key_exists($parameter->getName(), $_REQUEST) ? $_REQUEST[$parameter->getName()] : null); + if (!is_null($value) || !$parameter->isOptional()) { + $args[$pos] = $propEditor->fromString($value); +// } else { +// $args[$pos] = null; + } } } - $method->invokeArgs($this->getController()->getDelegate(), $args); + return $method->invokeArgs($this->getController()->getDelegate(), $args); } /** Added: trunk/framework/Bee/MVC/Controller/Multiaction/HandlerMethodInvocator/HandlerMethodMetadata.php =================================================================== --- trunk/framework/Bee/MVC/Controller/Multiaction/HandlerMethodInvocator/HandlerMethodMetadata.php (rev 0) +++ trunk/framework/Bee/MVC/Controller/Multiaction/HandlerMethodInvocator/HandlerMethodMetadata.php 2014-07-08 16:41:30 UTC (rev 174) @@ -0,0 +1,134 @@ +<?php + +namespace Bee\MVC\Controller\Multiaction\HandlerMethodInvocator; + +use Bee\Utils\ITypeDefinitions; +use ReflectionClass; +use ReflectionMethod; + + +/** + * Class HandlerMethodMetadata + * @package Bee\MVC\Controller\Multiaction\HandlerMethodInvocator + */ +class HandlerMethodMetadata { + + const CLASS_USES_MATCH = '#^\s*use\s+((?:\w+\\\\)*(\w+))(?: as (\w+))?;\s*$#m'; + const DOCBLOCK_PARAM_TYPE_HINT_MATCH = '#\*\s+@param\s+([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\s\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)#'; + + /** + * @var array + */ + private static $importMap = array(); + + /** + * @var ReflectionMethod + */ + private $method; + + /** + * @var + */ + private $typeMap; + + /** + * @var array + */ + private $requestParamPos; + + /** + * @var array + */ + private $parameterPositions; + + function __construct(ReflectionMethod $method) { + $this->method = $method; + + $typeNameMap = self::getDocBlockTypeHints($method); + $this->typeMap = array(); + $this->requestParamPos = array(); + $this->parameterPositions = array(); + + foreach ($method->getParameters() as $param) { + $typeName = array_key_exists($param->getName(), $typeNameMap) ? + $typeNameMap[$param->getName()] : + (!is_null($param->getClass()) ? $param->getClass()->getName() : ITypeDefinitions::STRING); + if ($typeName == 'Bee_MVC_IHttpRequest') { + $this->requestParamPos[$param->getPosition()] = true; + } + $this->typeMap[$param->getName()] = $typeName; + $this->typeMap[$param->getPosition()] = $typeName; + $this->parameterPositions[$param->getName()] = $param->getPosition(); + } + } + + /** + * @return ReflectionMethod + */ + public function getMethod() { + return $this->method; + } + + /** + * @return array + */ + public function getRequestParamPos() { + return $this->requestParamPos; + } + + /** + * @return mixed + */ + public function getTypeMap() { + return $this->typeMap; + } + + /** + * @param $pos + * @return mixed + */ + public function getTypeMapping($pos) { + return $this->typeMap[$pos]; + } + + /** + * @return array + */ + public function getParameterPositions() { + return $this->parameterPositions; + } + + /** + * @param ReflectionMethod $method + * @return array + */ + protected static function getDocBlockTypeHints(ReflectionMethod $method) { + $importMap = self::getImportMap($method->getDeclaringClass()); + $matches = array(); + preg_match_all(self::DOCBLOCK_PARAM_TYPE_HINT_MATCH, $method->getDocComment(), $matches); + $types = $matches[1]; + array_walk($types, function (&$value) use ($importMap) { + if (array_key_exists($value, $importMap)) { + $value = $importMap[$value]; + } + }); + return array_combine($matches[2], $types); + } + + /** + * @param ReflectionClass $class + * @return mixed + */ + protected static function getImportMap(ReflectionClass $class) { + $className = $class->getName(); + if (!array_key_exists($className, self::$importMap)) { + $fileContent = file_get_contents($class->getFileName()); + $matches = array(); + preg_match_all(self::CLASS_USES_MATCH, $fileContent, $matches, PREG_SET_ORDER); + foreach ($matches as $match) { + self::$importMap[$className][$match[count($match) - 1]] = $match[1]; + } + } + return self::$importMap[$className]; + } +} \ No newline at end of file Modified: trunk/framework/Bee/MVC/Controller/Multiaction/HandlerMethodInvocator/IInvocationResolver.php =================================================================== --- trunk/framework/Bee/MVC/Controller/Multiaction/HandlerMethodInvocator/IInvocationResolver.php 2014-07-08 09:52:40 UTC (rev 173) +++ trunk/framework/Bee/MVC/Controller/Multiaction/HandlerMethodInvocator/IInvocationResolver.php 2014-07-08 16:41:30 UTC (rev 174) @@ -22,5 +22,9 @@ * @package Bee\MVC\Controller\Multiaction\HandlerMethodInvocator */ interface IInvocationResolver { + /** + * @param Bee_MVC_IHttpRequest $request + * @return MethodInvocation + */ public function getInvocationDefinition(Bee_MVC_IHttpRequest $request); } \ No newline at end of file Added: trunk/framework/Bee/MVC/Controller/Multiaction/HandlerMethodInvocator/MethodInvocation.php =================================================================== --- trunk/framework/Bee/MVC/Controller/Multiaction/HandlerMethodInvocator/MethodInvocation.php (rev 0) +++ trunk/framework/Bee/MVC/Controller/Multiaction/HandlerMethodInvocator/MethodInvocation.php 2014-07-08 16:41:30 UTC (rev 174) @@ -0,0 +1,80 @@ +<?php +namespace Bee\MVC\Controller\Multiaction\HandlerMethodInvocator; +/* + * Copyright 2008-2014 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Class MethodInvocation + * @package Bee\MVC\Controller\Multiaction\HandlerMethodInvocator + */ +class MethodInvocation { + + /** + * @var HandlerMethodMetadata + */ + private $methodMeta; + + /** + * @var array + */ + private $paramValues; + + /** + * @var array + */ + private $urlParameterPositions; + + function __construct(HandlerMethodMetadata $methodMetadata, array $urlParameterPositions = array()) { + $this->methodMeta = $methodMetadata; + $this->urlParameterPositions = $urlParameterPositions; + } + + /** + * @return HandlerMethodMetadata + */ + public function getMethodMeta() { + return $this->methodMeta; + } + + /** + * @return array + */ + public function getUrlParameterPositions() { + return $this->urlParameterPositions; + } + + /** + * @return array + */ + public function getParamValues() { + return $this->paramValues; + } + + /** + * @param array $paramValues + */ + public function setParamValues(array $paramValues) { + $this->paramValues = $paramValues; + } + + /** + * @param $pos + * @return mixed + */ + public function getParamValue($pos) { + return $this->paramValues[$pos]; + } +} \ No newline at end of file Modified: trunk/framework/Bee/MVC/Controller/Multiaction/HandlerMethodInvocator/RegexMappingInvocationResolver.php =================================================================== --- trunk/framework/Bee/MVC/Controller/Multiaction/HandlerMethodInvocator/RegexMappingInvocationResolver.php 2014-07-08 09:52:40 UTC (rev 173) +++ trunk/framework/Bee/MVC/Controller/Multiaction/HandlerMethodInvocator/RegexMappingInvocationResolver.php 2014-07-08 16:41:30 UTC (rev 174) @@ -15,10 +15,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +use Addendum\ReflectionAnnotatedMethod; use Bee\Utils\AntPathToRegexTransformer; -use Bee\Utils\ITypeDefinitions; use Bee_MVC_IHttpRequest; -use ReflectionClass; use ReflectionMethod; /** @@ -28,65 +27,59 @@ class RegexMappingInvocationResolver implements IInvocationResolver { /** - * @var array + * @var HandlerMethodMetadata[] */ + private static $methodMetadataMap = array(); + + /** + * @var MethodInvocation[] + */ private $mappedMethods = array(); /** - * @param array|\ReflectionMethod[] $mapping + * @param array|ReflectionAnnotatedMethod[] $mapping */ public function __construct(array $mapping) { - foreach($mapping as $antPathPattern => $method) { - $paramTypes = array(); - $nameToPos = array(); - $fixedParamPos = array(); - foreach($method->getParameters() as $param) { - $typeName = $param->getClass(); - $typeName = $typeName instanceof ReflectionClass ? $typeName->getName() : null; - if(!\Bee_Utils_Strings::hasText($typeName)) { - // todo: derive primitive type names from @var annotations - $typeName = ITypeDefinitions::STRING; - } else if($typeName == 'Bee_MVC_IHttpRequest') { - $fixedParamPos[$param->getPosition()] = true; - } - $paramTypes[$param->getName()] = $typeName; - $paramTypes[$param->getPosition()] = $typeName; - $nameToPos[$param->getName()] = $param->getPosition(); - } - $positionMap = array(); - $regex = AntPathToRegexTransformer::getRegexForParametrizedPattern($antPathPattern, $paramTypes, $positionMap); - $positionMap = array_map(function ($value) use ($nameToPos) { + foreach ($mapping as $antPathPattern => $method) { + $methodMeta = new HandlerMethodMetadata($method); + + $urlParameterPositions = array(); + $regex = AntPathToRegexTransformer::getRegexForParametrizedPattern($antPathPattern, $methodMeta->getTypeMap(), $urlParameterPositions); + $nameToPos = $methodMeta->getParameterPositions(); + $urlParameterPositions = array_map(function ($value) use ($nameToPos) { return array_key_exists($value, $nameToPos) ? $nameToPos[$value] : $value; - }, $positionMap); + }, $urlParameterPositions); // positionMap should only contain numeric values, mapping from match position to parameter position - $positionMap = array_flip($positionMap); + $urlParameterPositions = array_flip($urlParameterPositions); // now from parameter pos to match pos - if(!array_key_exists($regex, $this->mappedMethods)) { - // todo: object? - $this->mappedMethods[$regex] = array( - 'method' => $method, - 'positionMap' => $positionMap, - 'requestParamPos' => $fixedParamPos, - 'typeMap' => $paramTypes - ); + if (!array_key_exists($regex, $this->mappedMethods)) { + $this->mappedMethods[$regex] = new MethodInvocation($methodMeta, $urlParameterPositions); } } } /** * @param Bee_MVC_IHttpRequest $request - * @return array + * @return MethodInvocation */ public function getInvocationDefinition(Bee_MVC_IHttpRequest $request) { $pathInfo = $request->getPathInfo(); - foreach($this->mappedMethods as $regex => $invocInfo) { + foreach ($this->mappedMethods as $regex => $invocInfo) { $matches = array(); - if(preg_match($regex, $pathInfo, $matches) === 1) { - return array_merge($invocInfo, array('paramValues' => $matches)); + if (preg_match($regex, $pathInfo, $matches) === 1) { + $invocInfo->setParamValues($matches); + return $invocInfo; } } - // todo: maybe throw exception? how do we determine if method could not be found? return null; } + + public static function getCachedMethodMetadata(ReflectionMethod $method) { + $methodFullName = $method->getDeclaringClass()->getName() .'::' . $method->getName(); + if(!array_key_exists($methodFullName, self::$methodMetadataMap)) { + self::$methodMetadataMap[$methodFullName] = new HandlerMethodMetadata($method); + } + return self::$methodMetadataMap[$methodFullName]; + } } \ No newline at end of file Added: trunk/framework/Bee/MVC/Controller/Multiaction/NoHandlerMethodFoundException.php =================================================================== --- trunk/framework/Bee/MVC/Controller/Multiaction/NoHandlerMethodFoundException.php (rev 0) +++ trunk/framework/Bee/MVC/Controller/Multiaction/NoHandlerMethodFoundException.php 2014-07-08 16:41:30 UTC (rev 174) @@ -0,0 +1,13 @@ +<?php + +namespace Bee\MVC\Controller\Multiaction; +use Exception; + + +/** + * Class NoHandlerMethodFoundException + * @package Bee\MVC\Controller\Multiaction + */ +class NoHandlerMethodFoundException extends Exception { + +} \ No newline at end of file Modified: trunk/framework/Bee/MVC/Controller/Multiaction/RequestHandler.php =================================================================== --- trunk/framework/Bee/MVC/Controller/Multiaction/RequestHandler.php 2014-07-08 09:52:40 UTC (rev 173) +++ trunk/framework/Bee/MVC/Controller/Multiaction/RequestHandler.php 2014-07-08 16:41:30 UTC (rev 174) @@ -23,7 +23,8 @@ * * @author Michael Plomer <mic...@it...> * - * @Target("method") + * @Annotation + * @Target("METHOD") */ class Bee_MVC_Controller_Multiaction_RequestHandler extends Annotation { public $httpMethod; Added: trunk/framework/Bee/MVC/Controller/Multiaction/RequestHandlerMapping.php =================================================================== --- trunk/framework/Bee/MVC/Controller/Multiaction/RequestHandlerMapping.php (rev 0) +++ trunk/framework/Bee/MVC/Controller/Multiaction/RequestHandlerMapping.php 2014-07-08 16:41:30 UTC (rev 174) @@ -0,0 +1,43 @@ +<?php +namespace Bee\MVC\Controller\Multiaction; +/* + * Copyright 2008-2014 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Class RequestHandlerMapping + * @package Bee\MVC\Controller\Multiaction + * + * @Annotation + * @Target({"METHOD"}) + */ +class RequestHandlerMapping { + + /** + * @var string + */ + public $httpMethod; + + /** + * @var string + */ + public $pathPattern; + + /** + * @var boolean + */ + public $ajax; + +} \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |