From: Stricted Date: Sun, 17 Jul 2016 05:08:40 +0000 (+0200) Subject: use zend router X-Git-Url: https://git.stricted.de/?a=commitdiff_plain;h=44d399bc94b994e91c9b816258d07908b09b7b40;p=GitHub%2FStricted%2FDomain-Control-Panel.git use zend router --- diff --git a/lib/system/RequestHandler.class.php b/lib/system/RequestHandler.class.php index 7ab1862..5b9f96e 100644 --- a/lib/system/RequestHandler.class.php +++ b/lib/system/RequestHandler.class.php @@ -1,6 +1,10 @@ pattern = '~/?(?:(?P[A-Za-z0-9\-]+)(?:/(?P\d+)(?:-(?P[^/]+))?)?)?~x'; - $controllers = ControllerCacheBuilder::getInstance()->getData(array('module' => $module)); - if (DNS::getSession()->username !== null) { DNS::getTPL()->assign(array("username" => DNS::getSession()->username)); } @@ -25,88 +26,69 @@ class RequestHandler { DNS::getTPL()->assign(array("username" => '')); } - $className = ""; - if (!empty($_SERVER['QUERY_STRING'])) { - $this->matches($_SERVER['QUERY_STRING']); - $this->registerRouteData(); - } - else { - $className = '\\dns'.(empty($module) ? '' : '\\'.$module).'\\page\\IndexPage'; - } + $router = new SimpleRouteStack(); + + $router->addRoute('', Literal::factory([ 'route' => '', 'defaults' => [ 'controller' => 'dns\page\IndexPage' ] ])); + $router->addRoute('Index', Literal::factory([ 'route' => 'Index', 'defaults' => [ 'controller' => 'dns\page\IndexPage' ] ])); + $router->addRoute('index', Literal::factory([ 'route' => 'index', 'defaults' => [ 'controller' => 'dns\page\IndexPage' ] ])); + $router->addRoute('Login', Literal::factory([ 'route' => 'Login', 'defaults' => [ 'controller' => 'dns\page\LoginPage' ] ])); + $router->addRoute('Logout', Literal::factory([ 'route' => 'Logout', 'defaults' => [ 'controller' => 'dns\page\LogoutPage' ] ])); + $router->addRoute('DomainList', Literal::factory([ 'route' => 'DomainList', 'defaults' => [ 'controller' => 'dns\page\DomainListPage' ] ])); + $router->addRoute('DomainAdd', Literal::factory([ 'route' => 'DomainAdd', 'defaults' => [ 'controller' => 'dns\page\DomainAddPage' ] ])); + //$router->addRoute('DomainAdd', Regex::factory([ 'regex' => 'DomainEdit/(?P<id>\d+)(/)?', 'defaults' => [ 'controller' => 'dns\page\DomainEditPage' ], 'spec' => '/DomainEdit/%id%' ])); - if (isset($this->routeData['controller']) && !empty($this->routeData['controller'])) { - $controller = strtolower($this->routeData['controller']); - if (isset($controllers[$controller]) && !empty($controllers[$controller])) { - $className = $controllers[$controller]; + $match = $router->match(new Request()); + if ($match !== null) { + foreach ($match->getParams() as $key => $value) { + $_GET[$key] = $value; + $_REQUEST[$key] = $value; } - else { - @header('HTTP/1.0 404 Not Found'); - DNS::getTPL()->assign(array("activeMenuItem" => '', "error" => 'The link you are trying to reach is no longer available or invalid.')); - DNS::getTPL()->display('error.tpl'); + + $className = $match->getParam("controller"); + + if (!User::isLoggedIn() && $className != 'dns\page\LoginPage' && $className != 'dns\page\ApiPage') { + echo $className; + DNS::getTPL()->display('login.tpl'); exit; } - } - - if (!User::isLoggedIn() && $className != '\dns\page\LoginPage' && $className != '\dns\page\ApiPage') { - DNS::getTPL()->display('login.tpl'); - exit; - } - - // handle offline mode - if (defined('OFFLINE') && OFFLINE) { - $admin = User::isAdmin(); - $available = false; - if (defined($className . '::AVAILABLE_DURING_OFFLINE_MODE') && constant($className . '::AVAILABLE_DURING_OFFLINE_MODE')) { - $available = true; + if (defined('OFFLINE') && OFFLINE) { + $admin = User::isAdmin(); + $available = false; + + if (defined($className . '::AVAILABLE_DURING_OFFLINE_MODE') && constant($className . '::AVAILABLE_DURING_OFFLINE_MODE')) { + $available = true; + } + + if (!$admin && !$available) { + @header('HTTP/1.1 503 Service Unavailable'); + DNS::getTPL()->display('offline.tpl'); + exit; + } } - if (!$admin && !$available) { - @header('HTTP/1.1 503 Service Unavailable'); - DNS::getTPL()->display('offline.tpl'); + try { + new $className(); + } + catch (\Exception $e) { + if ($e->getCode() == 404) { + @header('HTTP/1.0 404 Not Found'); + } + else if ($e->getCode() == 403) { + @header('HTTP/1.0 403 Forbidden'); + } + + // show error page + DNS::getTPL()->assign(array("activeMenuItem" => '', "error" => $e->getMessage())); + DNS::getTPL()->display('error.tpl'); exit; } } - - try { - new $className(); - } - catch (\Exception $e) { - if ($e->getCode() == 404) { - @header('HTTP/1.0 404 Not Found'); - } - else if ($e->getCode() == 403) { - @header('HTTP/1.0 403 Forbidden'); - } - - /* show error page */ - DNS::getTPL()->assign(array("activeMenuItem" => '', "error" => $e->getMessage())); + else { + @header('HTTP/1.0 404 Not Found'); + DNS::getTPL()->assign(array("activeMenuItem" => '', "error" => 'The link you are trying to reach is no longer available or invalid.')); DNS::getTPL()->display('error.tpl'); exit; } } - - /** - * Registers route data within $_GET and $_REQUEST. - */ - protected function registerRouteData() { - foreach ($this->routeData as $key => $value) { - $_GET[$key] = $value; - $_REQUEST[$key] = $value; - } - } - - public function matches($requestURL) { - if (preg_match($this->pattern, $requestURL, $matches)) { - foreach ($matches as $key => $value) { - if (!is_numeric($key)) { - $this->routeData[$key] = $value; - } - } - - return true; - } - - return false; - } } diff --git a/vendor/Zend/Mvc/Application.php b/vendor/Zend/Mvc/Application.php new file mode 100644 index 0000000..07682fb --- /dev/null +++ b/vendor/Zend/Mvc/Application.php @@ -0,0 +1,392 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc; + +use Zend\EventManager\EventManagerAwareInterface; +use Zend\EventManager\EventManagerInterface; +use Zend\ServiceManager\ServiceManager; +use Zend\Stdlib\RequestInterface; +use Zend\Stdlib\ResponseInterface; + +/** + * Main application class for invoking applications + * + * Expects the user will provide a configured ServiceManager, configured with + * the following services: + * + * - EventManager + * - ModuleManager + * - Request + * - Response + * - RouteListener + * - Router + * - DispatchListener + * - MiddlewareListener + * - ViewManager + * + * The most common workflow is: + * <code> + * $services = new Zend\ServiceManager\ServiceManager($servicesConfig); + * $app = new Application($appConfig, $services); + * $app->bootstrap(); + * $response = $app->run(); + * $response->send(); + * </code> + * + * bootstrap() opts in to the default route, dispatch, and view listeners, + * sets up the MvcEvent, and triggers the bootstrap event. This can be omitted + * if you wish to setup your own listeners and/or workflow; alternately, you + * can simply extend the class to override such behavior. + */ +class Application implements + ApplicationInterface, + EventManagerAwareInterface +{ + const ERROR_CONTROLLER_CANNOT_DISPATCH = 'error-controller-cannot-dispatch'; + const ERROR_CONTROLLER_NOT_FOUND = 'error-controller-not-found'; + const ERROR_CONTROLLER_INVALID = 'error-controller-invalid'; + const ERROR_EXCEPTION = 'error-exception'; + const ERROR_ROUTER_NO_MATCH = 'error-router-no-match'; + const ERROR_MIDDLEWARE_CANNOT_DISPATCH = 'error-middleware-cannot-dispatch'; + + /** + * @var array + */ + protected $configuration = null; + + /** + * Default application event listeners + * + * @var array + */ + protected $defaultListeners = [ + 'RouteListener', + 'MiddlewareListener', + 'DispatchListener', + 'HttpMethodListener', + 'ViewManager', + 'SendResponseListener', + ]; + + /** + * MVC event token + * @var MvcEvent + */ + protected $event; + + /** + * @var EventManagerInterface + */ + protected $events; + + /** + * @var \Zend\Stdlib\RequestInterface + */ + protected $request; + + /** + * @var ResponseInterface + */ + protected $response; + + /** + * @var ServiceManager + */ + protected $serviceManager = null; + + /** + * Constructor + * + * @param mixed $configuration + * @param ServiceManager $serviceManager + * @param null|EventManagerInterface $events + * @param null|RequestInterface $request + * @param null|ResponseInterface $response + */ + public function __construct( + $configuration, + ServiceManager $serviceManager, + EventManagerInterface $events = null, + RequestInterface $request = null, + ResponseInterface $response = null + ) { + $this->configuration = $configuration; + $this->serviceManager = $serviceManager; + $this->setEventManager($events ?: $serviceManager->get('EventManager')); + $this->request = $request ?: $serviceManager->get('Request'); + $this->response = $response ?: $serviceManager->get('Response'); + } + + /** + * Retrieve the application configuration + * + * @return array|object + */ + public function getConfig() + { + return $this->serviceManager->get('config'); + } + + /** + * Bootstrap the application + * + * Defines and binds the MvcEvent, and passes it the request, response, and + * router. Attaches the ViewManager as a listener. Triggers the bootstrap + * event. + * + * @param array $listeners List of listeners to attach. + * @return Application + */ + public function bootstrap(array $listeners = []) + { + $serviceManager = $this->serviceManager; + $events = $this->events; + + // Setup default listeners + $listeners = array_unique(array_merge($this->defaultListeners, $listeners)); + + foreach ($listeners as $listener) { + $serviceManager->get($listener)->attach($events); + } + + // Setup MVC Event + $this->event = $event = new MvcEvent(); + $event->setName(MvcEvent::EVENT_BOOTSTRAP); + $event->setTarget($this); + $event->setApplication($this); + $event->setRequest($this->request); + $event->setResponse($this->response); + $event->setRouter($serviceManager->get('Router')); + + // Trigger bootstrap events + $events->triggerEvent($event); + + return $this; + } + + /** + * Retrieve the service manager + * + * @return ServiceManager + */ + public function getServiceManager() + { + return $this->serviceManager; + } + + /** + * Get the request object + * + * @return \Zend\Stdlib\RequestInterface + */ + public function getRequest() + { + return $this->request; + } + + /** + * Get the response object + * + * @return ResponseInterface + */ + public function getResponse() + { + return $this->response; + } + + /** + * Get the MVC event instance + * + * @return MvcEvent + */ + public function getMvcEvent() + { + return $this->event; + } + + /** + * Set the event manager instance + * + * @param EventManagerInterface $eventManager + * @return Application + */ + public function setEventManager(EventManagerInterface $eventManager) + { + $eventManager->setIdentifiers([ + __CLASS__, + get_class($this), + ]); + $this->events = $eventManager; + return $this; + } + + /** + * Retrieve the event manager + * + * Lazy-loads an EventManager instance if none registered. + * + * @return EventManagerInterface + */ + public function getEventManager() + { + return $this->events; + } + + /** + * Static method for quick and easy initialization of the Application. + * + * If you use this init() method, you cannot specify a service with the + * name of 'ApplicationConfig' in your service manager config. This name is + * reserved to hold the array from application.config.php. + * + * The following services can only be overridden from application.config.php: + * + * - ModuleManager + * - SharedEventManager + * - EventManager & Zend\EventManager\EventManagerInterface + * + * All other services are configured after module loading, thus can be + * overridden by modules. + * + * @param array $configuration + * @return Application + */ + public static function init($configuration = []) + { + // Prepare the service manager + $smConfig = isset($configuration['service_manager']) ? $configuration['service_manager'] : []; + $smConfig = new Service\ServiceManagerConfig($smConfig); + + $serviceManager = new ServiceManager(); + $smConfig->configureServiceManager($serviceManager); + $serviceManager->setService('ApplicationConfig', $configuration); + + // Load modules + $serviceManager->get('ModuleManager')->loadModules(); + + // Prepare list of listeners to bootstrap + $listenersFromAppConfig = isset($configuration['listeners']) ? $configuration['listeners'] : []; + $config = $serviceManager->get('config'); + $listenersFromConfigService = isset($config['listeners']) ? $config['listeners'] : []; + + $listeners = array_unique(array_merge($listenersFromConfigService, $listenersFromAppConfig)); + + return $serviceManager->get('Application')->bootstrap($listeners); + } + + /** + * Run the application + * + * @triggers route(MvcEvent) + * Routes the request, and sets the RouteMatch object in the event. + * @triggers dispatch(MvcEvent) + * Dispatches a request, using the discovered RouteMatch and + * provided request. + * @triggers dispatch.error(MvcEvent) + * On errors (controller not found, action not supported, etc.), + * populates the event with information about the error type, + * discovered controller, and controller class (if known). + * Typically, a handler should return a populated Response object + * that can be returned immediately. + * @return self + */ + public function run() + { + $events = $this->events; + $event = $this->event; + + // Define callback used to determine whether or not to short-circuit + $shortCircuit = function ($r) use ($event) { + if ($r instanceof ResponseInterface) { + return true; + } + if ($event->getError()) { + return true; + } + return false; + }; + + // Trigger route event + $event->setName(MvcEvent::EVENT_ROUTE); + $event->stopPropagation(false); // Clear before triggering + $result = $events->triggerEventUntil($shortCircuit, $event); + if ($result->stopped()) { + $response = $result->last(); + if ($response instanceof ResponseInterface) { + $event->setName(MvcEvent::EVENT_FINISH); + $event->setTarget($this); + $event->setResponse($response); + $event->stopPropagation(false); // Clear before triggering + $events->triggerEvent($event); + $this->response = $response; + return $this; + } + } + + if ($event->getError()) { + return $this->completeRequest($event); + } + + // Trigger dispatch event + $event->setName(MvcEvent::EVENT_DISPATCH); + $event->stopPropagation(false); // Clear before triggering + $result = $events->triggerEventUntil($shortCircuit, $event); + + // Complete response + $response = $result->last(); + if ($response instanceof ResponseInterface) { + $event->setName(MvcEvent::EVENT_FINISH); + $event->setTarget($this); + $event->setResponse($response); + $event->stopPropagation(false); // Clear before triggering + $events->triggerEvent($event); + $this->response = $response; + return $this; + } + + $response = $this->response; + $event->setResponse($response); + $this->completeRequest($event); + + return $this; + } + + /** + * @deprecated + */ + public function send() + { + } + + /** + * Complete the request + * + * Triggers "render" and "finish" events, and returns response from + * event object. + * + * @param MvcEvent $event + * @return Application + */ + protected function completeRequest(MvcEvent $event) + { + $events = $this->events; + $event->setTarget($this); + + $event->setName(MvcEvent::EVENT_RENDER); + $event->stopPropagation(false); // Clear before triggering + $events->triggerEvent($event); + + $event->setName(MvcEvent::EVENT_FINISH); + $event->stopPropagation(false); // Clear before triggering + $events->triggerEvent($event); + + return $this; + } +} diff --git a/vendor/Zend/Mvc/ApplicationInterface.php b/vendor/Zend/Mvc/ApplicationInterface.php new file mode 100644 index 0000000..51bd7ee --- /dev/null +++ b/vendor/Zend/Mvc/ApplicationInterface.php @@ -0,0 +1,43 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc; + +use Zend\EventManager\EventsCapableInterface; + +interface ApplicationInterface extends EventsCapableInterface +{ + /** + * Get the locator object + * + * @return \Zend\ServiceManager\ServiceLocatorInterface + */ + public function getServiceManager(); + + /** + * Get the request object + * + * @return \Zend\Stdlib\RequestInterface + */ + public function getRequest(); + + /** + * Get the response object + * + * @return \Zend\Stdlib\ResponseInterface + */ + public function getResponse(); + + /** + * Run the application + * + * @return self + */ + public function run(); +} diff --git a/vendor/Zend/Mvc/Controller/AbstractActionController.php b/vendor/Zend/Mvc/Controller/AbstractActionController.php new file mode 100644 index 0000000..f793e77 --- /dev/null +++ b/vendor/Zend/Mvc/Controller/AbstractActionController.php @@ -0,0 +1,110 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Controller; + +use Zend\Http\Response as HttpResponse; +use Zend\Mvc\Exception; +use Zend\Mvc\MvcEvent; +use Zend\View\Model\ViewModel; + +/** + * Basic action controller + */ +abstract class AbstractActionController extends AbstractController +{ + /** + * {@inheritDoc} + */ + protected $eventIdentifier = __CLASS__; + + /** + * Default action if none provided + * + * @return array + */ + public function indexAction() + { + return new ViewModel([ + 'content' => 'Placeholder page' + ]); + } + + /** + * Action called if matched action does not exist + * + * @return array + */ + public function notFoundAction() + { + $response = $this->response; + $event = $this->getEvent(); + $routeMatch = $event->getRouteMatch(); + $routeMatch->setParam('action', 'not-found'); + + if ($response instanceof HttpResponse) { + return $this->createHttpNotFoundModel($response); + } + return $this->createConsoleNotFoundModel($response); + } + + /** + * Execute the request + * + * @param MvcEvent $e + * @return mixed + * @throws Exception\DomainException + */ + public function onDispatch(MvcEvent $e) + { + $routeMatch = $e->getRouteMatch(); + if (!$routeMatch) { + /** + * @todo Determine requirements for when route match is missing. + * Potentially allow pulling directly from request metadata? + */ + throw new Exception\DomainException('Missing route matches; unsure how to retrieve action'); + } + + $action = $routeMatch->getParam('action', 'not-found'); + $method = static::getMethodFromAction($action); + + if (!method_exists($this, $method)) { + $method = 'notFoundAction'; + } + + $actionResponse = $this->$method(); + + $e->setResult($actionResponse); + + return $actionResponse; + } + + /** + * @deprecated please use the {@see \Zend\Mvc\Controller\Plugin\CreateHttpNotFoundModel} plugin instead: this + * method will be removed in release 2.5 or later. + * + * {@inheritDoc} + */ + protected function createHttpNotFoundModel(HttpResponse $response) + { + return $this->__call('createHttpNotFoundModel', [$response]); + } + + /** + * @deprecated please use the {@see \Zend\Mvc\Controller\Plugin\CreateConsoleNotFoundModel} plugin instead: this + * method will be removed in release 2.5 or later. + * + * {@inheritDoc} + */ + protected function createConsoleNotFoundModel($response) + { + return $this->__call('createConsoleNotFoundModel', [$response]); + } +} diff --git a/vendor/Zend/Mvc/Controller/AbstractConsoleController.php b/vendor/Zend/Mvc/Controller/AbstractConsoleController.php new file mode 100644 index 0000000..42eb361 --- /dev/null +++ b/vendor/Zend/Mvc/Controller/AbstractConsoleController.php @@ -0,0 +1,57 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Controller; + +use Zend\Console\Adapter\AdapterInterface as ConsoleAdapter; +use Zend\Console\Request as ConsoleRequest; +use Zend\Mvc\Exception\InvalidArgumentException; +use Zend\Stdlib\RequestInterface; +use Zend\Stdlib\ResponseInterface; + +class AbstractConsoleController extends AbstractActionController +{ + /** + * @var ConsoleAdapter + */ + protected $console; + + /** + * @param ConsoleAdapter $console + * @return self + */ + public function setConsole(ConsoleAdapter $console) + { + $this->console = $console; + + return $this; + } + + /** + * @return ConsoleAdapter + */ + public function getConsole() + { + return $this->console; + } + + /** + * {@inheritdoc} + */ + public function dispatch(RequestInterface $request, ResponseInterface $response = null) + { + if (! $request instanceof ConsoleRequest) { + throw new InvalidArgumentException(sprintf( + '%s can only dispatch requests in a console environment', + get_called_class() + )); + } + return parent::dispatch($request, $response); + } +} diff --git a/vendor/Zend/Mvc/Controller/AbstractController.php b/vendor/Zend/Mvc/Controller/AbstractController.php new file mode 100644 index 0000000..a351115 --- /dev/null +++ b/vendor/Zend/Mvc/Controller/AbstractController.php @@ -0,0 +1,351 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Controller; + +use Zend\EventManager\EventInterface as Event; +use Zend\EventManager\EventManager; +use Zend\EventManager\EventManagerAwareInterface; +use Zend\EventManager\EventManagerInterface; +use Zend\Http\PhpEnvironment\Response as HttpResponse; +use Zend\Http\Request as HttpRequest; +use Zend\Mvc\InjectApplicationEventInterface; +use Zend\Mvc\MvcEvent; +use Zend\ServiceManager\ServiceLocatorInterface; +use Zend\ServiceManager\ServiceManager; +use Zend\Stdlib\DispatchableInterface as Dispatchable; +use Zend\Stdlib\RequestInterface as Request; +use Zend\Stdlib\ResponseInterface as Response; + +/** + * Abstract controller + * + * Convenience methods for pre-built plugins (@see __call): + * + * @method \Zend\View\Model\ModelInterface acceptableViewModelSelector(array $matchAgainst = null, bool $returnDefault = true, \Zend\Http\Header\Accept\FieldValuePart\AbstractFieldValuePart $resultReference = null) + * @method bool|array|\Zend\Http\Response fileprg(\Zend\Form\FormInterface $form, $redirect = null, $redirectToUrl = false) + * @method bool|array|\Zend\Http\Response filePostRedirectGet(\Zend\Form\FormInterface $form, $redirect = null, $redirectToUrl = false) + * @method \Zend\Mvc\Controller\Plugin\FlashMessenger flashMessenger() + * @method \Zend\Mvc\Controller\Plugin\Forward forward() + * @method mixed|null identity() + * @method \Zend\Mvc\Controller\Plugin\Layout|\Zend\View\Model\ModelInterface layout(string $template = null) + * @method \Zend\Mvc\Controller\Plugin\Params|mixed params(string $param = null, mixed $default = null) + * @method \Zend\Http\Response|array prg(string $redirect = null, bool $redirectToUrl = false) + * @method \Zend\Http\Response|array postRedirectGet(string $redirect = null, bool $redirectToUrl = false) + * @method \Zend\Mvc\Controller\Plugin\Redirect redirect() + * @method \Zend\Mvc\Controller\Plugin\Url url() + * @method \Zend\View\Model\ConsoleModel createConsoleNotFoundModel() + * @method \Zend\View\Model\ViewModel createHttpNotFoundModel(Response $response) + */ +abstract class AbstractController implements + Dispatchable, + EventManagerAwareInterface, + InjectApplicationEventInterface +{ + /** + * @var PluginManager + */ + protected $plugins; + + /** + * @var Request + */ + protected $request; + + /** + * @var Response + */ + protected $response; + + /** + * @var ServiceLocatorInterface + */ + protected $serviceLocator; + + /** + * @var Event + */ + protected $event; + + /** + * @var EventManagerInterface + */ + protected $events; + + /** + * @var null|string|string[] + */ + protected $eventIdentifier; + + /** + * Execute the request + * + * @param MvcEvent $e + * @return mixed + */ + abstract public function onDispatch(MvcEvent $e); + + /** + * Dispatch a request + * + * @events dispatch.pre, dispatch.post + * @param Request $request + * @param null|Response $response + * @return Response|mixed + */ + public function dispatch(Request $request, Response $response = null) + { + $this->request = $request; + if (!$response) { + $response = new HttpResponse(); + } + $this->response = $response; + + $e = $this->getEvent(); + $e->setName(MvcEvent::EVENT_DISPATCH); + $e->setRequest($request); + $e->setResponse($response); + $e->setTarget($this); + + $result = $this->getEventManager()->triggerEventUntil(function ($test) { + return ($test instanceof Response); + }, $e); + + if ($result->stopped()) { + return $result->last(); + } + + return $e->getResult(); + } + + /** + * Get request object + * + * @return Request + */ + public function getRequest() + { + if (!$this->request) { + $this->request = new HttpRequest(); + } + + return $this->request; + } + + /** + * Get response object + * + * @return Response + */ + public function getResponse() + { + if (!$this->response) { + $this->response = new HttpResponse(); + } + + return $this->response; + } + + /** + * Set the event manager instance used by this context + * + * @param EventManagerInterface $events + * @return AbstractController + */ + public function setEventManager(EventManagerInterface $events) + { + $className = get_class($this); + + $nsPos = strpos($className, '\\') ?: 0; + $events->setIdentifiers(array_merge( + [ + __CLASS__, + $className, + substr($className, 0, $nsPos) + ], + array_values(class_implements($className)), + (array) $this->eventIdentifier + )); + + $this->events = $events; + $this->attachDefaultListeners(); + + return $this; + } + + /** + * Retrieve the event manager + * + * Lazy-loads an EventManager instance if none registered. + * + * @return EventManagerInterface + */ + public function getEventManager() + { + if (!$this->events) { + $this->setEventManager(new EventManager()); + } + + return $this->events; + } + + /** + * Set an event to use during dispatch + * + * By default, will re-cast to MvcEvent if another event type is provided. + * + * @param Event $e + * @return void + */ + public function setEvent(Event $e) + { + if (!$e instanceof MvcEvent) { + $eventParams = $e->getParams(); + $e = new MvcEvent(); + $e->setParams($eventParams); + unset($eventParams); + } + $this->event = $e; + } + + /** + * Get the attached event + * + * Will create a new MvcEvent if none provided. + * + * @return MvcEvent + */ + public function getEvent() + { + if (!$this->event) { + $this->setEvent(new MvcEvent()); + } + + return $this->event; + } + + /** + * Set serviceManager instance + * + * @param ServiceLocatorInterface $serviceLocator + * @return void + */ + public function setServiceLocator(ServiceLocatorInterface $serviceLocator) + { + $this->serviceLocator = $serviceLocator; + } + + /** + * Retrieve serviceManager instance + * + * @return ServiceLocatorInterface + */ + public function getServiceLocator() + { + trigger_error(sprintf( + 'You are retrieving the service locator from within the class %s. Please be aware that ' + . 'ServiceLocatorAwareInterface is deprecated and will be removed in version 3.0, along ' + . 'with the ServiceLocatorAwareInitializer. You will need to update your class to accept ' + . 'all dependencies at creation, either via constructor arguments or setters, and use ' + . 'a factory to perform the injections.', + get_class($this) + ), E_USER_DEPRECATED); + + return $this->serviceLocator; + } + + /** + * Get plugin manager + * + * @return PluginManager + */ + public function getPluginManager() + { + if (!$this->plugins) { + $this->setPluginManager(new PluginManager(new ServiceManager())); + } + + $this->plugins->setController($this); + return $this->plugins; + } + + /** + * Set plugin manager + * + * @param PluginManager $plugins + * @return AbstractController + */ + public function setPluginManager(PluginManager $plugins) + { + $this->plugins = $plugins; + $this->plugins->setController($this); + + return $this; + } + + /** + * Get plugin instance + * + * @param string $name Name of plugin to return + * @param null|array $options Options to pass to plugin constructor (if not already instantiated) + * @return mixed + */ + public function plugin($name, array $options = null) + { + return $this->getPluginManager()->get($name, $options); + } + + /** + * Method overloading: return/call plugins + * + * If the plugin is a functor, call it, passing the parameters provided. + * Otherwise, return the plugin instance. + * + * @param string $method + * @param array $params + * @return mixed + */ + public function __call($method, $params) + { + $plugin = $this->plugin($method); + if (is_callable($plugin)) { + return call_user_func_array($plugin, $params); + } + + return $plugin; + } + + /** + * Register the default events for this controller + * + * @return void + */ + protected function attachDefaultListeners() + { + $events = $this->getEventManager(); + $events->attach(MvcEvent::EVENT_DISPATCH, [$this, 'onDispatch']); + } + + /** + * Transform an "action" token into a method name + * + * @param string $action + * @return string + */ + public static function getMethodFromAction($action) + { + $method = str_replace(['.', '-', '_'], ' ', $action); + $method = ucwords($method); + $method = str_replace(' ', '', $method); + $method = lcfirst($method); + $method .= 'Action'; + + return $method; + } +} diff --git a/vendor/Zend/Mvc/Controller/AbstractRestfulController.php b/vendor/Zend/Mvc/Controller/AbstractRestfulController.php new file mode 100644 index 0000000..85c8978 --- /dev/null +++ b/vendor/Zend/Mvc/Controller/AbstractRestfulController.php @@ -0,0 +1,590 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ +namespace Zend\Mvc\Controller; + +use Zend\Http\Request as HttpRequest; +use Zend\Json\Json; +use Zend\Mvc\Exception; +use Zend\Mvc\MvcEvent; +use Zend\Stdlib\RequestInterface as Request; +use Zend\Stdlib\ResponseInterface as Response; + +/** + * Abstract RESTful controller + */ +abstract class AbstractRestfulController extends AbstractController +{ + const CONTENT_TYPE_JSON = 'json'; + + /** + * {@inheritDoc} + */ + protected $eventIdentifier = __CLASS__; + + /** + * @var array + */ + protected $contentTypes = [ + self::CONTENT_TYPE_JSON => [ + 'application/hal+json', + 'application/json' + ] + ]; + + /** + * Name of request or query parameter containing identifier + * + * @var string + */ + protected $identifierName = 'id'; + + /** + * @var int From Zend\Json\Json + */ + protected $jsonDecodeType = Json::TYPE_ARRAY; + + /** + * Map of custom HTTP methods and their handlers + * + * @var array + */ + protected $customHttpMethodsMap = []; + + /** + * Set the route match/query parameter name containing the identifier + * + * @param string $name + * @return self + */ + public function setIdentifierName($name) + { + $this->identifierName = (string) $name; + return $this; + } + + /** + * Retrieve the route match/query parameter name containing the identifier + * + * @return string + */ + public function getIdentifierName() + { + return $this->identifierName; + } + + /** + * Create a new resource + * + * @param mixed $data + * @return mixed + */ + public function create($data) + { + $this->response->setStatusCode(405); + + return [ + 'content' => 'Method Not Allowed' + ]; + } + + /** + * Delete an existing resource + * + * @param mixed $id + * @return mixed + */ + public function delete($id) + { + $this->response->setStatusCode(405); + + return [ + 'content' => 'Method Not Allowed' + ]; + } + + /** + * Delete the entire resource collection + * + * Not marked as abstract, as that would introduce a BC break + * (introduced in 2.1.0); instead, raises an exception if not implemented. + * + * @return mixed + */ + public function deleteList($data) + { + $this->response->setStatusCode(405); + + return [ + 'content' => 'Method Not Allowed' + ]; + } + + /** + * Return single resource + * + * @param mixed $id + * @return mixed + */ + public function get($id) + { + $this->response->setStatusCode(405); + + return [ + 'content' => 'Method Not Allowed' + ]; + } + + /** + * Return list of resources + * + * @return mixed + */ + public function getList() + { + $this->response->setStatusCode(405); + + return [ + 'content' => 'Method Not Allowed' + ]; + } + + /** + * Retrieve HEAD metadata for the resource + * + * Not marked as abstract, as that would introduce a BC break + * (introduced in 2.1.0); instead, raises an exception if not implemented. + * + * @param null|mixed $id + * @return mixed + */ + public function head($id = null) + { + $this->response->setStatusCode(405); + + return [ + 'content' => 'Method Not Allowed' + ]; + } + + /** + * Respond to the OPTIONS method + * + * Typically, set the Allow header with allowed HTTP methods, and + * return the response. + * + * Not marked as abstract, as that would introduce a BC break + * (introduced in 2.1.0); instead, raises an exception if not implemented. + * + * @return mixed + */ + public function options() + { + $this->response->setStatusCode(405); + + return [ + 'content' => 'Method Not Allowed' + ]; + } + + /** + * Respond to the PATCH method + * + * Not marked as abstract, as that would introduce a BC break + * (introduced in 2.1.0); instead, raises an exception if not implemented. + * + * @param $id + * @param $data + * @return array + */ + public function patch($id, $data) + { + $this->response->setStatusCode(405); + + return [ + 'content' => 'Method Not Allowed' + ]; + } + + /** + * Replace an entire resource collection + * + * Not marked as abstract, as that would introduce a BC break + * (introduced in 2.1.0); instead, raises an exception if not implemented. + * + * @param mixed $data + * @return mixed + */ + public function replaceList($data) + { + $this->response->setStatusCode(405); + + return [ + 'content' => 'Method Not Allowed' + ]; + } + + /** + * Modify a resource collection without completely replacing it + * + * Not marked as abstract, as that would introduce a BC break + * (introduced in 2.2.0); instead, raises an exception if not implemented. + * + * @param mixed $data + * @return mixed + */ + public function patchList($data) + { + $this->response->setStatusCode(405); + + return [ + 'content' => 'Method Not Allowed' + ]; + } + + /** + * Update an existing resource + * + * @param mixed $id + * @param mixed $data + * @return mixed + */ + public function update($id, $data) + { + $this->response->setStatusCode(405); + + return [ + 'content' => 'Method Not Allowed' + ]; + } + + /** + * Basic functionality for when a page is not available + * + * @return array + */ + public function notFoundAction() + { + $this->response->setStatusCode(404); + + return [ + 'content' => 'Page not found' + ]; + } + + /** + * Dispatch a request + * + * If the route match includes an "action" key, then this acts basically like + * a standard action controller. Otherwise, it introspects the HTTP method + * to determine how to handle the request, and which method to delegate to. + * + * @events dispatch.pre, dispatch.post + * @param Request $request + * @param null|Response $response + * @return mixed|Response + * @throws Exception\InvalidArgumentException + */ + public function dispatch(Request $request, Response $response = null) + { + if (! $request instanceof HttpRequest) { + throw new Exception\InvalidArgumentException( + 'Expected an HTTP request'); + } + + return parent::dispatch($request, $response); + } + + /** + * Handle the request + * + * @todo try-catch in "patch" for patchList should be removed in the future + * @param MvcEvent $e + * @return mixed + * @throws Exception\DomainException if no route matches in event or invalid HTTP method + */ + public function onDispatch(MvcEvent $e) + { + $routeMatch = $e->getRouteMatch(); + if (! $routeMatch) { + /** + * @todo Determine requirements for when route match is missing. + * Potentially allow pulling directly from request metadata? + */ + throw new Exception\DomainException( + 'Missing route matches; unsure how to retrieve action'); + } + + $request = $e->getRequest(); + + // Was an "action" requested? + $action = $routeMatch->getParam('action', false); + if ($action) { + // Handle arbitrary methods, ending in Action + $method = static::getMethodFromAction($action); + if (! method_exists($this, $method)) { + $method = 'notFoundAction'; + } + $return = $this->$method(); + $e->setResult($return); + return $return; + } + + // RESTful methods + $method = strtolower($request->getMethod()); + switch ($method) { + // Custom HTTP methods (or custom overrides for standard methods) + case (isset($this->customHttpMethodsMap[$method])): + $callable = $this->customHttpMethodsMap[$method]; + $action = $method; + $return = call_user_func($callable, $e); + break; + // DELETE + case 'delete': + $id = $this->getIdentifier($routeMatch, $request); + $data = $this->processBodyContent($request); + + if ($id !== false) { + $action = 'delete'; + $return = $this->delete($id); + break; + } + + $action = 'deleteList'; + $return = $this->deleteList($data); + break; + // GET + case 'get': + $id = $this->getIdentifier($routeMatch, $request); + if ($id !== false) { + $action = 'get'; + $return = $this->get($id); + break; + } + $action = 'getList'; + $return = $this->getList(); + break; + // HEAD + case 'head': + $id = $this->getIdentifier($routeMatch, $request); + if ($id === false) { + $id = null; + } + $action = 'head'; + $headResult = $this->head($id); + $response = ($headResult instanceof Response) ? clone $headResult : $e->getResponse(); + $response->setContent(''); + $return = $response; + break; + // OPTIONS + case 'options': + $action = 'options'; + $this->options(); + $return = $e->getResponse(); + break; + // PATCH + case 'patch': + $id = $this->getIdentifier($routeMatch, $request); + $data = $this->processBodyContent($request); + + if ($id !== false) { + $action = 'patch'; + $return = $this->patch($id, $data); + break; + } + + // TODO: This try-catch should be removed in the future, but it + // will create a BC break for pre-2.2.0 apps that expect a 405 + // instead of going to patchList + try { + $action = 'patchList'; + $return = $this->patchList($data); + } catch (Exception\RuntimeException $ex) { + $response = $e->getResponse(); + $response->setStatusCode(405); + return $response; + } + break; + // POST + case 'post': + $action = 'create'; + $return = $this->processPostData($request); + break; + // PUT + case 'put': + $id = $this->getIdentifier($routeMatch, $request); + $data = $this->processBodyContent($request); + + if ($id !== false) { + $action = 'update'; + $return = $this->update($id, $data); + break; + } + + $action = 'replaceList'; + $return = $this->replaceList($data); + break; + // All others... + default: + $response = $e->getResponse(); + $response->setStatusCode(405); + return $response; + } + + $routeMatch->setParam('action', $action); + $e->setResult($return); + return $return; + } + + /** + * Process post data and call create + * + * @param Request $request + * @return mixed + */ + public function processPostData(Request $request) + { + if ($this->requestHasContentType($request, self::CONTENT_TYPE_JSON)) { + $data = Json::decode($request->getContent(), $this->jsonDecodeType); + } else { + $data = $request->getPost()->toArray(); + } + + return $this->create($data); + } + + /** + * Check if request has certain content type + * + * @param Request $request + * @param string|null $contentType + * @return bool + */ + public function requestHasContentType(Request $request, $contentType = '') + { + /** @var $headerContentType \Zend\Http\Header\ContentType */ + $headerContentType = $request->getHeaders()->get('content-type'); + if (!$headerContentType) { + return false; + } + + $requestedContentType = $headerContentType->getFieldValue(); + if (strstr($requestedContentType, ';')) { + $headerData = explode(';', $requestedContentType); + $requestedContentType = array_shift($headerData); + } + $requestedContentType = trim($requestedContentType); + if (array_key_exists($contentType, $this->contentTypes)) { + foreach ($this->contentTypes[$contentType] as $contentTypeValue) { + if (stripos($contentTypeValue, $requestedContentType) === 0) { + return true; + } + } + } + + return false; + } + + /** + * Register a handler for a custom HTTP method + * + * This method allows you to handle arbitrary HTTP method types, mapping + * them to callables. Typically, these will be methods of the controller + * instance: e.g., array($this, 'foobar'). The typical place to register + * these is in your constructor. + * + * Additionally, as this map is checked prior to testing the standard HTTP + * methods, this is a way to override what methods will handle the standard + * HTTP methods. However, if you do this, you will have to retrieve the + * identifier and any request content manually. + * + * Callbacks will be passed the current MvcEvent instance. + * + * To retrieve the identifier, you can use "$id = + * $this->getIdentifier($routeMatch, $request)", + * passing the appropriate objects. + * + * To retrieve the body content data, use "$data = $this->processBodyContent($request)"; + * that method will return a string, array, or, in the case of JSON, an object. + * + * @param string $method + * @param Callable $handler + * @return AbstractRestfulController + */ + public function addHttpMethodHandler($method, /* Callable */ $handler) + { + if (!is_callable($handler)) { + throw new Exception\InvalidArgumentException(sprintf( + 'Invalid HTTP method handler: must be a callable; received "%s"', + (is_object($handler) ? get_class($handler) : gettype($handler)) + )); + } + $method = strtolower($method); + $this->customHttpMethodsMap[$method] = $handler; + return $this; + } + + /** + * Retrieve the identifier, if any + * + * Attempts to see if an identifier was passed in either the URI or the + * query string, returning it if found. Otherwise, returns a boolean false. + * + * @param \Zend\Mvc\Router\RouteMatch $routeMatch + * @param Request $request + * @return false|mixed + */ + protected function getIdentifier($routeMatch, $request) + { + $identifier = $this->getIdentifierName(); + $id = $routeMatch->getParam($identifier, false); + if ($id !== false) { + return $id; + } + + $id = $request->getQuery()->get($identifier, false); + if ($id !== false) { + return $id; + } + + return false; + } + + /** + * Process the raw body content + * + * If the content-type indicates a JSON payload, the payload is immediately + * decoded and the data returned. Otherwise, the data is passed to + * parse_str(). If that function returns a single-member array with a empty + * value, the method assumes that we have non-urlencoded content and + * returns the raw content; otherwise, the array created is returned. + * + * @param mixed $request + * @return object|string|array + */ + protected function processBodyContent($request) + { + $content = $request->getContent(); + + // JSON content? decode and return it. + if ($this->requestHasContentType($request, self::CONTENT_TYPE_JSON)) { + return Json::decode($content, $this->jsonDecodeType); + } + + parse_str($content, $parsedParams); + + // If parse_str fails to decode, or we have a single element with empty value + if (!is_array($parsedParams) || empty($parsedParams) + || (1 == count($parsedParams) && '' === reset($parsedParams)) + ) { + return $content; + } + + return $parsedParams; + } +} diff --git a/vendor/Zend/Mvc/Controller/ControllerManager.php b/vendor/Zend/Mvc/Controller/ControllerManager.php new file mode 100644 index 0000000..8f46494 --- /dev/null +++ b/vendor/Zend/Mvc/Controller/ControllerManager.php @@ -0,0 +1,247 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Controller; + +use Interop\Container\ContainerInterface; +use Zend\EventManager\EventManagerAwareInterface; +use Zend\EventManager\SharedEventManagerInterface; +use Zend\Mvc\Exception; +use Zend\ServiceManager\AbstractPluginManager; +use Zend\ServiceManager\ConfigInterface; +use Zend\ServiceManager\Exception\InvalidServiceException; +use Zend\ServiceManager\ServiceLocatorAwareInterface; +use Zend\Stdlib\DispatchableInterface; + +/** + * Manager for loading controllers + * + * Does not define any controllers by default, but does add a validator. + */ +class ControllerManager extends AbstractPluginManager +{ + /** + * We do not want arbitrary classes instantiated as controllers. + * + * @var bool + */ + protected $autoAddInvokableClass = false; + + /** + * Controllers must be of this type. + * + * @var string + */ + protected $instanceOf = DispatchableInterface::class; + + /** + * Constructor + * + * Injects an initializer for injecting controllers with an + * event manager and plugin manager. + * + * @param ConfigInterface|ContainerInterface $container + * @param array $v3config + */ + public function __construct($configOrContainerInstance, array $v3config = []) + { + $this->addInitializer([$this, 'injectEventManager']); + $this->addInitializer([$this, 'injectConsole']); + $this->addInitializer([$this, 'injectPluginManager']); + parent::__construct($configOrContainerInstance, $v3config); + + // Added after parent construction, as v2 abstract plugin managers add + // one during construction. + $this->addInitializer([$this, 'injectServiceLocator']); + } + + /** + * Validate a plugin (v3) + * + * {@inheritDoc} + */ + public function validate($plugin) + { + if (! $plugin instanceof $this->instanceOf) { + throw new InvalidServiceException(sprintf( + 'Plugin of type "%s" is invalid; must implement %s', + (is_object($plugin) ? get_class($plugin) : gettype($plugin)), + $this->instanceOf + )); + } + } + + /** + * Validate a plugin (v2) + * + * {@inheritDoc} + * + * @throws Exception\InvalidControllerException + */ + public function validatePlugin($plugin) + { + try { + $this->validate($plugin); + } catch (InvalidServiceException $e) { + throw new Exception\InvalidControllerException( + $e->getMessage(), + $e->getCode(), + $e + ); + } + } + + /** + * Initializer: inject EventManager instance + * + * If we have an event manager composed already, make sure it gets injected + * with the shared event manager. + * + * The AbstractController lazy-instantiates an EM instance, which is why + * the shared EM injection needs to happen; the conditional will always + * pass. + * + * @param ContainerInterface|DispatchableInterface $first Container when + * using zend-servicemanager v3; controller under v2. + * @param DispatchableInterface|ContainerInterface $second Controller when + * using zend-servicemanager v3; container under v2. + */ + public function injectEventManager($first, $second) + { + if ($first instanceof ContainerInterface) { + $container = $first; + $controller = $second; + } else { + $container = $second; + $controller = $first; + } + + if (! $controller instanceof EventManagerAwareInterface) { + return; + } + + $events = $controller->getEventManager(); + if (! $events || ! $events->getSharedManager() instanceof SharedEventManagerInterface) { + // For v2, we need to pull the parent service locator + if (! method_exists($container, 'configure')) { + $container = $container->getServiceLocator() ?: $container; + } + + $controller->setEventManager($container->get('EventManager')); + } + } + + /** + * Initializer: inject Console adapter instance + * + * @param ContainerInterface|DispatchableInterface $first Container when + * using zend-servicemanager v3; controller under v2. + * @param DispatchableInterface|ContainerInterface $second Controller when + * using zend-servicemanager v3; container under v2. + */ + public function injectConsole($first, $second) + { + if ($first instanceof ContainerInterface) { + $container = $first; + $controller = $second; + } else { + $container = $second; + $controller = $first; + } + + if (! $controller instanceof AbstractConsoleController) { + return; + } + + // For v2, we need to pull the parent service locator + if (! method_exists($container, 'configure')) { + $container = $container->getServiceLocator() ?: $container; + } + + $controller->setConsole($container->get('Console')); + } + + /** + * Initializer: inject plugin manager + * + * @param ContainerInterface|DispatchableInterface $first Container when + * using zend-servicemanager v3; controller under v2. + * @param DispatchableInterface|ContainerInterface $second Controller when + * using zend-servicemanager v3; container under v2. + */ + public function injectPluginManager($first, $second) + { + if ($first instanceof ContainerInterface) { + $container = $first; + $controller = $second; + } else { + $container = $second; + $controller = $first; + } + + if (! method_exists($controller, 'setPluginManager')) { + return; + } + + // For v2, we need to pull the parent service locator + if (! method_exists($container, 'configure')) { + $container = $container->getServiceLocator() ?: $container; + } + + $controller->setPluginManager($container->get('ControllerPluginManager')); + } + + /** + * Initializer: inject service locator + * + * @param ContainerInterface|DispatchableInterface $first Container when + * using zend-servicemanager v3; controller under v2. + * @param DispatchableInterface|ContainerInterface $second Controller when + * using zend-servicemanager v3; container under v2. + */ + public function injectServiceLocator($first, $second) + { + if ($first instanceof ContainerInterface) { + $container = $first; + $controller = $second; + } else { + $container = $second; + $controller = $first; + } + + // For v2, we need to pull the parent service locator + if (! method_exists($container, 'configure')) { + $container = $container->getServiceLocator() ?: $container; + } + + // Inject AbstractController extensions that are not ServiceLocatorAware + // with the service manager, but do not emit a deprecation notice. We'll + // emit it from AbstractController::getServiceLocator() instead. + if (! $controller instanceof ServiceLocatorAwareInterface + && $controller instanceof AbstractController + && method_exists($controller, 'setServiceLocator') + ) { + // Do not emit deprecation notice in this case + $controller->setServiceLocator($container); + } + + // If a controller implements ServiceLocatorAwareInterface explicitly, we + // inject, but emit a deprecation notice. Since AbstractController no longer + // explicitly does this, this will only affect userland controllers. + if ($controller instanceof ServiceLocatorAwareInterface) { + trigger_error(sprintf( + 'ServiceLocatorAwareInterface is deprecated and will be removed in version 3.0, along ' + . 'with the ServiceLocatorAwareInitializer. Please update your class %s to remove ' + . 'the implementation, and start injecting your dependencies via factory instead.', + get_class($controller) + ), E_USER_DEPRECATED); + $controller->setServiceLocator($container); + } + } +} diff --git a/vendor/Zend/Mvc/Controller/Plugin/AbstractPlugin.php b/vendor/Zend/Mvc/Controller/Plugin/AbstractPlugin.php new file mode 100644 index 0000000..7f74dfb --- /dev/null +++ b/vendor/Zend/Mvc/Controller/Plugin/AbstractPlugin.php @@ -0,0 +1,41 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Controller\Plugin; + +use Zend\Stdlib\DispatchableInterface as Dispatchable; + +abstract class AbstractPlugin implements PluginInterface +{ + /** + * @var null|Dispatchable + */ + protected $controller; + + /** + * Set the current controller instance + * + * @param Dispatchable $controller + * @return void + */ + public function setController(Dispatchable $controller) + { + $this->controller = $controller; + } + + /** + * Get the current controller instance + * + * @return null|Dispatchable + */ + public function getController() + { + return $this->controller; + } +} diff --git a/vendor/Zend/Mvc/Controller/Plugin/AcceptableViewModelSelector.php b/vendor/Zend/Mvc/Controller/Plugin/AcceptableViewModelSelector.php new file mode 100644 index 0000000..2049d8f --- /dev/null +++ b/vendor/Zend/Mvc/Controller/Plugin/AcceptableViewModelSelector.php @@ -0,0 +1,280 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Controller\Plugin; + +use Zend\Http\Header\Accept\FieldValuePart\AbstractFieldValuePart; +use Zend\Http\Request; +use Zend\Mvc\InjectApplicationEventInterface; +use Zend\Mvc\MvcEvent; +use Zend\Mvc\Exception\DomainException; +use Zend\Mvc\Exception\InvalidArgumentException; +use Zend\View\Model\ModelInterface; + +/** + * Controller Plugin to assist in selecting an appropriate View Model type based on the + * User Agent's accept header. + */ +class AcceptableViewModelSelector extends AbstractPlugin +{ + /** + * + * @var string the Key to inject the name of a viewmodel with in an Accept Header + */ + const INJECT_VIEWMODEL_NAME = '_internalViewModel'; + + /** + * + * @var \Zend\Mvc\MvcEvent + */ + protected $event; + + /** + * + * @var \Zend\Http\Request + */ + protected $request; + + /** + * Default array to match against. + * + * @var Array + */ + protected $defaultMatchAgainst; + + /** + * + * @var string Default ViewModel + */ + protected $defaultViewModelName = 'Zend\View\Model\ViewModel'; + + /** + * Detects an appropriate viewmodel for request. + * + * @param array $matchAgainst (optional) The Array to match against + * @param bool $returnDefault (optional) If no match is available. Return default instead + * @param AbstractFieldValuePart|null $resultReference (optional) The object that was matched + * @throws InvalidArgumentException If the supplied and matched View Model could not be found + * @return ModelInterface|null + */ + public function __invoke( + array $matchAgainst = null, + $returnDefault = true, + & $resultReference = null + ) { + return $this->getViewModel($matchAgainst, $returnDefault, $resultReference); + } + + /** + * Detects an appropriate viewmodel for request. + * + * @param array $matchAgainst (optional) The Array to match against + * @param bool $returnDefault (optional) If no match is available. Return default instead + * @param AbstractFieldValuePart|null $resultReference (optional) The object that was matched + * @throws InvalidArgumentException If the supplied and matched View Model could not be found + * @return ModelInterface|null + */ + public function getViewModel( + array $matchAgainst = null, + $returnDefault = true, + & $resultReference = null + ) { + $name = $this->getViewModelName($matchAgainst, $returnDefault, $resultReference); + + if (!$name) { + return; + } + + if (!class_exists($name)) { + throw new InvalidArgumentException('The supplied View Model could not be found'); + } + + return new $name(); + } + + /** + * Detects an appropriate viewmodel name for request. + * + * @param array $matchAgainst (optional) The Array to match against + * @param bool $returnDefault (optional) If no match is available. Return default instead + * @param AbstractFieldValuePart|null $resultReference (optional) The object that was matched. + * @return ModelInterface|null Returns null if $returnDefault = false and no match could be made + */ + public function getViewModelName( + array $matchAgainst = null, + $returnDefault = true, + & $resultReference = null + ) { + $res = $this->match($matchAgainst); + if ($res) { + $resultReference = $res; + return $this->extractViewModelName($res); + } + + if ($returnDefault) { + return $this->defaultViewModelName; + } + } + + /** + * Detects an appropriate viewmodel name for request. + * + * @param array $matchAgainst (optional) The Array to match against + * @return AbstractFieldValuePart|null The object that was matched + */ + public function match(array $matchAgainst = null) + { + $request = $this->getRequest(); + $headers = $request->getHeaders(); + + if ((!$matchAgainst && !$this->defaultMatchAgainst) || !$headers->has('accept')) { + return; + } + + if (!$matchAgainst) { + $matchAgainst = $this->defaultMatchAgainst; + } + + $matchAgainstString = ''; + foreach ($matchAgainst as $modelName => $modelStrings) { + foreach ((array) $modelStrings as $modelString) { + $matchAgainstString .= $this->injectViewModelName($modelString, $modelName); + } + } + + /** @var $accept \Zend\Http\Header\Accept */ + $accept = $headers->get('Accept'); + if (($res = $accept->match($matchAgainstString)) === false) { + return; + } + + return $res; + } + + /** + * Set the default View Model (name) to return if no match could be made + * @param string $defaultViewModelName The default View Model name + * @return AcceptableViewModelSelector provides fluent interface + */ + public function setDefaultViewModelName($defaultViewModelName) + { + $this->defaultViewModelName = (string) $defaultViewModelName; + return $this; + } + + /** + * Set the default View Model (name) to return if no match could be made + * @return string + */ + public function getDefaultViewModelName() + { + return $this->defaultViewModelName; + } + + /** + * Set the default Accept Types and View Model combinations to match against if none are specified. + * + * @param array $matchAgainst (optional) The Array to match against + * @return AcceptableViewModelSelector provides fluent interface + */ + public function setDefaultMatchAgainst(array $matchAgainst = null) + { + $this->defaultMatchAgainst = $matchAgainst; + return $this; + } + + /** + * Get the default Accept Types and View Model combinations to match against if none are specified. + * + * @return array|null + */ + public function getDefaultMatchAgainst() + { + return $this->defaultMatchAgainst; + } + + /** + * Inject the viewmodel name into the accept header string + * + * @param string $modelAcceptString + * @param string $modelName + * @return string + */ + protected function injectViewModelName($modelAcceptString, $modelName) + { + $modelName = str_replace('\\', '|', $modelName); + return $modelAcceptString . '; ' . self::INJECT_VIEWMODEL_NAME . '="' . $modelName . '", '; + } + + /** + * Extract the viewmodel name from a match + * @param AbstractFieldValuePart $res + * @return string + */ + protected function extractViewModelName(AbstractFieldValuePart $res) + { + $modelName = $res->getMatchedAgainst()->params[self::INJECT_VIEWMODEL_NAME]; + return str_replace('|', '\\', $modelName); + } + + /** + * Get the request + * + * @return Request + * @throws DomainException if unable to find request + */ + protected function getRequest() + { + if ($this->request) { + return $this->request; + } + + $event = $this->getEvent(); + $request = $event->getRequest(); + if (!$request instanceof Request) { + throw new DomainException( + 'The event used does not contain a valid Request, but must.' + ); + } + + $this->request = $request; + return $request; + } + + /** + * Get the event + * + * @return MvcEvent + * @throws DomainException if unable to find event + */ + protected function getEvent() + { + if ($this->event) { + return $this->event; + } + + $controller = $this->getController(); + if (!$controller instanceof InjectApplicationEventInterface) { + throw new DomainException( + 'A controller that implements InjectApplicationEventInterface ' + . 'is required to use ' . __CLASS__ + ); + } + + $event = $controller->getEvent(); + if (!$event instanceof MvcEvent) { + $params = $event->getParams(); + $event = new MvcEvent(); + $event->setParams($params); + } + $this->event = $event; + + return $this->event; + } +} diff --git a/vendor/Zend/Mvc/Controller/Plugin/CreateConsoleNotFoundModel.php b/vendor/Zend/Mvc/Controller/Plugin/CreateConsoleNotFoundModel.php new file mode 100644 index 0000000..9cc02a2 --- /dev/null +++ b/vendor/Zend/Mvc/Controller/Plugin/CreateConsoleNotFoundModel.php @@ -0,0 +1,30 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Controller\Plugin; + +use Zend\View\Model\ConsoleModel; + +class CreateConsoleNotFoundModel extends AbstractPlugin +{ + /** + * Create a console view model representing a "not found" action + * + * @return ConsoleModel + */ + public function __invoke() + { + $viewModel = new ConsoleModel(); + + $viewModel->setErrorLevel(1); + $viewModel->setResult('Page not found'); + + return $viewModel; + } +} diff --git a/vendor/Zend/Mvc/Controller/Plugin/CreateHttpNotFoundModel.php b/vendor/Zend/Mvc/Controller/Plugin/CreateHttpNotFoundModel.php new file mode 100644 index 0000000..83d7d21 --- /dev/null +++ b/vendor/Zend/Mvc/Controller/Plugin/CreateHttpNotFoundModel.php @@ -0,0 +1,30 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Controller\Plugin; + +use Zend\Http\Response; +use Zend\View\Model\ViewModel; + +class CreateHttpNotFoundModel extends AbstractPlugin +{ + /** + * Create an HTTP view model representing a "not found" page + * + * @param Response $response + * + * @return ViewModel + */ + public function __invoke(Response $response) + { + $response->setStatusCode(404); + + return new ViewModel(['content' => 'Page not found']); + } +} diff --git a/vendor/Zend/Mvc/Controller/Plugin/FilePostRedirectGet.php b/vendor/Zend/Mvc/Controller/Plugin/FilePostRedirectGet.php new file mode 100644 index 0000000..17e578f --- /dev/null +++ b/vendor/Zend/Mvc/Controller/Plugin/FilePostRedirectGet.php @@ -0,0 +1,340 @@ +<?php + +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Controller\Plugin; + +use Zend\Filter\FilterChain; +use Zend\Form\FormInterface; +use Zend\Http\Response; +use Zend\InputFilter\FileInput; +use Zend\InputFilter\InputFilterInterface; +use Zend\Mvc\Exception\RuntimeException; +use Zend\Session\Container; +use Zend\Stdlib\ArrayUtils; +use Zend\Validator\ValidatorChain; + +/** + * Plugin to help facilitate Post/Redirect/Get for file upload forms + * (http://en.wikipedia.org/wiki/Post/Redirect/Get) + * + * Requires that the Form's File inputs contain a 'fileRenameUpload' filter + * with the target option set: 'target' => /valid/target/path'. + * This is so the files are moved to a new location between requests. + * If this filter is not added, the temporary upload files will disappear + * between requests. + */ +class FilePostRedirectGet extends AbstractPlugin +{ + /** + * @var Container + */ + protected $sessionContainer; + + /** + * @param FormInterface $form + * @param string $redirect Route or URL string (default: current route) + * @param bool $redirectToUrl Use $redirect as a URL string (default: false) + * @return bool|array|Response + */ + public function __invoke(FormInterface $form, $redirect = null, $redirectToUrl = false) + { + $request = $this->getController()->getRequest(); + if ($request->isPost()) { + return $this->handlePostRequest($form, $redirect, $redirectToUrl); + } else { + return $this->handleGetRequest($form); + } + } + + /** + * @param FormInterface $form + * @param string $redirect Route or URL string (default: current route) + * @param bool $redirectToUrl Use $redirect as a URL string (default: false) + * @return Response + */ + protected function handlePostRequest(FormInterface $form, $redirect, $redirectToUrl) + { + $container = $this->getSessionContainer(); + $request = $this->getController()->getRequest(); + $postFiles = $request->getFiles()->toArray(); + $postOther = $request->getPost()->toArray(); + $post = ArrayUtils::merge($postOther, $postFiles, true); + + // Fill form with the data first, collections may alter the form/filter structure + $form->setData($post); + + // Change required flag to false for any previously uploaded files + $inputFilter = $form->getInputFilter(); + $previousFiles = ($container->files) ?: []; + $this->traverseInputs( + $inputFilter, + $previousFiles, + function ($input, $value) { + if ($input instanceof FileInput) { + $input->setRequired(false); + } + return $value; + } + ); + + // Run the form validations/filters and retrieve any errors + $isValid = $form->isValid(); + $data = $form->getData(FormInterface::VALUES_AS_ARRAY); + $errors = (!$isValid) ? $form->getMessages() : null; + + // Merge and replace previous files with new valid files + $prevFileData = $this->getEmptyUploadData($inputFilter, $previousFiles); + $newFileData = $this->getNonEmptyUploadData($inputFilter, $data); + $postFiles = ArrayUtils::merge( + $prevFileData ?: [], + $newFileData ?: [], + true + ); + $post = ArrayUtils::merge($postOther, $postFiles, true); + + // Save form data in session + $container->setExpirationHops(1, ['post', 'errors', 'isValid']); + $container->post = $post; + $container->errors = $errors; + $container->isValid = $isValid; + $container->files = $postFiles; + + return $this->redirect($redirect, $redirectToUrl); + } + + /** + * @param FormInterface $form + * @return bool|array + */ + protected function handleGetRequest(FormInterface $form) + { + $container = $this->getSessionContainer(); + if (null === $container->post) { + // No previous post, bail early + unset($container->files); + return false; + } + + // Collect data from session + $post = $container->post; + $errors = $container->errors; + $isValid = $container->isValid; + unset($container->post); + unset($container->errors); + unset($container->isValid); + + // Fill form with the data first, collections may alter the form/filter structure + $form->setData($post); + + // Remove File Input validators and filters on previously uploaded files + // in case $form->isValid() or $form->bindValues() is run + $inputFilter = $form->getInputFilter(); + $this->traverseInputs( + $inputFilter, + $post, + function ($input, $value) { + if ($input instanceof FileInput) { + $input->setAutoPrependUploadValidator(false) + ->setValidatorChain(new ValidatorChain()) + ->setFilterChain(new FilterChain); + } + return $value; + } + ); + + // set previous state + $form->isValid(); // re-validate to bind values + if (null !== $errors) { + $form->setMessages($errors); // overwrite messages + } + $this->setProtectedFormProperty($form, 'isValid', $isValid); // force previous state + + // Clear previous files from session data if form was valid + if ($isValid) { + unset($container->files); + } + + return $post; + } + + /** + * @return Container + */ + public function getSessionContainer() + { + if (!$this->sessionContainer) { + $this->sessionContainer = new Container('file_prg_post1'); + } + return $this->sessionContainer; + } + + /** + * @param Container $container + * @return FilePostRedirectGet + */ + public function setSessionContainer(Container $container) + { + $this->sessionContainer = $container; + return $this; + } + + /** + * @param FormInterface $form + * @param string $property + * @param mixed $value + * @return FilePostRedirectGet + */ + protected function setProtectedFormProperty(FormInterface $form, $property, $value) + { + $formClass = new \ReflectionClass($form); + $property = $formClass->getProperty($property); + $property->setAccessible(true); + $property->setValue($form, $value); + return $this; + } + + /** + * Traverse the InputFilter and run a callback against each Input and associated value + * + * @param InputFilterInterface $inputFilter + * @param array $values + * @param callable $callback + * @return array|null + */ + protected function traverseInputs(InputFilterInterface $inputFilter, $values, $callback) + { + $returnValues = null; + foreach ($values as $name => $value) { + if (!$inputFilter->has($name)) { + continue; + } + + $input = $inputFilter->get($name); + if ($input instanceof InputFilterInterface && is_array($value)) { + $retVal = $this->traverseInputs($input, $value, $callback); + if (null !== $retVal) { + $returnValues[$name] = $retVal; + } + continue; + } + + $retVal = $callback($input, $value); + if (null !== $retVal) { + $returnValues[$name] = $retVal; + } + } + return $returnValues; + } + + /** + * Traverse the InputFilter and only return the data of FileInputs that have an upload + * + * @param InputFilterInterface $inputFilter + * @param array $data + * @return array + */ + protected function getNonEmptyUploadData(InputFilterInterface $inputFilter, $data) + { + return $this->traverseInputs( + $inputFilter, + $data, + function ($input, $value) { + $messages = $input->getMessages(); + if (is_array($value) && $input instanceof FileInput && empty($messages)) { + $rawValue = $input->getRawValue(); + if ( + (isset($rawValue['error']) && $rawValue['error'] !== UPLOAD_ERR_NO_FILE) + || (isset($rawValue[0]['error']) && $rawValue[0]['error'] !== UPLOAD_ERR_NO_FILE) + ) { + return $value; + } + } + return; + } + ); + } + + /** + * Traverse the InputFilter and only return the data of FileInputs that are empty + * + * @param InputFilterInterface $inputFilter + * @param array $data + * @return array + */ + protected function getEmptyUploadData(InputFilterInterface $inputFilter, $data) + { + return $this->traverseInputs( + $inputFilter, + $data, + function ($input, $value) { + $messages = $input->getMessages(); + if (is_array($value) && $input instanceof FileInput && empty($messages)) { + $rawValue = $input->getRawValue(); + if ((isset($rawValue['error']) && $rawValue['error'] === UPLOAD_ERR_NO_FILE) + || (isset($rawValue[0]['error']) && $rawValue[0]['error'] === UPLOAD_ERR_NO_FILE) + ) { + return $value; + } + } + return; + } + ); + } + + /** + * TODO: Good candidate for traits method in PHP 5.4 with PostRedirectGet plugin + * + * @param string $redirect + * @param bool $redirectToUrl + * @return Response + * @throws \Zend\Mvc\Exception\RuntimeException + */ + protected function redirect($redirect, $redirectToUrl) + { + $controller = $this->getController(); + $params = []; + $options = []; + $reuseMatchedParams = false; + + if (null === $redirect) { + $routeMatch = $controller->getEvent()->getRouteMatch(); + + $redirect = $routeMatch->getMatchedRouteName(); + //null indicates to redirect for self. + $reuseMatchedParams = true; + } + + if (method_exists($controller, 'getPluginManager')) { + // get the redirect plugin from the plugin manager + $redirector = $controller->getPluginManager()->get('Redirect'); + } else { + /* + * If the user wants to redirect to a route, the redirector has to come + * from the plugin manager -- otherwise no router will be injected + */ + if ($redirectToUrl === false) { + throw new RuntimeException('Could not redirect to a route without a router'); + } + + $redirector = new Redirect(); + } + + if ($redirectToUrl === false) { + $response = $redirector->toRoute($redirect, $params, $options, $reuseMatchedParams); + $response->setStatusCode(303); + return $response; + } + + $response = $redirector->toUrl($redirect); + $response->setStatusCode(303); + + return $response; + } +} diff --git a/vendor/Zend/Mvc/Controller/Plugin/FlashMessenger.php b/vendor/Zend/Mvc/Controller/Plugin/FlashMessenger.php new file mode 100644 index 0000000..c2866ae --- /dev/null +++ b/vendor/Zend/Mvc/Controller/Plugin/FlashMessenger.php @@ -0,0 +1,663 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Controller\Plugin; + +use ArrayIterator; +use Countable; +use IteratorAggregate; +use Zend\Session\Container; +use Zend\Session\ManagerInterface as Manager; +use Zend\Stdlib\SplQueue; + +/** + * Flash Messenger - implement session-based messages + */ +class FlashMessenger extends AbstractPlugin implements IteratorAggregate, Countable +{ + /** + * Default messages namespace + */ + const NAMESPACE_DEFAULT = 'default'; + + /** + * Success messages namespace + */ + const NAMESPACE_SUCCESS = 'success'; + + /** + * Warning messages namespace + */ + const NAMESPACE_WARNING = 'warning'; + + /** + * Error messages namespace + */ + const NAMESPACE_ERROR = 'error'; + + /** + * Info messages namespace + */ + const NAMESPACE_INFO = 'info'; + + /** + * @var Container + */ + protected $container; + + /** + * Messages from previous request + * @var array + */ + protected $messages = []; + + /** + * @var Manager + */ + protected $session; + + /** + * Whether a message has been added during this request + * + * @var bool + */ + protected $messageAdded = false; + + /** + * Instance namespace, default is 'default' + * + * @var string + */ + protected $namespace = self::NAMESPACE_DEFAULT; + + /** + * Set the session manager + * + * @param Manager $manager + * @return FlashMessenger + */ + public function setSessionManager(Manager $manager) + { + $this->session = $manager; + + return $this; + } + + /** + * Retrieve the session manager + * + * If none composed, lazy-loads a SessionManager instance + * + * @return Manager + */ + public function getSessionManager() + { + if (!$this->session instanceof Manager) { + $this->setSessionManager(Container::getDefaultManager()); + } + + return $this->session; + } + + /** + * Get session container for flash messages + * + * @return Container + */ + public function getContainer() + { + if ($this->container instanceof Container) { + return $this->container; + } + + $manager = $this->getSessionManager(); + $this->container = new Container('FlashMessenger', $manager); + + return $this->container; + } + + /** + * Change the namespace messages are added to + * + * Useful for per action controller messaging between requests + * + * @param string $namespace + * @return FlashMessenger Provides a fluent interface + */ + public function setNamespace($namespace = 'default') + { + $this->namespace = $namespace; + + return $this; + } + + /** + * Get the message namespace + * + * @return string + */ + public function getNamespace() + { + return $this->namespace; + } + + /** + * Add a message + * + * @param string $message + * @param null|string $namespace + * @param null|int $hops + * @return FlashMessenger Provides a fluent interface + */ + public function addMessage($message, $namespace = null, $hops = 1) + { + $container = $this->getContainer(); + + if (null === $namespace) { + $namespace = $this->getNamespace(); + } + + if (! $this->messageAdded) { + $this->getMessagesFromContainer(); + $container->setExpirationHops($hops, null); + } + + if (! isset($container->{$namespace}) + || ! $container->{$namespace} instanceof SplQueue + ) { + $container->{$namespace} = new SplQueue(); + } + + $container->{$namespace}->push($message); + + $this->messageAdded = true; + + return $this; + } + + /** + * Add a message with "info" type + * + * @param string $message + * @return FlashMessenger + */ + public function addInfoMessage($message) + { + $this->addMessage($message, self::NAMESPACE_INFO); + + return $this; + } + + /** + * Add a message with "success" type + * + * @param string $message + * @return FlashMessenger + */ + public function addSuccessMessage($message) + { + $this->addMessage($message, self::NAMESPACE_SUCCESS); + + return $this; + } + + /** + * Add a message with "warning" type + * + * @param string $message + * @return FlashMessenger + */ + public function addWarningMessage($message) + { + $this->addMessage($message, self::NAMESPACE_WARNING); + + return $this; + } + + /** + * Add a message with "error" type + * + * @param string $message + * @return FlashMessenger + */ + public function addErrorMessage($message) + { + $this->addMessage($message, self::NAMESPACE_ERROR); + + return $this; + } + + /** + * Whether a specific namespace has messages + * + * @param string $namespace + * @return bool + */ + public function hasMessages($namespace = null) + { + if (null === $namespace) { + $namespace = $this->getNamespace(); + } + + $this->getMessagesFromContainer(); + + return isset($this->messages[$namespace]); + } + + /** + * Whether "info" namespace has messages + * + * @return bool + */ + public function hasInfoMessages() + { + return $this->hasMessages(self::NAMESPACE_INFO); + } + + /** + * Whether "success" namespace has messages + * + * @return bool + */ + public function hasSuccessMessages() + { + return $this->hasMessages(self::NAMESPACE_SUCCESS); + } + + /** + * Whether "warning" namespace has messages + * + * @return bool + */ + public function hasWarningMessages() + { + return $this->hasMessages(self::NAMESPACE_WARNING); + } + + /** + * Whether "error" namespace has messages + * + * @return bool + */ + public function hasErrorMessages() + { + return $this->hasMessages(self::NAMESPACE_ERROR); + } + + /** + * Get messages from a specific namespace + * + * @param string $namespace + * @return array + */ + public function getMessages($namespace = null) + { + if (null === $namespace) { + $namespace = $this->getNamespace(); + } + + if ($this->hasMessages($namespace)) { + return $this->messages[$namespace]->toArray(); + } + + return []; + } + + /** + * Get messages from "info" namespace + * + * @return array + */ + public function getInfoMessages() + { + return $this->getMessages(self::NAMESPACE_INFO); + } + + /** + * Get messages from "success" namespace + * + * @return array + */ + public function getSuccessMessages() + { + return $this->getMessages(self::NAMESPACE_SUCCESS); + } + + /** + * Get messages from "warning" namespace + * + * @return array + */ + public function getWarningMessages() + { + return $this->getMessages(self::NAMESPACE_WARNING); + } + + /** + * Get messages from "error" namespace + * + * @return array + */ + public function getErrorMessages() + { + return $this->getMessages(self::NAMESPACE_ERROR); + } + + /** + * Clear all messages from the previous request & current namespace + * + * @param string $namespace + * @return bool True if messages were cleared, false if none existed + */ + public function clearMessages($namespace = null) + { + if (null === $namespace) { + $namespace = $this->getNamespace(); + } + + if ($this->hasMessages($namespace)) { + unset($this->messages[$namespace]); + + return true; + } + + return false; + } + + /** + * Clear all messages from specific namespace + * + * @param string $namespaceToClear + * @return bool True if messages were cleared, false if none existed + */ + public function clearMessagesFromNamespace($namespaceToClear) + { + return $this->clearMessages($namespaceToClear); + } + + /** + * Clear all messages from the container + * + * @return bool True if messages were cleared, false if none existed + */ + public function clearMessagesFromContainer() + { + $this->getMessagesFromContainer(); + if (empty($this->messages)) { + return false; + } + unset($this->messages); + $this->messages = []; + + return true; + } + + /** + * Check to see if messages have been added to the current + * namespace within this request + * + * @param string $namespace + * @return bool + */ + public function hasCurrentMessages($namespace = null) + { + $container = $this->getContainer(); + if (null === $namespace) { + $namespace = $this->getNamespace(); + } + + return isset($container->{$namespace}); + } + + /** + * Check to see if messages have been added to "info" + * namespace within this request + * + * @return bool + */ + public function hasCurrentInfoMessages() + { + return $this->hasCurrentMessages(self::NAMESPACE_INFO); + } + + /** + * Check to see if messages have been added to "success" + * namespace within this request + * + * @return bool + */ + public function hasCurrentSuccessMessages() + { + return $this->hasCurrentMessages(self::NAMESPACE_SUCCESS); + } + + /** + * Check to see if messages have been added to "warning" + * namespace within this request + * + * @return bool + */ + public function hasCurrentWarningMessages() + { + return $this->hasCurrentMessages(self::NAMESPACE_WARNING); + } + + /** + * Check to see if messages have been added to "error" + * namespace within this request + * + * @return bool + */ + public function hasCurrentErrorMessages() + { + return $this->hasCurrentMessages(self::NAMESPACE_ERROR); + } + + /** + * Get messages that have been added to the current + * namespace within this request + * + * @param string $namespace + * @return array + */ + public function getCurrentMessages($namespace = null) + { + if (null === $namespace) { + $namespace = $this->getNamespace(); + } + + if ($this->hasCurrentMessages($namespace)) { + $container = $this->getContainer(); + + return $container->{$namespace}->toArray(); + } + + return []; + } + + /** + * Get messages that have been added to the "info" + * namespace within this request + * + * @return array + */ + public function getCurrentInfoMessages() + { + return $this->getCurrentMessages(self::NAMESPACE_INFO); + } + + /** + * Get messages that have been added to the "success" + * namespace within this request + * + * @return array + */ + public function getCurrentSuccessMessages() + { + return $this->getCurrentMessages(self::NAMESPACE_SUCCESS); + } + + /** + * Get messages that have been added to the "warning" + * namespace within this request + * + * @return array + */ + public function getCurrentWarningMessages() + { + return $this->getCurrentMessages(self::NAMESPACE_WARNING); + } + + /** + * Get messages that have been added to the "error" + * namespace within this request + * + * @return array + */ + public function getCurrentErrorMessages() + { + return $this->getCurrentMessages(self::NAMESPACE_ERROR); + } + + /** + * Get messages that have been added to the current + * namespace in specific namespace + * + * @param string $namespaceToGet + * @return array + */ + public function getCurrentMessagesFromNamespace($namespaceToGet) + { + return $this->getCurrentMessages($namespaceToGet); + } + + /** + * Clear messages from the current request and current namespace + * + * @param string $namespace + * @return bool True if current messages were cleared, false if none existed. + */ + public function clearCurrentMessages($namespace = null) + { + if (null === $namespace) { + $namespace = $this->getNamespace(); + } + + if ($this->hasCurrentMessages($namespace)) { + $container = $this->getContainer(); + unset($container->{$namespace}); + + return true; + } + + return false; + } + + /** + * Clear messages from the current namespace + * + * @param string $namespaceToClear + * @return bool True if current messages were cleared from the given namespace, false if none existed. + */ + public function clearCurrentMessagesFromNamespace($namespaceToClear) + { + return $this->clearCurrentMessages($namespaceToClear); + } + + /** + * Clear messages from the container + * + * @return bool True if current messages were cleared from the container, false if none existed. + */ + public function clearCurrentMessagesFromContainer() + { + $container = $this->getContainer(); + + $namespaces = []; + foreach ($container as $namespace => $messages) { + $namespaces[] = $namespace; + } + + if (empty($namespaces)) { + return false; + } + + foreach ($namespaces as $namespace) { + unset($container->{$namespace}); + } + + return true; + } + + /** + * Complete the IteratorAggregate interface, for iterating + * + * @return ArrayIterator + */ + public function getIterator() + { + if ($this->hasMessages()) { + return new ArrayIterator($this->getMessages()); + } + + return new ArrayIterator(); + } + + /** + * Complete the countable interface + * + * @return int + */ + public function count() + { + if ($this->hasMessages()) { + return count($this->getMessages()); + } + + return 0; + } + + /** + * Get messages from a specific namespace + * + * @param string $namespaceToGet + * @return array + */ + public function getMessagesFromNamespace($namespaceToGet) + { + return $this->getMessages($namespaceToGet); + } + + /** + * Pull messages from the session container + * + * Iterates through the session container, removing messages into the local + * scope. + * + * @return void + */ + protected function getMessagesFromContainer() + { + if (!empty($this->messages) || $this->messageAdded) { + return; + } + + $container = $this->getContainer(); + + $namespaces = []; + foreach ($container as $namespace => $messages) { + $this->messages[$namespace] = $messages; + $namespaces[] = $namespace; + } + + foreach ($namespaces as $namespace) { + unset($container->{$namespace}); + } + } +} diff --git a/vendor/Zend/Mvc/Controller/Plugin/Forward.php b/vendor/Zend/Mvc/Controller/Plugin/Forward.php new file mode 100644 index 0000000..41239b9 --- /dev/null +++ b/vendor/Zend/Mvc/Controller/Plugin/Forward.php @@ -0,0 +1,326 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Controller\Plugin; + +use Zend\EventManager\SharedEventManagerInterface as SharedEvents; +use Zend\Mvc\Controller\ControllerManager; +use Zend\Mvc\Exception; +use Zend\Mvc\InjectApplicationEventInterface; +use Zend\Mvc\MvcEvent; +use Zend\Mvc\Router\RouteMatch; +use Zend\Stdlib\CallbackHandler; + +class Forward extends AbstractPlugin +{ + /** + * @var ControllerManager + */ + protected $controllers; + + /** + * @var MvcEvent + */ + protected $event; + + /** + * @var int + */ + protected $maxNestedForwards = 10; + + /** + * @var int + */ + protected $numNestedForwards = 0; + + /** + * @var array[]|null + */ + protected $listenersToDetach = null; + + /** + * @param ControllerManager $controllers + */ + public function __construct(ControllerManager $controllers) + { + $this->controllers = $controllers; + } + + /** + * Set maximum number of nested forwards allowed + * + * @param int $maxNestedForwards + * @return self + */ + public function setMaxNestedForwards($maxNestedForwards) + { + $this->maxNestedForwards = (int) $maxNestedForwards; + + return $this; + } + + /** + * Get information on listeners that need to be detached before dispatching. + * + * Each entry in the array contains three keys: + * + * id (identifier for event-emitting component), + * event (the hooked event) + * and class (the class of listener that should be detached). + * + * @return array + */ + public function getListenersToDetach() + { + // If a blacklist has not been explicitly set, return the default: + if (null === $this->listenersToDetach) { + // We need to detach the InjectViewModelListener to prevent templates + // from getting attached to the ViewModel twice when a calling action + // returns the output generated by a forwarded action. + $this->listenersToDetach = [[ + 'id' => 'Zend\Stdlib\DispatchableInterface', + 'event' => MvcEvent::EVENT_DISPATCH, + 'class' => 'Zend\Mvc\View\Http\InjectViewModelListener', + ]]; + } + return $this->listenersToDetach; + } + + /** + * Set information on listeners that need to be detached before dispatching. + * + * @param array $listeners Listener information; see getListenersToDetach() for details on format. + * + * @return self + */ + public function setListenersToDetach($listeners) + { + $this->listenersToDetach = $listeners; + + return $this; + } + + /** + * Dispatch another controller + * + * @param string $name Controller name; either a class name or an alias used in the controller manager + * @param null|array $params Parameters with which to seed a custom RouteMatch object for the new controller + * @return mixed + * @throws Exception\DomainException if composed controller does not define InjectApplicationEventInterface + * or Locator aware; or if the discovered controller is not dispatchable + */ + public function dispatch($name, array $params = null) + { + $event = clone($this->getEvent()); + + $controller = $this->controllers->get($name); + if ($controller instanceof InjectApplicationEventInterface) { + $controller->setEvent($event); + } + + // Allow passing parameters to seed the RouteMatch with & copy matched route name + if ($params !== null) { + $routeMatch = new RouteMatch($params); + $routeMatch->setMatchedRouteName($event->getRouteMatch()->getMatchedRouteName()); + $event->setRouteMatch($routeMatch); + } + + if ($this->numNestedForwards > $this->maxNestedForwards) { + throw new Exception\DomainException("Circular forwarding detected: greater than $this->maxNestedForwards nested forwards"); + } + $this->numNestedForwards++; + + // Detach listeners that may cause problems during dispatch: + $sharedEvents = $event->getApplication()->getEventManager()->getSharedManager(); + $listeners = $this->detachProblemListeners($sharedEvents); + + $return = $controller->dispatch($event->getRequest(), $event->getResponse()); + + // If we detached any listeners, reattach them now: + $this->reattachProblemListeners($sharedEvents, $listeners); + + $this->numNestedForwards--; + + return $return; + } + + /** + * Detach problem listeners specified by getListenersToDetach() and return an array of information that will + * allow them to be reattached. + * + * @param SharedEvents $sharedEvents Shared event manager + * @return array + */ + protected function detachProblemListeners(SharedEvents $sharedEvents) + { + // Convert the problem list from two-dimensional array to more convenient id => event => class format: + $formattedProblems = []; + foreach ($this->getListenersToDetach() as $current) { + if (!isset($formattedProblems[$current['id']])) { + $formattedProblems[$current['id']] = []; + } + if (!isset($formattedProblems[$current['id']][$current['event']])) { + $formattedProblems[$current['id']][$current['event']] = []; + } + $formattedProblems[$current['id']][$current['event']][] = $current['class']; + } + + // Loop through the class blacklist, detaching problem events and remembering their CallbackHandlers + // for future reference: + $results = []; + foreach ($formattedProblems as $id => $eventArray) { + $results[$id] = []; + foreach ($eventArray as $eventName => $classArray) { + $results[$id][$eventName] = []; + $events = $this->getSharedListenersById($id, $eventName, $sharedEvents); + foreach ($events as $priority => $currentPriorityEvents) { + // v2 fix + if (!is_array($currentPriorityEvents)) { + $currentPriorityEvents = [$currentPriorityEvents]; + } + // v3 + foreach ($currentPriorityEvents as $currentEvent) { + $currentCallback = $currentEvent; + + // zend-eventmanager v2 compatibility: + if ($currentCallback instanceof CallbackHandler) { + $currentCallback = $currentEvent->getCallback(); + $priority = $currentEvent->getMetadatum('priority'); + } + + // If we have an array, grab the object + if (is_array($currentCallback)) { + $currentCallback = array_shift($currentCallback); + } + + // This routine is only valid for object callbacks + if (!is_object($currentCallback)) { + continue; + } + + foreach ($classArray as $class) { + if ($currentCallback instanceof $class) { + // Pass $currentEvent; when using zend-eventmanager v2, + // this is the CallbackHandler, while in v3 it's + // the actual listener. + $this->detachSharedListener($id, $currentEvent, $sharedEvents); + $results[$id][$eventName][$priority] = $currentEvent; + } + } + } + } + } + } + + return $results; + } + + /** + * Reattach all problem listeners detached by detachProblemListeners(), if any. + * + * @param SharedEvents $sharedEvents Shared event manager + * @param array $listeners Output of detachProblemListeners() + * @return void + */ + protected function reattachProblemListeners(SharedEvents $sharedEvents, array $listeners) + { + foreach ($listeners as $id => $eventArray) { + foreach ($eventArray as $eventName => $callbacks) { + foreach ($callbacks as $priority => $current) { + $callback = $current; + + // zend-eventmanager v2 compatibility: + if ($current instanceof CallbackHandler) { + $callback = $current->getCallback(); + $priority = $current->getMetadatum('priority'); + } + + $sharedEvents->attach($id, $eventName, $callback, $priority); + } + } + } + } + + /** + * Get the event + * + * @return MvcEvent + * @throws Exception\DomainException if unable to find event + */ + protected function getEvent() + { + if ($this->event) { + return $this->event; + } + + $controller = $this->getController(); + if (!$controller instanceof InjectApplicationEventInterface) { + throw new Exception\DomainException(sprintf( + 'Forward plugin requires a controller that implements InjectApplicationEventInterface; received %s', + (is_object($controller) ? get_class($controller) : var_export($controller, 1)) + )); + } + + $event = $controller->getEvent(); + if (!$event instanceof MvcEvent) { + $params = []; + if ($event) { + $params = $event->getParams(); + } + $event = new MvcEvent(); + $event->setParams($params); + } + $this->event = $event; + + return $this->event; + } + + /** + * Retrieve shared listeners for an event by identifier. + * + * Varies retrieval based on zend-eventmanager version. + * + * @param string|int $id + * @param string $event + * @param SharedEvents $sharedEvents + * @return array|\Traversable + */ + private function getSharedListenersById($id, $event, SharedEvents $sharedEvents) + { + if (method_exists($sharedEvents, 'attachAggregate')) { + // v2 + return $sharedEvents->getListeners($id, $event) ?: []; + } + + // v3 + return $sharedEvents->getListeners([$id], $event); + } + + /** + * Detach a shared listener by identifier. + * + * Varies detachment based on zend-eventmanager version. + * + * @param string|int $id + * @param callable|CallbackHandler $listener + * @param SharedEvents $sharedEvents + * @return void + */ + private function detachSharedListener($id, $listener, SharedEvents $sharedEvents) + { + if (method_exists($sharedEvents, 'attachAggregate')) { + // v2 + $sharedEvents->detach($id, $listener); + return; + } + + // v3 + $sharedEvents->detach($listener, $id); + } +} diff --git a/vendor/Zend/Mvc/Controller/Plugin/Identity.php b/vendor/Zend/Mvc/Controller/Plugin/Identity.php new file mode 100644 index 0000000..a420b19 --- /dev/null +++ b/vendor/Zend/Mvc/Controller/Plugin/Identity.php @@ -0,0 +1,59 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Controller\Plugin; + +use Zend\Authentication\AuthenticationServiceInterface; +use Zend\Mvc\Exception; + +/** + * Controller plugin to fetch the authenticated identity. + */ +class Identity extends AbstractPlugin +{ + /** + * @var AuthenticationServiceInterface + */ + protected $authenticationService; + + /** + * @return AuthenticationServiceInterface + */ + public function getAuthenticationService() + { + return $this->authenticationService; + } + + /** + * @param AuthenticationServiceInterface $authenticationService + */ + public function setAuthenticationService(AuthenticationServiceInterface $authenticationService) + { + $this->authenticationService = $authenticationService; + } + + /** + * Retrieve the current identity, if any. + * + * If none is present, returns null. + * + * @return mixed|null + * @throws Exception\RuntimeException + */ + public function __invoke() + { + if (!$this->authenticationService instanceof AuthenticationServiceInterface) { + throw new Exception\RuntimeException('No AuthenticationServiceInterface instance provided'); + } + if (!$this->authenticationService->hasIdentity()) { + return; + } + return $this->authenticationService->getIdentity(); + } +} diff --git a/vendor/Zend/Mvc/Controller/Plugin/Layout.php b/vendor/Zend/Mvc/Controller/Plugin/Layout.php new file mode 100644 index 0000000..1496309 --- /dev/null +++ b/vendor/Zend/Mvc/Controller/Plugin/Layout.php @@ -0,0 +1,97 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Controller\Plugin; + +use Zend\Mvc\Exception; +use Zend\Mvc\InjectApplicationEventInterface; +use Zend\Mvc\MvcEvent; +use Zend\View\Model\ModelInterface as Model; + +class Layout extends AbstractPlugin +{ + /** + * @var MvcEvent + */ + protected $event; + + /** + * Set the layout template + * + * @param string $template + * @return Layout + */ + public function setTemplate($template) + { + $viewModel = $this->getViewModel(); + $viewModel->setTemplate((string) $template); + return $this; + } + + /** + * Invoke as a functor + * + * If no arguments are given, grabs the "root" or "layout" view model. + * Otherwise, attempts to set the template for that view model. + * + * @param null|string $template + * @return Model|Layout + */ + public function __invoke($template = null) + { + if (null === $template) { + return $this->getViewModel(); + } + return $this->setTemplate($template); + } + + /** + * Get the event + * + * @return MvcEvent + * @throws Exception\DomainException if unable to find event + */ + protected function getEvent() + { + if ($this->event) { + return $this->event; + } + + $controller = $this->getController(); + if (!$controller instanceof InjectApplicationEventInterface) { + throw new Exception\DomainException('Layout plugin requires a controller that implements InjectApplicationEventInterface'); + } + + $event = $controller->getEvent(); + if (!$event instanceof MvcEvent) { + $params = $event->getParams(); + $event = new MvcEvent(); + $event->setParams($params); + } + $this->event = $event; + + return $this->event; + } + + /** + * Retrieve the root view model from the event + * + * @return Model + * @throws Exception\DomainException + */ + protected function getViewModel() + { + $event = $this->getEvent(); + $viewModel = $event->getViewModel(); + if (!$viewModel instanceof Model) { + throw new Exception\DomainException('Layout plugin requires that event view model is populated'); + } + return $viewModel; + } +} diff --git a/vendor/Zend/Mvc/Controller/Plugin/Params.php b/vendor/Zend/Mvc/Controller/Plugin/Params.php new file mode 100644 index 0000000..7f28188 --- /dev/null +++ b/vendor/Zend/Mvc/Controller/Plugin/Params.php @@ -0,0 +1,120 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Controller\Plugin; + +use Zend\Mvc\Exception\RuntimeException; +use Zend\Mvc\InjectApplicationEventInterface; + +class Params extends AbstractPlugin +{ + /** + * Grabs a param from route match by default. + * + * @param string $param + * @param mixed $default + * @return mixed + */ + public function __invoke($param = null, $default = null) + { + if ($param === null) { + return $this; + } + return $this->fromRoute($param, $default); + } + + /** + * Return all files or a single file. + * + * @param string $name File name to retrieve, or null to get all. + * @param mixed $default Default value to use when the file is missing. + * @return array|\ArrayAccess|null + */ + public function fromFiles($name = null, $default = null) + { + if ($name === null) { + return $this->getController()->getRequest()->getFiles($name, $default)->toArray(); + } + + return $this->getController()->getRequest()->getFiles($name, $default); + } + + /** + * Return all header parameters or a single header parameter. + * + * @param string $header Header name to retrieve, or null to get all. + * @param mixed $default Default value to use when the requested header is missing. + * @return null|\Zend\Http\Header\HeaderInterface + */ + public function fromHeader($header = null, $default = null) + { + if ($header === null) { + return $this->getController()->getRequest()->getHeaders($header, $default)->toArray(); + } + + return $this->getController()->getRequest()->getHeaders($header, $default); + } + + /** + * Return all post parameters or a single post parameter. + * + * @param string $param Parameter name to retrieve, or null to get all. + * @param mixed $default Default value to use when the parameter is missing. + * @return mixed + */ + public function fromPost($param = null, $default = null) + { + if ($param === null) { + return $this->getController()->getRequest()->getPost($param, $default)->toArray(); + } + + return $this->getController()->getRequest()->getPost($param, $default); + } + + /** + * Return all query parameters or a single query parameter. + * + * @param string $param Parameter name to retrieve, or null to get all. + * @param mixed $default Default value to use when the parameter is missing. + * @return mixed + */ + public function fromQuery($param = null, $default = null) + { + if ($param === null) { + return $this->getController()->getRequest()->getQuery($param, $default)->toArray(); + } + + return $this->getController()->getRequest()->getQuery($param, $default); + } + + /** + * Return all route parameters or a single route parameter. + * + * @param string $param Parameter name to retrieve, or null to get all. + * @param mixed $default Default value to use when the parameter is missing. + * @return mixed + * @throws RuntimeException + */ + public function fromRoute($param = null, $default = null) + { + $controller = $this->getController(); + + if (!$controller instanceof InjectApplicationEventInterface) { + throw new RuntimeException( + 'Controllers must implement Zend\Mvc\InjectApplicationEventInterface to use this plugin.' + ); + } + + if ($param === null) { + return $controller->getEvent()->getRouteMatch()->getParams(); + } + + return $controller->getEvent()->getRouteMatch()->getParam($param, $default); + } +} diff --git a/vendor/Zend/Mvc/Controller/Plugin/PluginInterface.php b/vendor/Zend/Mvc/Controller/Plugin/PluginInterface.php new file mode 100644 index 0000000..f4b28d0 --- /dev/null +++ b/vendor/Zend/Mvc/Controller/Plugin/PluginInterface.php @@ -0,0 +1,30 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Controller\Plugin; + +use Zend\Stdlib\DispatchableInterface as Dispatchable; + +interface PluginInterface +{ + /** + * Set the current controller instance + * + * @param Dispatchable $controller + * @return void + */ + public function setController(Dispatchable $controller); + + /** + * Get the current controller instance + * + * @return null|Dispatchable + */ + public function getController(); +} diff --git a/vendor/Zend/Mvc/Controller/Plugin/PostRedirectGet.php b/vendor/Zend/Mvc/Controller/Plugin/PostRedirectGet.php new file mode 100644 index 0000000..2a2dd52 --- /dev/null +++ b/vendor/Zend/Mvc/Controller/Plugin/PostRedirectGet.php @@ -0,0 +1,135 @@ +<?php + +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Controller\Plugin; + +use Zend\Mvc\Exception\RuntimeException; +use Zend\Session\Container; + +/** + * Plugin to help facilitate Post/Redirect/Get (http://en.wikipedia.org/wiki/Post/Redirect/Get) + */ +class PostRedirectGet extends AbstractPlugin +{ + /** + * @var Container + */ + protected $sessionContainer; + + /** + * Perform PRG logic + * + * If a null value is present for the $redirect, the current route is + * retrieved and use to generate the URL for redirect. + * + * If the request method is POST, creates a session container set to expire + * after 1 hop containing the values of the POST. It then redirects to the + * specified URL using a status 303. + * + * If the request method is GET, checks to see if we have values in the + * session container, and, if so, returns them; otherwise, it returns a + * boolean false. + * + * @param null|string $redirect + * @param bool $redirectToUrl + * @return \Zend\Http\Response|array|\Traversable|false + */ + public function __invoke($redirect = null, $redirectToUrl = false) + { + $controller = $this->getController(); + $request = $controller->getRequest(); + $container = $this->getSessionContainer(); + + if ($request->isPost()) { + $container->setExpirationHops(1, 'post'); + $container->post = $request->getPost()->toArray(); + return $this->redirect($redirect, $redirectToUrl); + } else { + if (null !== $container->post) { + $post = $container->post; + unset($container->post); + return $post; + } + + return false; + } + } + + /** + * @return Container + */ + public function getSessionContainer() + { + if (!$this->sessionContainer) { + $this->sessionContainer = new Container('prg_post1'); + } + return $this->sessionContainer; + } + + /** + * @param Container $container + * @return PostRedirectGet + */ + public function setSessionContainer(Container $container) + { + $this->sessionContainer = $container; + return $this; + } + + /** + * TODO: Good candidate for traits method in PHP 5.4 with FilePostRedirectGet plugin + * + * @param string $redirect + * @param bool $redirectToUrl + * @return \Zend\Http\Response + * @throws \Zend\Mvc\Exception\RuntimeException + */ + protected function redirect($redirect, $redirectToUrl) + { + $controller = $this->getController(); + $params = []; + $options = ['query' => $controller->params()->fromQuery()]; + $reuseMatchedParams = false; + + if (null === $redirect) { + $routeMatch = $controller->getEvent()->getRouteMatch(); + + $redirect = $routeMatch->getMatchedRouteName(); + //null indicates to redirect for self. + $reuseMatchedParams = true; + } + + if (method_exists($controller, 'getPluginManager')) { + // get the redirect plugin from the plugin manager + $redirector = $controller->getPluginManager()->get('Redirect'); + } else { + /* + * If the user wants to redirect to a route, the redirector has to come + * from the plugin manager -- otherwise no router will be injected + */ + if (false === $redirectToUrl) { + throw new RuntimeException('Could not redirect to a route without a router'); + } + + $redirector = new Redirect(); + } + + if (false === $redirectToUrl) { + $response = $redirector->toRoute($redirect, $params, $options, $reuseMatchedParams); + $response->setStatusCode(303); + return $response; + } + + $response = $redirector->toUrl($redirect); + $response->setStatusCode(303); + + return $response; + } +} diff --git a/vendor/Zend/Mvc/Controller/Plugin/Redirect.php b/vendor/Zend/Mvc/Controller/Plugin/Redirect.php new file mode 100644 index 0000000..ca05560 --- /dev/null +++ b/vendor/Zend/Mvc/Controller/Plugin/Redirect.php @@ -0,0 +1,126 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Controller\Plugin; + +use Zend\Http\Response; +use Zend\Mvc\Exception; +use Zend\Mvc\InjectApplicationEventInterface; +use Zend\Mvc\MvcEvent; + +/** + * @todo allow specifying status code as a default, or as an option to methods + */ +class Redirect extends AbstractPlugin +{ + protected $event; + protected $response; + + /** + * Generate redirect response based on given route + * + * @param string $route RouteInterface name + * @param array $params Parameters to use in url generation, if any + * @param array $options RouteInterface-specific options to use in url generation, if any + * @param bool $reuseMatchedParams Whether to reuse matched parameters + * @return Response + * @throws Exception\DomainException if composed controller does not implement InjectApplicationEventInterface, or + * router cannot be found in controller event + */ + public function toRoute($route = null, $params = [], $options = [], $reuseMatchedParams = false) + { + $controller = $this->getController(); + if (!$controller || !method_exists($controller, 'plugin')) { + throw new Exception\DomainException('Redirect plugin requires a controller that defines the plugin() method'); + } + + $urlPlugin = $controller->plugin('url'); + + if (is_scalar($options)) { + $url = $urlPlugin->fromRoute($route, $params, $options); + } else { + $url = $urlPlugin->fromRoute($route, $params, $options, $reuseMatchedParams); + } + + return $this->toUrl($url); + } + + /** + * Generate redirect response based on given URL + * + * @param string $url + * @return Response + */ + public function toUrl($url) + { + $response = $this->getResponse(); + $response->getHeaders()->addHeaderLine('Location', $url); + $response->setStatusCode(302); + return $response; + } + + /** + * Refresh to current route + * + * @return Response + */ + public function refresh() + { + return $this->toRoute(null, [], [], true); + } + + /** + * Get the response + * + * @return Response + * @throws Exception\DomainException if unable to find response + */ + protected function getResponse() + { + if ($this->response) { + return $this->response; + } + + $event = $this->getEvent(); + $response = $event->getResponse(); + if (!$response instanceof Response) { + throw new Exception\DomainException('Redirect plugin requires event compose a response'); + } + $this->response = $response; + return $this->response; + } + + /** + * Get the event + * + * @return MvcEvent + * @throws Exception\DomainException if unable to find event + */ + protected function getEvent() + { + if ($this->event) { + return $this->event; + } + + $controller = $this->getController(); + if (!$controller instanceof InjectApplicationEventInterface) { + throw new Exception\DomainException('Redirect plugin requires a controller that implements InjectApplicationEventInterface'); + } + + $event = $controller->getEvent(); + if (!$event instanceof MvcEvent) { + $params = $event->getParams(); + $event = new MvcEvent(); + $event->setParams($params); + } + $this->event = $event; + + return $this->event; + } +} diff --git a/vendor/Zend/Mvc/Controller/Plugin/Service/ForwardFactory.php b/vendor/Zend/Mvc/Controller/Plugin/Service/ForwardFactory.php new file mode 100644 index 0000000..405e29e --- /dev/null +++ b/vendor/Zend/Mvc/Controller/Plugin/Service/ForwardFactory.php @@ -0,0 +1,53 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Controller\Plugin\Service; + +use Interop\Container\ContainerInterface; +use Zend\ServiceManager\Exception\ServiceNotCreatedException; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; +use Zend\Mvc\Controller\Plugin\Forward; + +class ForwardFactory implements FactoryInterface +{ + /** + * {@inheritDoc} + * + * @return Forward + * @throws ServiceNotCreatedException if Controllermanager service is not found in application service locator + */ + public function __invoke(ContainerInterface $container, $name, array $options = null) + { + if (! $container->has('ControllerManager')) { + throw new ServiceNotCreatedException(sprintf( + '%s requires that the application service manager contains a "%s" service; none found', + __CLASS__, + 'ControllerManager' + )); + } + $controllers = $container->get('ControllerManager'); + + return new Forward($controllers); + } + + /** + * Create and return Forward instance + * + * For use with zend-servicemanager v2; proxies to __invoke(). + * + * @param ServiceLocatorInterface $container + * @return Forward + */ + public function createService(ServiceLocatorInterface $container) + { + $parentContainer = $container->getServiceLocator() ?: $container; + return $this($parentContainer, Forward::class); + } +} diff --git a/vendor/Zend/Mvc/Controller/Plugin/Service/IdentityFactory.php b/vendor/Zend/Mvc/Controller/Plugin/Service/IdentityFactory.php new file mode 100644 index 0000000..41fb346 --- /dev/null +++ b/vendor/Zend/Mvc/Controller/Plugin/Service/IdentityFactory.php @@ -0,0 +1,51 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Controller\Plugin\Service; + +use Interop\Container\ContainerInterface; +use Zend\Authentication\AuthenticationService; +use Zend\Mvc\Controller\Plugin\Identity; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; + +class IdentityFactory implements FactoryInterface +{ + /** + * {@inheritDoc} + * + * @return Identity + */ + public function __invoke(ContainerInterface $container, $name, array $options = null) + { + $helper = new Identity(); + if ($container->has(AuthenticationService::class)) { + $helper->setAuthenticationService($container->get(AuthenticationService::class)); + } + return $helper; + } + + /** + * Create and return Identity instance + * + * For use with zend-servicemanager v2; proxies to __invoke(). + * + * @param ServiceLocatorInterface $container + * @return Identity + */ + public function createService(ServiceLocatorInterface $container) + { + // Retrieve the parent container when under zend-servicemanager v2 + if (! method_exists($container, 'configure')) { + $container = $container->getServiceLocator() ?: $container; + } + + return $this($container, Identity::class); + } +} diff --git a/vendor/Zend/Mvc/Controller/Plugin/Url.php b/vendor/Zend/Mvc/Controller/Plugin/Url.php new file mode 100644 index 0000000..64ce2db --- /dev/null +++ b/vendor/Zend/Mvc/Controller/Plugin/Url.php @@ -0,0 +1,101 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Controller\Plugin; + +use Traversable; +use Zend\EventManager\EventInterface; +use Zend\Mvc\Exception; +use Zend\Mvc\InjectApplicationEventInterface; +use Zend\Mvc\ModuleRouteListener; +use Zend\Mvc\MvcEvent; +use Zend\Mvc\Router\RouteStackInterface; + +class Url extends AbstractPlugin +{ + /** + * Generates a URL based on a route + * + * @param string $route RouteInterface name + * @param array|Traversable $params Parameters to use in url generation, if any + * @param array|bool $options RouteInterface-specific options to use in url generation, if any. + * If boolean, and no fourth argument, used as $reuseMatchedParams. + * @param bool $reuseMatchedParams Whether to reuse matched parameters + * + * @throws \Zend\Mvc\Exception\RuntimeException + * @throws \Zend\Mvc\Exception\InvalidArgumentException + * @throws \Zend\Mvc\Exception\DomainException + * @return string + */ + public function fromRoute($route = null, $params = [], $options = [], $reuseMatchedParams = false) + { + $controller = $this->getController(); + if (!$controller instanceof InjectApplicationEventInterface) { + throw new Exception\DomainException('Url plugin requires a controller that implements InjectApplicationEventInterface'); + } + + if (!is_array($params)) { + if (!$params instanceof Traversable) { + throw new Exception\InvalidArgumentException( + 'Params is expected to be an array or a Traversable object' + ); + } + $params = iterator_to_array($params); + } + + $event = $controller->getEvent(); + $router = null; + $matches = null; + if ($event instanceof MvcEvent) { + $router = $event->getRouter(); + $matches = $event->getRouteMatch(); + } elseif ($event instanceof EventInterface) { + $router = $event->getParam('router', false); + $matches = $event->getParam('route-match', false); + } + if (!$router instanceof RouteStackInterface) { + throw new Exception\DomainException('Url plugin requires that controller event compose a router; none found'); + } + + if (3 == func_num_args() && is_bool($options)) { + $reuseMatchedParams = $options; + $options = []; + } + + if ($route === null) { + if (!$matches) { + throw new Exception\RuntimeException('No RouteMatch instance present'); + } + + $route = $matches->getMatchedRouteName(); + + if ($route === null) { + throw new Exception\RuntimeException('RouteMatch does not contain a matched route name'); + } + } + + if ($reuseMatchedParams && $matches) { + $routeMatchParams = $matches->getParams(); + + if (isset($routeMatchParams[ModuleRouteListener::ORIGINAL_CONTROLLER])) { + $routeMatchParams['controller'] = $routeMatchParams[ModuleRouteListener::ORIGINAL_CONTROLLER]; + unset($routeMatchParams[ModuleRouteListener::ORIGINAL_CONTROLLER]); + } + + if (isset($routeMatchParams[ModuleRouteListener::MODULE_NAMESPACE])) { + unset($routeMatchParams[ModuleRouteListener::MODULE_NAMESPACE]); + } + + $params = array_merge($routeMatchParams, $params); + } + + $options['name'] = $route; + return $router->assemble($params, $options); + } +} diff --git a/vendor/Zend/Mvc/Controller/PluginManager.php b/vendor/Zend/Mvc/Controller/PluginManager.php new file mode 100644 index 0000000..e2cb53c --- /dev/null +++ b/vendor/Zend/Mvc/Controller/PluginManager.php @@ -0,0 +1,211 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Controller; + +use Zend\Mvc\Exception; +use Zend\ServiceManager\AbstractPluginManager; +use Zend\ServiceManager\Exception\InvalidServiceException; +use Zend\ServiceManager\Factory\InvokableFactory; +use Zend\Stdlib\DispatchableInterface; + +/** + * Plugin manager implementation for controllers + * + * Registers a number of default plugins, and contains an initializer for + * injecting plugins with the current controller. + */ +class PluginManager extends AbstractPluginManager +{ + /** + * Plugins must be of this type. + * + * @var string + */ + protected $instanceOf = Plugin\PluginInterface::class; + + /** + * @var string[] Default aliases + */ + protected $aliases = [ + 'AcceptableViewModelSelector' => Plugin\AcceptableViewModelSelector::class, + 'acceptableViewModelSelector' => Plugin\AcceptableViewModelSelector::class, + 'acceptableviewmodelselector' => Plugin\AcceptableViewModelSelector::class, + 'FilePostRedirectGet' => Plugin\FilePostRedirectGet::class, + 'filePostRedirectGet' => Plugin\FilePostRedirectGet::class, + 'filepostredirectget' => Plugin\FilePostRedirectGet::class, + 'fileprg' => Plugin\FilePostRedirectGet::class, + 'FlashMessenger' => Plugin\FlashMessenger::class, + 'flashMessenger' => Plugin\FlashMessenger::class, + 'flashmessenger' => Plugin\FlashMessenger::class, + 'Forward' => Plugin\Forward::class, + 'forward' => Plugin\Forward::class, + 'Identity' => Plugin\Identity::class, + 'identity' => Plugin\Identity::class, + 'Layout' => Plugin\Layout::class, + 'layout' => Plugin\Layout::class, + 'Params' => Plugin\Params::class, + 'params' => Plugin\Params::class, + 'PostRedirectGet' => Plugin\PostRedirectGet::class, + 'postRedirectGet' => Plugin\PostRedirectGet::class, + 'postredirectget' => Plugin\PostRedirectGet::class, + 'prg' => Plugin\PostRedirectGet::class, + 'Redirect' => Plugin\Redirect::class, + 'redirect' => Plugin\Redirect::class, + 'Url' => Plugin\Url::class, + 'url' => Plugin\Url::class, + 'CreateHttpNotFoundModel' => Plugin\CreateHttpNotFoundModel::class, + 'createHttpNotFoundModel' => Plugin\CreateHttpNotFoundModel::class, + 'createhttpnotfoundmodel' => Plugin\CreateHttpNotFoundModel::class, + 'CreateConsoleNotFoundModel' => Plugin\CreateConsoleNotFoundModel::class, + 'createConsoleNotFoundModel' => Plugin\CreateConsoleNotFoundModel::class, + 'createconsolenotfoundmodel' => Plugin\CreateConsoleNotFoundModel::class, + ]; + + /** + * @var string[]|callable[] Default factories + */ + protected $factories = [ + Plugin\Forward::class => Plugin\Service\ForwardFactory::class, + Plugin\Identity::class => Plugin\Service\IdentityFactory::class, + Plugin\AcceptableViewModelSelector::class => InvokableFactory::class, + Plugin\FilePostRedirectGet::class => InvokableFactory::class, + Plugin\FlashMessenger::class => InvokableFactory::class, + Plugin\Layout::class => InvokableFactory::class, + Plugin\Params::class => InvokableFactory::class, + Plugin\PostRedirectGet::class => InvokableFactory::class, + Plugin\Redirect::class => InvokableFactory::class, + Plugin\Url::class => InvokableFactory::class, + Plugin\CreateHttpNotFoundModel::class => InvokableFactory::class, + Plugin\CreateConsoleNotFoundModel::class => InvokableFactory::class, + + // v2 normalized names + + 'zendmvccontrollerpluginforward' => Plugin\Service\ForwardFactory::class, + 'zendmvccontrollerpluginidentity' => Plugin\Service\IdentityFactory::class, + 'zendmvccontrollerpluginacceptableviewmodelselector' => InvokableFactory::class, + 'zendmvccontrollerpluginfilepostredirectget' => InvokableFactory::class, + 'zendmvccontrollerpluginflashmessenger' => InvokableFactory::class, + 'zendmvccontrollerpluginlayout' => InvokableFactory::class, + 'zendmvccontrollerpluginparams' => InvokableFactory::class, + 'zendmvccontrollerpluginpostredirectget' => InvokableFactory::class, + 'zendmvccontrollerpluginredirect' => InvokableFactory::class, + 'zendmvccontrollerpluginurl' => InvokableFactory::class, + 'zendmvccontrollerplugincreatehttpnotfoundmodel' => InvokableFactory::class, + 'zendmvccontrollerplugincreateconsolenotfoundmodel' => InvokableFactory::class, + ]; + + /** + * @var DispatchableInterface + */ + protected $controller; + + /** + * Retrieve a registered instance + * + * After the plugin is retrieved from the service locator, inject the + * controller in the plugin every time it is requested. This is required + * because a controller can use a plugin and another controller can be + * dispatched afterwards. If this second controller uses the same plugin + * as the first controller, the reference to the controller inside the + * plugin is lost. + * + * @param string $name + * @return DispatchableInterface + */ + public function get($name, array $options = null) + { + $plugin = parent::get($name, $options); + $this->injectController($plugin); + + return $plugin; + } + + /** + * Set controller + * + * @param DispatchableInterface $controller + * @return PluginManager + */ + public function setController(DispatchableInterface $controller) + { + $this->controller = $controller; + + return $this; + } + + /** + * Retrieve controller instance + * + * @return null|DispatchableInterface + */ + public function getController() + { + return $this->controller; + } + + /** + * Inject a helper instance with the registered controller + * + * @param object $plugin + * @return void + */ + public function injectController($plugin) + { + if (!is_object($plugin)) { + return; + } + if (!method_exists($plugin, 'setController')) { + return; + } + + $controller = $this->getController(); + if (!$controller instanceof DispatchableInterface) { + return; + } + + $plugin->setController($controller); + } + + /** + * Validate a plugin (v3) + * + * {@inheritDoc} + */ + public function validate($plugin) + { + if (! $plugin instanceof $this->instanceOf) { + throw new InvalidServiceException(sprintf( + 'Plugin of type "%s" is invalid; must implement %s', + (is_object($plugin) ? get_class($plugin) : gettype($plugin)), + $this->instanceOf + )); + } + } + + /** + * Validate a plugin (v2) + * + * {@inheritDoc} + * + * @throws Exception\InvalidPluginException + */ + public function validatePlugin($plugin) + { + try { + $this->validate($plugin); + } catch (InvalidServiceException $e) { + throw new Exception\InvalidPluginException( + $e->getMessage(), + $e->getCode(), + $e + ); + } + } +} diff --git a/vendor/Zend/Mvc/DispatchListener.php b/vendor/Zend/Mvc/DispatchListener.php new file mode 100644 index 0000000..a88d0dd --- /dev/null +++ b/vendor/Zend/Mvc/DispatchListener.php @@ -0,0 +1,259 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc; + +use ArrayObject; +use Zend\EventManager\AbstractListenerAggregate; +use Zend\EventManager\EventManagerInterface; +use Zend\ServiceManager\Exception\InvalidServiceException; +use Zend\Stdlib\ArrayUtils; + +/** + * Default dispatch listener + * + * Pulls controllers from the service manager's "ControllerManager" service. + * + * If the controller cannot be found a "404" result is set up. Otherwise it + * will continue to try to load the controller. + * + * If the controller is not dispatchable it sets up a "404" result. In case + * of any other exceptions it trigger the "dispatch.error" event in an attempt + * to return a 500 status. + * + * If the controller subscribes to InjectApplicationEventInterface, it injects + * the current MvcEvent into the controller. + * + * It then calls the controller's "dispatch" method, passing it the request and + * response. If an exception occurs, it triggers the "dispatch.error" event, + * in an attempt to return a 500 status. + * + * The return value of dispatching the controller is placed into the result + * property of the MvcEvent, and returned. + */ +class DispatchListener extends AbstractListenerAggregate +{ + /** + * @var Controller\ControllerManager + */ + private $controllerManager; + + /** + * @param Controller\ControllerManager $controllerManager + */ + public function __construct(Controller\ControllerManager $controllerManager) + { + $this->controllerManager = $controllerManager; + } + + /** + * Attach listeners to an event manager + * + * @param EventManagerInterface $events + * @param int $priority + * @return void + */ + public function attach(EventManagerInterface $events, $priority = 1) + { + $this->listeners[] = $events->attach(MvcEvent::EVENT_DISPATCH, [$this, 'onDispatch']); + if (function_exists('zend_monitor_custom_event_ex')) { + $this->listeners[] = $events->attach(MvcEvent::EVENT_DISPATCH_ERROR, [$this, 'reportMonitorEvent']); + } + } + + /** + * Listen to the "dispatch" event + * + * @param MvcEvent $e + * @return mixed + */ + public function onDispatch(MvcEvent $e) + { + $routeMatch = $e->getRouteMatch(); + $controllerName = $routeMatch instanceof Router\RouteMatch + ? $routeMatch->getParam('controller', 'not-found') + : 'not-found'; + $application = $e->getApplication(); + $events = $application->getEventManager(); + $controllerManager = $this->controllerManager; + + + // Query abstract controllers, too! + if (! $controllerManager->has($controllerName)) { + $return = $this->marshalControllerNotFoundEvent($application::ERROR_CONTROLLER_NOT_FOUND, $controllerName, $e, $application); + return $this->complete($return, $e); + } + + try { + $controller = $controllerManager->get($controllerName); + } catch (Exception\InvalidControllerException $exception) { + $return = $this->marshalControllerNotFoundEvent($application::ERROR_CONTROLLER_INVALID, $controllerName, $e, $application, $exception); + return $this->complete($return, $e); + } catch (InvalidServiceException $exception) { + $return = $this->marshalControllerNotFoundEvent($application::ERROR_CONTROLLER_INVALID, $controllerName, $e, $application, $exception); + return $this->complete($return, $e); + } catch (\Throwable $exception) { + $return = $this->marshalBadControllerEvent($controllerName, $e, $application, $exception); + return $this->complete($return, $e); + } catch (\Exception $exception) { // @TODO clean up once PHP 7 requirement is enforced + $return = $this->marshalBadControllerEvent($controllerName, $e, $application, $exception); + return $this->complete($return, $e); + } + + if ($controller instanceof InjectApplicationEventInterface) { + $controller->setEvent($e); + } + + $request = $e->getRequest(); + $response = $application->getResponse(); + $caughtException = null; + + try { + $return = $controller->dispatch($request, $response); + } catch (\Throwable $ex) { + $caughtException = $ex; + } catch (\Exception $ex) { // @TODO clean up once PHP 7 requirement is enforced + $caughtException = $ex; + } + + if ($caughtException !== null) { + $e->setName(MvcEvent::EVENT_DISPATCH_ERROR); + $e->setError($application::ERROR_EXCEPTION); + $e->setController($controllerName); + $e->setControllerClass(get_class($controller)); + $e->setParam('exception', $caughtException); + + $return = $application->getEventManager()->triggerEvent($e)->last(); + if (! $return) { + $return = $e->getResult(); + } + } + + return $this->complete($return, $e); + } + + /** + * @param MvcEvent $e + */ + public function reportMonitorEvent(MvcEvent $e) + { + $error = $e->getError(); + $exception = $e->getParam('exception'); + if ($exception instanceof \Exception || $exception instanceof \Throwable) { // @TODO clean up once PHP 7 requirement is enforced + zend_monitor_custom_event_ex($error, $exception->getMessage(), 'Zend Framework Exception', ['code' => $exception->getCode(), 'trace' => $exception->getTraceAsString()]); + } + } + + /** + * Complete the dispatch + * + * @param mixed $return + * @param MvcEvent $event + * @return mixed + */ + protected function complete($return, MvcEvent $event) + { + if (!is_object($return)) { + if (ArrayUtils::hasStringKeys($return)) { + $return = new ArrayObject($return, ArrayObject::ARRAY_AS_PROPS); + } + } + $event->setResult($return); + return $return; + } + + /** + * Marshal a controller not found exception event + * + * @param string $type + * @param string $controllerName + * @param MvcEvent $event + * @param Application $application + * @param \Exception $exception + * @return mixed + */ + protected function marshalControllerNotFoundEvent( + $type, + $controllerName, + MvcEvent $event, + Application $application, + \Exception $exception = null + ) { + $event->setName(MvcEvent::EVENT_DISPATCH_ERROR); + $event->setError($type); + $event->setController($controllerName); + $event->setControllerClass('invalid controller class or alias: ' . $controllerName); + if ($exception !== null) { + $event->setParam('exception', $exception); + } + + $events = $application->getEventManager(); + $results = $events->triggerEvent($event); + $return = $results->last(); + if (! $return) { + $return = $event->getResult(); + } + return $return; + } + + /** + * Marshal a controller not found exception event + * + * @deprecated Use marshalControllerNotFoundEvent() instead + * @param string $type + * @param string $controllerName + * @param MvcEvent $event + * @param Application $application + * @param \Exception $exception + * @return mixed + */ + protected function marshallControllerNotFoundEvent( + $type, + $controllerName, + MvcEvent $event, + Application $application, + \Exception $exception = null + ) { + trigger_error(sprintf( + '%s is deprecated; please use %s::marshalControllerNotFoundEvent instead', + __METHOD__, + __CLASS__ + ), E_USER_DEPRECATED); + + return $this->marshalControllerNotFoundEvent($type, $controllerName, $event, $application, $exception); + } + + /** + * Marshal a bad controller exception event + * + * @todo Update $exception typehint to "Throwable" once PHP 7 requirement + * is enforced + * @param string $controllerName + * @param MvcEvent $event + * @param Application $application + * @param \Exception|\Throwable $exception + * @return mixed + */ + protected function marshalBadControllerEvent($controllerName, MvcEvent $event, Application $application, $exception) + { + $event->setName(MvcEvent::EVENT_DISPATCH_ERROR); + $event->setError($application::ERROR_EXCEPTION); + $event->setController($controllerName); + $event->setParam('exception', $exception); + + $events = $application->getEventManager(); + $results = $events->triggerEvent($event); + $return = $results->last(); + if (! $return) { + return $event->getResult(); + } + + return $return; + } +} diff --git a/vendor/Zend/Mvc/Exception/BadMethodCallException.php b/vendor/Zend/Mvc/Exception/BadMethodCallException.php new file mode 100644 index 0000000..cb01a8a --- /dev/null +++ b/vendor/Zend/Mvc/Exception/BadMethodCallException.php @@ -0,0 +1,14 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Exception; + +class BadMethodCallException extends \BadMethodCallException implements ExceptionInterface +{ +} diff --git a/vendor/Zend/Mvc/Exception/DomainException.php b/vendor/Zend/Mvc/Exception/DomainException.php new file mode 100644 index 0000000..7490b64 --- /dev/null +++ b/vendor/Zend/Mvc/Exception/DomainException.php @@ -0,0 +1,14 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Exception; + +class DomainException extends \DomainException implements ExceptionInterface +{ +} diff --git a/vendor/Zend/Mvc/Exception/ExceptionInterface.php b/vendor/Zend/Mvc/Exception/ExceptionInterface.php new file mode 100644 index 0000000..abdd7a3 --- /dev/null +++ b/vendor/Zend/Mvc/Exception/ExceptionInterface.php @@ -0,0 +1,14 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Exception; + +interface ExceptionInterface +{ +} diff --git a/vendor/Zend/Mvc/Exception/InvalidArgumentException.php b/vendor/Zend/Mvc/Exception/InvalidArgumentException.php new file mode 100644 index 0000000..fbd05f5 --- /dev/null +++ b/vendor/Zend/Mvc/Exception/InvalidArgumentException.php @@ -0,0 +1,14 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Exception; + +class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface +{ +} diff --git a/vendor/Zend/Mvc/Exception/InvalidControllerException.php b/vendor/Zend/Mvc/Exception/InvalidControllerException.php new file mode 100644 index 0000000..166f1fc --- /dev/null +++ b/vendor/Zend/Mvc/Exception/InvalidControllerException.php @@ -0,0 +1,14 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Exception; + +class InvalidControllerException extends \Exception implements ExceptionInterface +{ +} diff --git a/vendor/Zend/Mvc/Exception/InvalidPluginException.php b/vendor/Zend/Mvc/Exception/InvalidPluginException.php new file mode 100644 index 0000000..05abc5d --- /dev/null +++ b/vendor/Zend/Mvc/Exception/InvalidPluginException.php @@ -0,0 +1,14 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Exception; + +class InvalidPluginException extends \Exception implements ExceptionInterface +{ +} diff --git a/vendor/Zend/Mvc/Exception/MissingLocatorException.php b/vendor/Zend/Mvc/Exception/MissingLocatorException.php new file mode 100644 index 0000000..220c01e --- /dev/null +++ b/vendor/Zend/Mvc/Exception/MissingLocatorException.php @@ -0,0 +1,14 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Exception; + +class MissingLocatorException extends RuntimeException +{ +} diff --git a/vendor/Zend/Mvc/Exception/RuntimeException.php b/vendor/Zend/Mvc/Exception/RuntimeException.php new file mode 100644 index 0000000..a959ed7 --- /dev/null +++ b/vendor/Zend/Mvc/Exception/RuntimeException.php @@ -0,0 +1,14 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Exception; + +class RuntimeException extends \RuntimeException implements ExceptionInterface +{ +} diff --git a/vendor/Zend/Mvc/HttpMethodListener.php b/vendor/Zend/Mvc/HttpMethodListener.php new file mode 100644 index 0000000..5684e40 --- /dev/null +++ b/vendor/Zend/Mvc/HttpMethodListener.php @@ -0,0 +1,127 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc; + +use Zend\EventManager\AbstractListenerAggregate; +use Zend\EventManager\EventManagerInterface; +use Zend\Http\Request as HttpRequest; +use Zend\Http\Response as HttpResponse; + +class HttpMethodListener extends AbstractListenerAggregate +{ + /** + * @var array + */ + protected $allowedMethods = [ + HttpRequest::METHOD_CONNECT, + HttpRequest::METHOD_DELETE, + HttpRequest::METHOD_GET, + HttpRequest::METHOD_HEAD, + HttpRequest::METHOD_OPTIONS, + HttpRequest::METHOD_PATCH, + HttpRequest::METHOD_POST, + HttpRequest::METHOD_PUT, + HttpRequest::METHOD_PROPFIND, + HttpRequest::METHOD_TRACE, + ]; + + /** + * @var bool + */ + protected $enabled = true; + + /** + * @param bool $enabled + * @param array $allowedMethods + */ + public function __construct($enabled = true, $allowedMethods = []) + { + $this->setEnabled($enabled); + + if (! empty($allowedMethods)) { + $this->setAllowedMethods($allowedMethods); + } + } + + /** + * {@inheritdoc} + */ + public function attach(EventManagerInterface $events, $priority = 1) + { + if (! $this->isEnabled()) { + return; + } + + $this->listeners[] = $events->attach( + MvcEvent::EVENT_ROUTE, + [$this, 'onRoute'], + 10000 + ); + } + + /** + * @param MvcEvent $e + * @return void|HttpResponse + */ + public function onRoute(MvcEvent $e) + { + $request = $e->getRequest(); + $response = $e->getResponse(); + + if (! $request instanceof HttpRequest || ! $response instanceof HttpResponse) { + return; + } + + $method = $request->getMethod(); + + if (in_array($method, $this->getAllowedMethods())) { + return; + } + + $response->setStatusCode(405); + + return $response; + } + + /** + * @return array + */ + public function getAllowedMethods() + { + return $this->allowedMethods; + } + + /** + * @param array $allowedMethods + */ + public function setAllowedMethods(array $allowedMethods) + { + foreach ($allowedMethods as &$value) { + $value = strtoupper($value); + } + $this->allowedMethods = $allowedMethods; + } + + /** + * @return bool + */ + public function isEnabled() + { + return $this->enabled; + } + + /** + * @param bool $enabled + */ + public function setEnabled($enabled) + { + $this->enabled = (bool) $enabled; + } +} diff --git a/vendor/Zend/Mvc/I18n/DummyTranslator.php b/vendor/Zend/Mvc/I18n/DummyTranslator.php new file mode 100644 index 0000000..6201981 --- /dev/null +++ b/vendor/Zend/Mvc/I18n/DummyTranslator.php @@ -0,0 +1,25 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\I18n; + +use Zend\I18n\Translator\TranslatorInterface as I18nTranslatorInterface; + +class DummyTranslator implements I18nTranslatorInterface +{ + public function translate($message, $textDomain = 'default', $locale = null) + { + return $message; + } + + public function translatePlural($singular, $plural, $number, $textDomain = 'default', $locale = null) + { + return ($number == 1 ? $singular : $plural); + } +} diff --git a/vendor/Zend/Mvc/I18n/Translator.php b/vendor/Zend/Mvc/I18n/Translator.php new file mode 100644 index 0000000..e69e43a --- /dev/null +++ b/vendor/Zend/Mvc/I18n/Translator.php @@ -0,0 +1,90 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\I18n; + +use Zend\I18n\Translator\TranslatorInterface as I18nTranslatorInterface; +use Zend\Mvc\Exception; +use Zend\Validator\Translator\TranslatorInterface as ValidatorTranslatorInterface; + +class Translator implements + I18nTranslatorInterface, + ValidatorTranslatorInterface +{ + /** + * @var I18nTranslatorInterface + */ + protected $translator; + + /** + * @param I18nTranslatorInterface $translator + */ + public function __construct(I18nTranslatorInterface $translator) + { + $this->translator = $translator; + } + + /** + * Proxy unknown method calls to underlying translator instance + * + * Note: this method is only implemented to keep backwards compatibility + * with pre-2.3.0 code. + * + * @deprecated + * @param string $method + * @param array $args + * @return mixed + */ + public function __call($method, array $args) + { + if (!method_exists($this->translator, $method)) { + throw new Exception\BadMethodCallException(sprintf( + 'Unable to call method "%s"; does not exist in translator', + $method + )); + } + return call_user_func_array([$this->translator, $method], $args); + } + + /** + * @return I18nTranslatorInterface + */ + public function getTranslator() + { + return $this->translator; + } + + /** + * Translate a message using the given text domain and locale + * + * @param string $message + * @param string $textDomain + * @param string $locale + * @return string + */ + public function translate($message, $textDomain = 'default', $locale = null) + { + return $this->translator->translate($message, $textDomain, $locale); + } + + /** + * Provide a pluralized translation of the given string using the given text domain and locale + * + * @param string $singular + * @param string $plural + * @param string $number + * @param string $textDomain + * @param string $locale + * @return string + */ + public function translatePlural($singular, $plural, $number, $textDomain = 'default', $locale = null) + { + return $this->translator->translatePlural($singular, $plural, $number, $textDomain, $locale); + } +} diff --git a/vendor/Zend/Mvc/InjectApplicationEventInterface.php b/vendor/Zend/Mvc/InjectApplicationEventInterface.php new file mode 100644 index 0000000..506b6e2 --- /dev/null +++ b/vendor/Zend/Mvc/InjectApplicationEventInterface.php @@ -0,0 +1,30 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc; + +use Zend\EventManager\EventInterface as Event; + +interface InjectApplicationEventInterface +{ + /** + * Compose an Event + * + * @param Event $event + * @return void + */ + public function setEvent(Event $event); + + /** + * Retrieve the composed event + * + * @return Event + */ + public function getEvent(); +} diff --git a/vendor/Zend/Mvc/MiddlewareListener.php b/vendor/Zend/Mvc/MiddlewareListener.php new file mode 100644 index 0000000..5ea4efe --- /dev/null +++ b/vendor/Zend/Mvc/MiddlewareListener.php @@ -0,0 +1,126 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc; + +use Psr\Http\Message\ResponseInterface as PsrResponseInterface; +use Zend\EventManager\AbstractListenerAggregate; +use Zend\EventManager\EventManagerInterface; +use Zend\Psr7Bridge\Psr7ServerRequest as Psr7Request; +use Zend\Psr7Bridge\Psr7Response; + +class MiddlewareListener extends AbstractListenerAggregate +{ + /** + * Attach listeners to an event manager + * + * @param EventManagerInterface $events + * @return void + */ + public function attach(EventManagerInterface $events, $priority = 1) + { + $this->listeners[] = $events->attach(MvcEvent::EVENT_DISPATCH, [$this, 'onDispatch'], 1); + } + + /** + * Listen to the "dispatch" event + * + * @param MvcEvent $event + * @return mixed + */ + public function onDispatch(MvcEvent $event) + { + $routeMatch = $event->getRouteMatch(); + $middleware = $routeMatch->getParam('middleware', false); + if (false === $middleware) { + return; + } + + $request = $event->getRequest(); + $application = $event->getApplication(); + $response = $application->getResponse(); + $serviceManager = $application->getServiceManager(); + $middlewareName = is_string($middleware) ? $middleware : get_class($middleware); + + if (is_string($middleware) && $serviceManager->has($middleware)) { + $middleware = $serviceManager->get($middleware); + } + if (! is_callable($middleware)) { + $return = $this->marshalMiddlewareNotCallable($application::ERROR_MIDDLEWARE_CANNOT_DISPATCH, $middlewareName, $event, $application); + $event->setResult($return); + return $return; + } + + $caughtException = null; + try { + $return = $middleware(Psr7Request::fromZend($request), Psr7Response::fromZend($response)); + } catch (\Throwable $ex) { + $caughtException = $ex; + } catch (\Exception $ex) { // @TODO clean up once PHP 7 requirement is enforced + $caughtException = $ex; + } + + if ($caughtException !== null) { + $event->setName(MvcEvent::EVENT_DISPATCH_ERROR); + $event->setError($application::ERROR_EXCEPTION); + $event->setController($middlewareName); + $event->setControllerClass(get_class($middleware)); + $event->setParam('exception', $caughtException); + + $events = $application->getEventManager(); + $results = $events->triggerEvent($event); + $return = $results->last(); + if (! $return) { + $return = $event->getResult(); + } + } + + if (! $return instanceof PsrResponseInterface) { + $event->setResult($return); + return $return; + } + $response = Psr7Response::toZend($return); + $event->setResult($response); + return $response; + } + + /** + * Marshal a middleware not callable exception event + * + * @param string $type + * @param string $middlewareName + * @param MvcEvent $event + * @param Application $application + * @param \Exception $exception + * @return mixed + */ + protected function marshalMiddlewareNotCallable( + $type, + $middlewareName, + MvcEvent $event, + Application $application, + \Exception $exception = null + ) { + $event->setName(MvcEvent::EVENT_DISPATCH_ERROR); + $event->setError($type); + $event->setController($middlewareName); + $event->setControllerClass('Middleware not callable: ' . $middlewareName); + if ($exception !== null) { + $event->setParam('exception', $exception); + } + + $events = $application->getEventManager(); + $results = $events->triggerEvent($event); + $return = $results->last(); + if (! $return) { + $return = $event->getResult(); + } + return $return; + } +} diff --git a/vendor/Zend/Mvc/ModuleRouteListener.php b/vendor/Zend/Mvc/ModuleRouteListener.php new file mode 100644 index 0000000..5ffd4a9 --- /dev/null +++ b/vendor/Zend/Mvc/ModuleRouteListener.php @@ -0,0 +1,75 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc; + +use Zend\EventManager\AbstractListenerAggregate; +use Zend\EventManager\EventManagerInterface; + +class ModuleRouteListener extends AbstractListenerAggregate +{ + const MODULE_NAMESPACE = '__NAMESPACE__'; + const ORIGINAL_CONTROLLER = '__CONTROLLER__'; + + /** + * Attach to an event manager + * + * @param EventManagerInterface $events + * @param int $priority + */ + public function attach(EventManagerInterface $events, $priority = 1) + { + $this->listeners[] = $events->attach(MvcEvent::EVENT_ROUTE, [$this, 'onRoute'], $priority); + } + + /** + * Listen to the "route" event and determine if the module namespace should + * be prepended to the controller name. + * + * If the route match contains a parameter key matching the MODULE_NAMESPACE + * constant, that value will be prepended, with a namespace separator, to + * the matched controller parameter. + * + * @param MvcEvent $e + * @return null + */ + public function onRoute(MvcEvent $e) + { + $matches = $e->getRouteMatch(); + if (!$matches instanceof Router\RouteMatch) { + // Can't do anything without a route match + return; + } + + $module = $matches->getParam(self::MODULE_NAMESPACE, false); + if (!$module) { + // No module namespace found; nothing to do + return; + } + + $controller = $matches->getParam('controller', false); + if (!$controller) { + // no controller matched, nothing to do + return; + } + + // Ensure the module namespace has not already been applied + if (0 === strpos($controller, $module)) { + return; + } + + // Keep the originally matched controller name around + $matches->setParam(self::ORIGINAL_CONTROLLER, $controller); + + // Prepend the controllername with the module, and replace it in the + // matches + $controller = $module . '\\' . str_replace(' ', '', ucwords(str_replace('-', ' ', $controller))); + $matches->setParam('controller', $controller); + } +} diff --git a/vendor/Zend/Mvc/MvcEvent.php b/vendor/Zend/Mvc/MvcEvent.php new file mode 100644 index 0000000..b385228 --- /dev/null +++ b/vendor/Zend/Mvc/MvcEvent.php @@ -0,0 +1,302 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc; + +use Zend\EventManager\Event; +use Zend\Stdlib\RequestInterface as Request; +use Zend\Stdlib\ResponseInterface as Response; +use Zend\View\Model\ModelInterface as Model; +use Zend\View\Model\ViewModel; + +class MvcEvent extends Event +{ + /**#@+ + * Mvc events triggered by eventmanager + */ + const EVENT_BOOTSTRAP = 'bootstrap'; + const EVENT_DISPATCH = 'dispatch'; + const EVENT_DISPATCH_ERROR = 'dispatch.error'; + const EVENT_FINISH = 'finish'; + const EVENT_RENDER = 'render'; + const EVENT_RENDER_ERROR = 'render.error'; + const EVENT_ROUTE = 'route'; + /**#@-*/ + + protected $application; + + /** + * @var Request + */ + protected $request; + + /** + * @var Response + */ + protected $response; + + /** + * @var mixed + */ + protected $result; + + /** + * @var Router\RouteStackInterface + */ + protected $router; + + /** + * @var null|Router\RouteMatch + */ + protected $routeMatch; + + /** + * @var Model + */ + protected $viewModel; + + /** + * Set application instance + * + * @param ApplicationInterface $application + * @return MvcEvent + */ + public function setApplication(ApplicationInterface $application) + { + $this->setParam('application', $application); + $this->application = $application; + return $this; + } + + /** + * Get application instance + * + * @return ApplicationInterface + */ + public function getApplication() + { + return $this->application; + } + + /** + * Get router + * + * @return Router\RouteStackInterface + */ + public function getRouter() + { + return $this->router; + } + + /** + * Set router + * + * @param Router\RouteStackInterface $router + * @return MvcEvent + */ + public function setRouter(Router\RouteStackInterface $router) + { + $this->setParam('router', $router); + $this->router = $router; + return $this; + } + + /** + * Get route match + * + * @return null|Router\RouteMatch + */ + public function getRouteMatch() + { + return $this->routeMatch; + } + + /** + * Set route match + * + * @param Router\RouteMatch $matches + * @return MvcEvent + */ + public function setRouteMatch(Router\RouteMatch $matches) + { + $this->setParam('route-match', $matches); + $this->routeMatch = $matches; + return $this; + } + + /** + * Get request + * + * @return Request + */ + public function getRequest() + { + return $this->request; + } + + /** + * Set request + * + * @param Request $request + * @return MvcEvent + */ + public function setRequest(Request $request) + { + $this->setParam('request', $request); + $this->request = $request; + return $this; + } + + /** + * Get response + * + * @return Response + */ + public function getResponse() + { + return $this->response; + } + + /** + * Set response + * + * @param Response $response + * @return MvcEvent + */ + public function setResponse(Response $response) + { + $this->setParam('response', $response); + $this->response = $response; + return $this; + } + + /** + * Set the view model + * + * @param Model $viewModel + * @return MvcEvent + */ + public function setViewModel(Model $viewModel) + { + $this->viewModel = $viewModel; + return $this; + } + + /** + * Get the view model + * + * @return Model + */ + public function getViewModel() + { + if (null === $this->viewModel) { + $this->setViewModel(new ViewModel()); + } + return $this->viewModel; + } + + /** + * Get result + * + * @return mixed + */ + public function getResult() + { + return $this->result; + } + + /** + * Set result + * + * @param mixed $result + * @return MvcEvent + */ + public function setResult($result) + { + $this->setParam('__RESULT__', $result); + $this->result = $result; + return $this; + } + + /** + * Does the event represent an error response? + * + * @return bool + */ + public function isError() + { + return (bool) $this->getParam('error', false); + } + + /** + * Set the error message (indicating error in handling request) + * + * @param string $message + * @return MvcEvent + */ + public function setError($message) + { + $this->setParam('error', $message); + return $this; + } + + /** + * Retrieve the error message, if any + * + * @return string + */ + public function getError() + { + return $this->getParam('error', ''); + } + + /** + * Get the currently registered controller name + * + * @return string + */ + public function getController() + { + return $this->getParam('controller'); + } + + /** + * Set controller name + * + * @param string $name + * @return MvcEvent + */ + public function setController($name) + { + $this->setParam('controller', $name); + return $this; + } + + /** + * Get controller class + * + * @return string + */ + public function getControllerClass() + { + return $this->getParam('controller-class'); + } + + /** + * Set controller class + * + * @param string $class + * @return MvcEvent + */ + public function setControllerClass($class) + { + $this->setParam('controller-class', $class); + return $this; + } +} diff --git a/vendor/Zend/Mvc/ResponseSender/AbstractResponseSender.php b/vendor/Zend/Mvc/ResponseSender/AbstractResponseSender.php new file mode 100644 index 0000000..09a4256 --- /dev/null +++ b/vendor/Zend/Mvc/ResponseSender/AbstractResponseSender.php @@ -0,0 +1,44 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\ResponseSender; + +use Zend\Http\Header\MultipleHeaderInterface; + +abstract class AbstractResponseSender implements ResponseSenderInterface +{ + /** + * Send HTTP headers + * + * @param SendResponseEvent $event + * @return self + */ + public function sendHeaders(SendResponseEvent $event) + { + if (headers_sent() || $event->headersSent()) { + return $this; + } + + $response = $event->getResponse(); + + foreach ($response->getHeaders() as $header) { + if ($header instanceof MultipleHeaderInterface) { + header($header->toString(), false); + continue; + } + header($header->toString()); + } + + $status = $response->renderStatusLine(); + header($status); + + $event->setHeadersSent(); + return $this; + } +} diff --git a/vendor/Zend/Mvc/ResponseSender/ConsoleResponseSender.php b/vendor/Zend/Mvc/ResponseSender/ConsoleResponseSender.php new file mode 100644 index 0000000..4aaa398 --- /dev/null +++ b/vendor/Zend/Mvc/ResponseSender/ConsoleResponseSender.php @@ -0,0 +1,50 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\ResponseSender; + +use Zend\Console\Response; + +class ConsoleResponseSender implements ResponseSenderInterface +{ + /** + * Send content + * + * @param SendResponseEvent $event + * @return ConsoleResponseSender + */ + public function sendContent(SendResponseEvent $event) + { + if ($event->contentSent()) { + return $this; + } + $response = $event->getResponse(); + echo $response->getContent(); + $event->setContentSent(); + return $this; + } + + /** + * Send the response + * + * @param SendResponseEvent $event + */ + public function __invoke(SendResponseEvent $event) + { + $response = $event->getResponse(); + if (!$response instanceof Response) { + return; + } + + $this->sendContent($event); + $errorLevel = (int) $response->getMetadata('errorLevel', 0); + $event->stopPropagation(true); + exit($errorLevel); + } +} diff --git a/vendor/Zend/Mvc/ResponseSender/HttpResponseSender.php b/vendor/Zend/Mvc/ResponseSender/HttpResponseSender.php new file mode 100644 index 0000000..5c129e6 --- /dev/null +++ b/vendor/Zend/Mvc/ResponseSender/HttpResponseSender.php @@ -0,0 +1,51 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\ResponseSender; + +use Zend\Http\Response; + +class HttpResponseSender extends AbstractResponseSender +{ + /** + * Send content + * + * @param SendResponseEvent $event + * @return HttpResponseSender + */ + public function sendContent(SendResponseEvent $event) + { + if ($event->contentSent()) { + return $this; + } + $response = $event->getResponse(); + echo $response->getContent(); + $event->setContentSent(); + return $this; + } + + /** + * Send HTTP response + * + * @param SendResponseEvent $event + * @return HttpResponseSender + */ + public function __invoke(SendResponseEvent $event) + { + $response = $event->getResponse(); + if (!$response instanceof Response) { + return $this; + } + + $this->sendHeaders($event) + ->sendContent($event); + $event->stopPropagation(true); + return $this; + } +} diff --git a/vendor/Zend/Mvc/ResponseSender/PhpEnvironmentResponseSender.php b/vendor/Zend/Mvc/ResponseSender/PhpEnvironmentResponseSender.php new file mode 100644 index 0000000..3fe5efb --- /dev/null +++ b/vendor/Zend/Mvc/ResponseSender/PhpEnvironmentResponseSender.php @@ -0,0 +1,34 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\ResponseSender; + +use Zend\Http\PhpEnvironment\Response; + +class PhpEnvironmentResponseSender extends HttpResponseSender +{ + /** + * Send php environment response + * + * @param SendResponseEvent $event + * @return PhpEnvironmentResponseSender + */ + public function __invoke(SendResponseEvent $event) + { + $response = $event->getResponse(); + if (!$response instanceof Response) { + return $this; + } + + $this->sendHeaders($event) + ->sendContent($event); + $event->stopPropagation(true); + return $this; + } +} diff --git a/vendor/Zend/Mvc/ResponseSender/ResponseSenderInterface.php b/vendor/Zend/Mvc/ResponseSender/ResponseSenderInterface.php new file mode 100644 index 0000000..de42f9a --- /dev/null +++ b/vendor/Zend/Mvc/ResponseSender/ResponseSenderInterface.php @@ -0,0 +1,21 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\ResponseSender; + +interface ResponseSenderInterface +{ + /** + * Send the response + * + * @param SendResponseEvent $event + * @return void + */ + public function __invoke(SendResponseEvent $event); +} diff --git a/vendor/Zend/Mvc/ResponseSender/SendResponseEvent.php b/vendor/Zend/Mvc/ResponseSender/SendResponseEvent.php new file mode 100644 index 0000000..768ffc2 --- /dev/null +++ b/vendor/Zend/Mvc/ResponseSender/SendResponseEvent.php @@ -0,0 +1,115 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\ResponseSender; + +use Zend\EventManager\Event; +use Zend\Stdlib\ResponseInterface; + +class SendResponseEvent extends Event +{ + /**#@+ + * Send response events triggered by eventmanager + */ + const EVENT_SEND_RESPONSE = 'sendResponse'; + /**#@-*/ + + /** + * @var string Event name + */ + protected $name = 'sendResponse'; + + /** + * @var ResponseInterface + */ + protected $response; + + /** + * @var array + */ + protected $headersSent = []; + + /** + * @var array + */ + protected $contentSent = []; + + /** + * @param ResponseInterface $response + * @return SendResponseEvent + */ + public function setResponse(ResponseInterface $response) + { + $this->setParam('response', $response); + $this->response = $response; + return $this; + } + + /** + * @return \Zend\Stdlib\ResponseInterface + */ + public function getResponse() + { + return $this->response; + } + + /** + * Set content sent for current response + * + * @return SendResponseEvent + */ + public function setContentSent() + { + $response = $this->getResponse(); + $contentSent = $this->getParam('contentSent', []); + $contentSent[spl_object_hash($response)] = true; + $this->setParam('contentSent', $contentSent); + $this->contentSent[spl_object_hash($response)] = true; + return $this; + } + + /** + * @return bool + */ + public function contentSent() + { + $response = $this->getResponse(); + if (isset($this->contentSent[spl_object_hash($response)])) { + return true; + } + return false; + } + + /** + * Set headers sent for current response object + * + * @return SendResponseEvent + */ + public function setHeadersSent() + { + $response = $this->getResponse(); + $headersSent = $this->getParam('headersSent', []); + $headersSent[spl_object_hash($response)] = true; + $this->setParam('headersSent', $headersSent); + $this->headersSent[spl_object_hash($response)] = true; + return $this; + } + + /** + * @return bool + */ + public function headersSent() + { + $response = $this->getResponse(); + if (isset($this->headersSent[spl_object_hash($response)])) { + return true; + } + return false; + } +} diff --git a/vendor/Zend/Mvc/ResponseSender/SimpleStreamResponseSender.php b/vendor/Zend/Mvc/ResponseSender/SimpleStreamResponseSender.php new file mode 100644 index 0000000..d238232 --- /dev/null +++ b/vendor/Zend/Mvc/ResponseSender/SimpleStreamResponseSender.php @@ -0,0 +1,51 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\ResponseSender; + +use Zend\Http\Response\Stream; + +class SimpleStreamResponseSender extends AbstractResponseSender +{ + /** + * Send the stream + * + * @param SendResponseEvent $event + * @return SimpleStreamResponseSender + */ + public function sendStream(SendResponseEvent $event) + { + if ($event->contentSent()) { + return $this; + } + $response = $event->getResponse(); + $stream = $response->getStream(); + fpassthru($stream); + $event->setContentSent(); + } + + /** + * Send stream response + * + * @param SendResponseEvent $event + * @return SimpleStreamResponseSender + */ + public function __invoke(SendResponseEvent $event) + { + $response = $event->getResponse(); + if (!$response instanceof Stream) { + return $this; + } + + $this->sendHeaders($event); + $this->sendStream($event); + $event->stopPropagation(true); + return $this; + } +} diff --git a/vendor/Zend/Mvc/RouteListener.php b/vendor/Zend/Mvc/RouteListener.php new file mode 100644 index 0000000..61343c6 --- /dev/null +++ b/vendor/Zend/Mvc/RouteListener.php @@ -0,0 +1,62 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc; + +use Zend\EventManager\AbstractListenerAggregate; +use Zend\EventManager\EventManagerInterface; + +class RouteListener extends AbstractListenerAggregate +{ + /** + * Attach to an event manager + * + * @param EventManagerInterface $events + * @param int $priority + * @return void + */ + public function attach(EventManagerInterface $events, $priority = 1) + { + $this->listeners[] = $events->attach(MvcEvent::EVENT_ROUTE, [$this, 'onRoute']); + } + + /** + * Listen to the "route" event and attempt to route the request + * + * If no matches are returned, triggers "dispatch.error" in order to + * create a 404 response. + * + * Seeds the event with the route match on completion. + * + * @param MvcEvent $e + * @return null|Router\RouteMatch + */ + public function onRoute($e) + { + $target = $e->getTarget(); + $request = $e->getRequest(); + $router = $e->getRouter(); + $routeMatch = $router->match($request); + + if (!$routeMatch instanceof Router\RouteMatch) { + $e->setName(MvcEvent::EVENT_DISPATCH_ERROR); + $e->setError(Application::ERROR_ROUTER_NO_MATCH); + + $results = $target->getEventManager()->triggerEvent($e); + if (count($results)) { + return $results->last(); + } + + return $e->getParams(); + } + + $e->setRouteMatch($routeMatch); + return $routeMatch; + } +} diff --git a/vendor/Zend/Mvc/Router/Console/Catchall.php b/vendor/Zend/Mvc/Router/Console/Catchall.php new file mode 100644 index 0000000..77e7d94 --- /dev/null +++ b/vendor/Zend/Mvc/Router/Console/Catchall.php @@ -0,0 +1,130 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +/** + * @namespace + */ +namespace Zend\Mvc\Router\Console; + +use Traversable; +use Zend\Console\Request as ConsoleRequest; +use Zend\Filter\FilterChain; +use Zend\Stdlib\RequestInterface as Request; +use Zend\Validator\ValidatorChain; + +/** + * Segment route. + * + * @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @see http://guides.rubyonrails.org/routing.html + */ +class Catchall implements RouteInterface +{ + /** + * Parts of the route. + * + * @var array + */ + protected $parts; + + /** + * Default values. + * + * @var array + */ + protected $defaults; + + /** + * Parameters' name aliases. + * + * @var array + */ + protected $aliases; + + /** + * List of assembled parameters. + * + * @var array + */ + protected $assembledParams = []; + + /** + * @var ValidatorChain + */ + protected $validators; + + /** + * @var FilterChain + */ + protected $filters; + + /** + * Create a new simple console route. + * + * @param array $defaults + * @return Catchall + */ + public function __construct(array $defaults = []) + { + $this->defaults = $defaults; + } + + /** + * factory(): defined by Route interface. + * + * @see \Zend\Mvc\Router\RouteInterface::factory() + * @param array|Traversable $options + * @return Simple + */ + public static function factory($options = []) + { + return new static(isset($options['defaults']) ? $options['defaults'] : []); + } + + /** + * match(): defined by Route interface. + * + * @see Route::match() + * @param Request $request + * @return RouteMatch + */ + public function match(Request $request) + { + if (!$request instanceof ConsoleRequest) { + return; + } + + return new RouteMatch($this->defaults); + } + + /** + * assemble(): Defined by Route interface. + * + * @see \Zend\Mvc\Router\RouteInterface::assemble() + * @param array $params + * @param array $options + * @return mixed + */ + public function assemble(array $params = [], array $options = []) + { + $this->assembledParams = []; + } + + /** + * getAssembledParams(): defined by Route interface. + * + * @see RouteInterface::getAssembledParams + * @return array + */ + public function getAssembledParams() + { + return $this->assembledParams; + } +} diff --git a/vendor/Zend/Mvc/Router/Console/RouteInterface.php b/vendor/Zend/Mvc/Router/Console/RouteInterface.php new file mode 100644 index 0000000..2a3c8c6 --- /dev/null +++ b/vendor/Zend/Mvc/Router/Console/RouteInterface.php @@ -0,0 +1,31 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +/** + * @namespace + */ +namespace Zend\Mvc\Router\Console; + +use Zend\Mvc\Router\RouteInterface as BaseRoute; + +/** + * Tree specific route interface. + * + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ +interface RouteInterface extends BaseRoute +{ + /** + * Get a list of parameters used while assembling. + * + * @return array + */ + public function getAssembledParams(); +} diff --git a/vendor/Zend/Mvc/Router/Console/RouteMatch.php b/vendor/Zend/Mvc/Router/Console/RouteMatch.php new file mode 100644 index 0000000..5de4746 --- /dev/null +++ b/vendor/Zend/Mvc/Router/Console/RouteMatch.php @@ -0,0 +1,88 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +/** + * @namespace + */ +namespace Zend\Mvc\Router\Console; + +use Zend\Mvc\Router\RouteMatch as BaseRouteMatch; + +/** + * Part route match. + * + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ +class RouteMatch extends BaseRouteMatch +{ + /** + * Length of the matched path. + * + * @var int + */ + protected $length; + + /** + * Create a part RouteMatch with given parameters and length. + * + * @param array $params + * @param int $length + */ + public function __construct(array $params, $length = 0) + { + parent::__construct($params); + + $this->length = $length; + } + + /** + * setMatchedRouteName(): defined by BaseRouteMatch. + * + * @see BaseRouteMatch::setMatchedRouteName() + * @param string $name + * @return self + */ + public function setMatchedRouteName($name) + { + if ($this->matchedRouteName === null) { + $this->matchedRouteName = $name; + } else { + $this->matchedRouteName = $name . '/' . $this->matchedRouteName; + } + + return $this; + } + + /** + * Merge parameters from another match. + * + * @param RouteMatch $match + * @return RouteMatch + */ + public function merge(RouteMatch $match) + { + $this->params = array_merge($this->params, $match->getParams()); + $this->length += $match->getLength(); + + $this->matchedRouteName = $match->getMatchedRouteName(); + + return $this; + } + + /** + * Get the matched path length. + * + * @return int + */ + public function getLength() + { + return $this->length; + } +} diff --git a/vendor/Zend/Mvc/Router/Console/Simple.php b/vendor/Zend/Mvc/Router/Console/Simple.php new file mode 100644 index 0000000..714c39d --- /dev/null +++ b/vendor/Zend/Mvc/Router/Console/Simple.php @@ -0,0 +1,171 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +/** + * @namespace + */ +namespace Zend\Mvc\Router\Console; + +use Traversable; +use Zend\Console\RouteMatcher\DefaultRouteMatcher; +use Zend\Console\Request as ConsoleRequest; +use Zend\Console\RouteMatcher\RouteMatcherInterface; +use Zend\Filter\FilterChain; +use Zend\Mvc\Router\Exception; +use Zend\Stdlib\ArrayUtils; +use Zend\Stdlib\RequestInterface as Request; +use Zend\Validator\ValidatorChain; + +/** + * Segment route. + * + * @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @see http://guides.rubyonrails.org/routing.html + */ +class Simple implements RouteInterface +{ + /** + * List of assembled parameters. + * + * @var array + */ + protected $assembledParams = []; + + /** + * @var RouteMatcherInterface + */ + protected $matcher; + + /** + * Create a new simple console route. + * + * @param string|RouteMatcherInterface $routeOrRouteMatcher + * @param array $constraints + * @param array $defaults + * @param array $aliases + * @param null|array|Traversable|FilterChain $filters + * @param null|array|Traversable|ValidatorChain $validators + * @throws Exception\InvalidArgumentException + */ + public function __construct( + $routeOrRouteMatcher, + array $constraints = [], + array $defaults = [], + array $aliases = [], + $filters = null, + $validators = null + ) { + if (is_string($routeOrRouteMatcher)) { + $this->matcher = new DefaultRouteMatcher($routeOrRouteMatcher, $constraints, $defaults, $aliases); + } elseif ($routeOrRouteMatcher instanceof RouteMatcherInterface) { + $this->matcher = $routeOrRouteMatcher; + } else { + throw new Exception\InvalidArgumentException( + "routeOrRouteMatcher should either be string, or class implementing RouteMatcherInterface. " + . gettype($routeOrRouteMatcher) . " was given." + ); + } + } + + /** + * factory(): defined by Route interface. + * + * @see \Zend\Mvc\Router\RouteInterface::factory() + * @param array|Traversable $options + * @throws Exception\InvalidArgumentException + * @return self + */ + public static function factory($options = []) + { + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } elseif (!is_array($options)) { + throw new Exception\InvalidArgumentException(__METHOD__ . ' expects an array or Traversable set of options'); + } + + if (!isset($options['route'])) { + throw new Exception\InvalidArgumentException('Missing "route" in options array'); + } + + foreach ([ + 'constraints', + 'defaults', + 'aliases', + ] as $opt) { + if (!isset($options[$opt])) { + $options[$opt] = []; + } + } + + if (!isset($options['validators'])) { + $options['validators'] = null; + } + + if (!isset($options['filters'])) { + $options['filters'] = null; + } + + return new static( + $options['route'], + $options['constraints'], + $options['defaults'], + $options['aliases'], + $options['filters'], + $options['validators'] + ); + } + + /** + * match(): defined by Route interface. + * + * @see Route::match() + * @param Request $request + * @param null|int $pathOffset + * @return RouteMatch + */ + public function match(Request $request, $pathOffset = null) + { + if (!$request instanceof ConsoleRequest) { + return; + } + + $params = $request->getParams()->toArray(); + $matches = $this->matcher->match($params); + + if (null !== $matches) { + return new RouteMatch($matches); + } + return; + } + + /** + * assemble(): Defined by Route interface. + * + * @see \Zend\Mvc\Router\RouteInterface::assemble() + * @param array $params + * @param array $options + * @return mixed + */ + public function assemble(array $params = [], array $options = []) + { + $this->assembledParams = []; + } + + /** + * getAssembledParams(): defined by Route interface. + * + * @see RouteInterface::getAssembledParams + * @return array + */ + public function getAssembledParams() + { + return $this->assembledParams; + } +} diff --git a/vendor/Zend/Mvc/Router/Console/SimpleRouteStack.php b/vendor/Zend/Mvc/Router/Console/SimpleRouteStack.php new file mode 100644 index 0000000..45f0a2d --- /dev/null +++ b/vendor/Zend/Mvc/Router/Console/SimpleRouteStack.php @@ -0,0 +1,102 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Router\Console; + +use Traversable; +use Zend\Mvc\Router\Exception; +use Zend\Mvc\Router\RouteInvokableFactory; +use Zend\Mvc\Router\SimpleRouteStack as BaseSimpleRouteStack; +use Zend\ServiceManager\Config; +use Zend\Stdlib\ArrayUtils; + +/** + * Tree search implementation. + */ +class SimpleRouteStack extends BaseSimpleRouteStack +{ + /** + * init(): defined by SimpleRouteStack. + * + * @see BaseSimpleRouteStack::init() + */ + protected function init() + { + (new Config([ + 'aliases' => [ + 'catchall' => Catchall::class, + 'catchAll' => Catchall::class, + 'Catchall' => Catchall::class, + 'CatchAll' => Catchall::class, + 'simple' => Simple::class, + 'Simple' => Simple::class, + ], + 'factories' => [ + Catchall::class => RouteInvokableFactory::class, + Simple::class => RouteInvokableFactory::class, + + // v2 normalized names + 'zendmvcrouterconsolecatchall' => RouteInvokableFactory::class, + 'zendmvcrouterconsolesimple' => RouteInvokableFactory::class, + ], + ]))->configureServiceManager($this->routePluginManager); + } + + /** + * addRoute(): defined by RouteStackInterface interface. + * + * @see RouteStackInterface::addRoute() + * @param string $name + * @param mixed $route + * @param int $priority + * @return SimpleRouteStack + */ + public function addRoute($name, $route, $priority = null) + { + if (!$route instanceof RouteInterface) { + $route = $this->routeFromArray($route); + } + + return parent::addRoute($name, $route, $priority); + } + + /** + * routeFromArray(): defined by SimpleRouteStack. + * + * @see BaseSimpleRouteStack::routeFromArray() + * @param array|Traversable $specs + * @return RouteInterface + * @throws Exception\InvalidArgumentException + * @throws Exception\RuntimeException + */ + protected function routeFromArray($specs) + { + if ($specs instanceof Traversable) { + $specs = ArrayUtils::iteratorToArray($specs); + } + + if (! is_array($specs)) { + throw new Exception\InvalidArgumentException('Route definition must be an array or Traversable object'); + } + + // default to 'simple' console route + if (! isset($specs['type'])) { + $specs['type'] = Simple::class; + } + + // build route object + $route = parent::routeFromArray($specs); + + if (! $route instanceof RouteInterface) { + throw new Exception\RuntimeException('Given route does not implement Console route interface'); + } + + return $route; + } +} diff --git a/vendor/Zend/Mvc/Router/Exception/ExceptionInterface.php b/vendor/Zend/Mvc/Router/Exception/ExceptionInterface.php new file mode 100644 index 0000000..42e2fad --- /dev/null +++ b/vendor/Zend/Mvc/Router/Exception/ExceptionInterface.php @@ -0,0 +1,16 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Router\Exception; + +use Zend\Mvc\Exception\ExceptionInterface as Exception; + +interface ExceptionInterface extends Exception +{ +} diff --git a/vendor/Zend/Mvc/Router/Exception/InvalidArgumentException.php b/vendor/Zend/Mvc/Router/Exception/InvalidArgumentException.php new file mode 100644 index 0000000..c0a7272 --- /dev/null +++ b/vendor/Zend/Mvc/Router/Exception/InvalidArgumentException.php @@ -0,0 +1,16 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Router\Exception; + +use Zend\Mvc\Exception; + +class InvalidArgumentException extends Exception\InvalidArgumentException implements ExceptionInterface +{ +} diff --git a/vendor/Zend/Mvc/Router/Exception/RuntimeException.php b/vendor/Zend/Mvc/Router/Exception/RuntimeException.php new file mode 100644 index 0000000..d722b95 --- /dev/null +++ b/vendor/Zend/Mvc/Router/Exception/RuntimeException.php @@ -0,0 +1,16 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Router\Exception; + +use Zend\Mvc\Exception; + +class RuntimeException extends Exception\RuntimeException implements ExceptionInterface +{ +} diff --git a/vendor/Zend/Mvc/Router/Http/Chain.php b/vendor/Zend/Mvc/Router/Http/Chain.php new file mode 100644 index 0000000..c4192f4 --- /dev/null +++ b/vendor/Zend/Mvc/Router/Http/Chain.php @@ -0,0 +1,190 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Router\Http; + +use ArrayObject; +use Traversable; +use Zend\Mvc\Router\Exception; +use Zend\Mvc\Router\PriorityList; +use Zend\Mvc\Router\RoutePluginManager; +use Zend\Stdlib\ArrayUtils; +use Zend\Stdlib\RequestInterface as Request; + +/** + * Chain route. + */ +class Chain extends TreeRouteStack implements RouteInterface +{ + /** + * Chain routes. + * + * @var array + */ + protected $chainRoutes; + + /** + * List of assembled parameters. + * + * @var array + */ + protected $assembledParams = []; + + /** + * Create a new part route. + * + * @param array $routes + * @param RoutePluginManager $routePlugins + * @param ArrayObject|null $prototypes + */ + public function __construct(array $routes, RoutePluginManager $routePlugins, ArrayObject $prototypes = null) + { + $this->chainRoutes = array_reverse($routes); + $this->routePluginManager = $routePlugins; + $this->routes = new PriorityList(); + $this->prototypes = $prototypes; + } + + /** + * factory(): defined by RouteInterface interface. + * + * @see \Zend\Mvc\Router\RouteInterface::factory() + * @param mixed $options + * @throws Exception\InvalidArgumentException + * @return Part + */ + public static function factory($options = []) + { + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } elseif (!is_array($options)) { + throw new Exception\InvalidArgumentException(__METHOD__ . ' expects an array or Traversable set of options'); + } + + if (!isset($options['routes'])) { + throw new Exception\InvalidArgumentException('Missing "routes" in options array'); + } + + if (!isset($options['prototypes'])) { + $options['prototypes'] = null; + } + + if ($options['routes'] instanceof Traversable) { + $options['routes'] = ArrayUtils::iteratorToArray($options['child_routes']); + } + + if (!isset($options['route_plugins'])) { + throw new Exception\InvalidArgumentException('Missing "route_plugins" in options array'); + } + + return new static( + $options['routes'], + $options['route_plugins'], + $options['prototypes'] + ); + } + + /** + * match(): defined by RouteInterface interface. + * + * @see \Zend\Mvc\Router\RouteInterface::match() + * @param Request $request + * @param int|null $pathOffset + * @param array $options + * @return RouteMatch|null + */ + public function match(Request $request, $pathOffset = null, array $options = []) + { + if (!method_exists($request, 'getUri')) { + return; + } + + if ($pathOffset === null) { + $mustTerminate = true; + $pathOffset = 0; + } else { + $mustTerminate = false; + } + + if ($this->chainRoutes !== null) { + $this->addRoutes($this->chainRoutes); + $this->chainRoutes = null; + } + + $match = new RouteMatch([]); + $uri = $request->getUri(); + $pathLength = strlen($uri->getPath()); + + foreach ($this->routes as $route) { + $subMatch = $route->match($request, $pathOffset, $options); + + if ($subMatch === null) { + return; + } + + $match->merge($subMatch); + $pathOffset += $subMatch->getLength(); + } + + if ($mustTerminate && $pathOffset !== $pathLength) { + return; + } + + return $match; + } + + /** + * assemble(): Defined by RouteInterface interface. + * + * @see \Zend\Mvc\Router\RouteInterface::assemble() + * @param array $params + * @param array $options + * @return mixed + */ + public function assemble(array $params = [], array $options = []) + { + if ($this->chainRoutes !== null) { + $this->addRoutes($this->chainRoutes); + $this->chainRoutes = null; + } + + $this->assembledParams = []; + + $routes = ArrayUtils::iteratorToArray($this->routes); + + end($routes); + $lastRouteKey = key($routes); + $path = ''; + + foreach ($routes as $key => $route) { + $chainOptions = $options; + $hasChild = isset($options['has_child']) ? $options['has_child'] : false; + + $chainOptions['has_child'] = ($hasChild || $key !== $lastRouteKey); + + $path .= $route->assemble($params, $chainOptions); + $params = array_diff_key($params, array_flip($route->getAssembledParams())); + + $this->assembledParams += $route->getAssembledParams(); + } + + return $path; + } + + /** + * getAssembledParams(): defined by RouteInterface interface. + * + * @see RouteInterface::getAssembledParams + * @return array + */ + public function getAssembledParams() + { + return $this->assembledParams; + } +} diff --git a/vendor/Zend/Mvc/Router/Http/Hostname.php b/vendor/Zend/Mvc/Router/Http/Hostname.php new file mode 100644 index 0000000..c488cc3 --- /dev/null +++ b/vendor/Zend/Mvc/Router/Http/Hostname.php @@ -0,0 +1,330 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Router\Http; + +use Traversable; +use Zend\Mvc\Router\Exception; +use Zend\Stdlib\ArrayUtils; +use Zend\Stdlib\RequestInterface as Request; + +/** + * Hostname route. + */ +class Hostname implements RouteInterface +{ + /** + * Parts of the route. + * + * @var array + */ + protected $parts; + + /** + * Regex used for matching the route. + * + * @var string + */ + protected $regex; + + /** + * Map from regex groups to parameter names. + * + * @var array + */ + protected $paramMap = []; + + /** + * Default values. + * + * @var array + */ + protected $defaults; + + /** + * List of assembled parameters. + * + * @var array + */ + protected $assembledParams = []; + + /** + * Create a new hostname route. + * + * @param string $route + * @param array $constraints + * @param array $defaults + */ + public function __construct($route, array $constraints = [], array $defaults = []) + { + $this->defaults = $defaults; + $this->parts = $this->parseRouteDefinition($route); + $this->regex = $this->buildRegex($this->parts, $constraints); + } + + /** + * factory(): defined by RouteInterface interface. + * + * @see \Zend\Mvc\Router\RouteInterface::factory() + * @param array|Traversable $options + * @return Hostname + * @throws Exception\InvalidArgumentException + */ + public static function factory($options = []) + { + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } elseif (!is_array($options)) { + throw new Exception\InvalidArgumentException(__METHOD__ . ' expects an array or Traversable set of options'); + } + + if (!isset($options['route'])) { + throw new Exception\InvalidArgumentException('Missing "route" in options array'); + } + + if (!isset($options['constraints'])) { + $options['constraints'] = []; + } + + if (!isset($options['defaults'])) { + $options['defaults'] = []; + } + + return new static($options['route'], $options['constraints'], $options['defaults']); + } + + /** + * Parse a route definition. + * + * @param string $def + * @return array + * @throws Exception\RuntimeException + */ + protected function parseRouteDefinition($def) + { + $currentPos = 0; + $length = strlen($def); + $parts = []; + $levelParts = [&$parts]; + $level = 0; + + while ($currentPos < $length) { + if (!preg_match('(\G(?P<literal>[a-z0-9-.]*)(?P<token>[:{\[\]]|$))', $def, $matches, 0, $currentPos)) { + throw new Exception\RuntimeException('Matched hostname literal contains a disallowed character'); + } + + $currentPos += strlen($matches[0]); + + if (!empty($matches['literal'])) { + $levelParts[$level][] = ['literal', $matches['literal']]; + } + + if ($matches['token'] === ':') { + if (!preg_match('(\G(?P<name>[^:.{\[\]]+)(?:{(?P<delimiters>[^}]+)})?:?)', $def, $matches, 0, $currentPos)) { + throw new Exception\RuntimeException('Found empty parameter name'); + } + + $levelParts[$level][] = ['parameter', $matches['name'], isset($matches['delimiters']) ? $matches['delimiters'] : null]; + + $currentPos += strlen($matches[0]); + } elseif ($matches['token'] === '[') { + $levelParts[$level][] = ['optional', []]; + $levelParts[$level + 1] = &$levelParts[$level][count($levelParts[$level]) - 1][1]; + + $level++; + } elseif ($matches['token'] === ']') { + unset($levelParts[$level]); + $level--; + + if ($level < 0) { + throw new Exception\RuntimeException('Found closing bracket without matching opening bracket'); + } + } else { + break; + } + } + + if ($level > 0) { + throw new Exception\RuntimeException('Found unbalanced brackets'); + } + + return $parts; + } + + /** + * Build the matching regex from parsed parts. + * + * @param array $parts + * @param array $constraints + * @param int $groupIndex + * @return string + * @throws Exception\RuntimeException + */ + protected function buildRegex(array $parts, array $constraints, &$groupIndex = 1) + { + $regex = ''; + + foreach ($parts as $part) { + switch ($part[0]) { + case 'literal': + $regex .= preg_quote($part[1]); + break; + + case 'parameter': + $groupName = '?P<param' . $groupIndex . '>'; + + if (isset($constraints[$part[1]])) { + $regex .= '(' . $groupName . $constraints[$part[1]] . ')'; + } elseif ($part[2] === null) { + $regex .= '(' . $groupName . '[^.]+)'; + } else { + $regex .= '(' . $groupName . '[^' . $part[2] . ']+)'; + } + + $this->paramMap['param' . $groupIndex++] = $part[1]; + break; + + case 'optional': + $regex .= '(?:' . $this->buildRegex($part[1], $constraints, $groupIndex) . ')?'; + break; + } + } + + return $regex; + } + + /** + * Build host. + * + * @param array $parts + * @param array $mergedParams + * @param bool $isOptional + * @return string + * @throws Exception\RuntimeException + * @throws Exception\InvalidArgumentException + */ + protected function buildHost(array $parts, array $mergedParams, $isOptional) + { + $host = ''; + $skip = true; + $skippable = false; + + foreach ($parts as $part) { + switch ($part[0]) { + case 'literal': + $host .= $part[1]; + break; + + case 'parameter': + $skippable = true; + + if (!isset($mergedParams[$part[1]])) { + if (!$isOptional) { + throw new Exception\InvalidArgumentException(sprintf('Missing parameter "%s"', $part[1])); + } + + return ''; + } elseif (!$isOptional || !isset($this->defaults[$part[1]]) || $this->defaults[$part[1]] !== $mergedParams[$part[1]]) { + $skip = false; + } + + $host .= $mergedParams[$part[1]]; + + $this->assembledParams[] = $part[1]; + break; + + case 'optional': + $skippable = true; + $optionalPart = $this->buildHost($part[1], $mergedParams, true); + + if ($optionalPart !== '') { + $host .= $optionalPart; + $skip = false; + } + break; + } + } + + if ($isOptional && $skippable && $skip) { + return ''; + } + + return $host; + } + + /** + * match(): defined by RouteInterface interface. + * + * @see \Zend\Mvc\Router\RouteInterface::match() + * @param Request $request + * @return RouteMatch|null + */ + public function match(Request $request) + { + if (!method_exists($request, 'getUri')) { + return; + } + + $uri = $request->getUri(); + $host = $uri->getHost(); + + $result = preg_match('(^' . $this->regex . '$)', $host, $matches); + + if (!$result) { + return; + } + + $params = []; + + foreach ($this->paramMap as $index => $name) { + if (isset($matches[$index]) && $matches[$index] !== '') { + $params[$name] = $matches[$index]; + } + } + + return new RouteMatch(array_merge($this->defaults, $params)); + } + + /** + * assemble(): Defined by RouteInterface interface. + * + * @see \Zend\Mvc\Router\RouteInterface::assemble() + * @param array $params + * @param array $options + * @return mixed + */ + public function assemble(array $params = [], array $options = []) + { + $this->assembledParams = []; + + if (isset($options['uri'])) { + $host = $this->buildHost( + $this->parts, + array_merge($this->defaults, $params), + false + ); + + $options['uri']->setHost($host); + } + + // A hostname does not contribute to the path, thus nothing is returned. + return ''; + } + + /** + * getAssembledParams(): defined by RouteInterface interface. + * + * @see RouteInterface::getAssembledParams + * @return array + */ + public function getAssembledParams() + { + return $this->assembledParams; + } +} diff --git a/vendor/Zend/Mvc/Router/Http/Literal.php b/vendor/Zend/Mvc/Router/Http/Literal.php new file mode 100644 index 0000000..cfafdf2 --- /dev/null +++ b/vendor/Zend/Mvc/Router/Http/Literal.php @@ -0,0 +1,132 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Router\Http; + +use Traversable; +use Zend\Mvc\Router\Exception; +use Zend\Stdlib\ArrayUtils; +use Zend\Stdlib\RequestInterface as Request; + +/** + * Literal route. + */ +class Literal implements RouteInterface +{ + /** + * RouteInterface to match. + * + * @var string + */ + protected $route; + + /** + * Default values. + * + * @var array + */ + protected $defaults; + + /** + * Create a new literal route. + * + * @param string $route + * @param array $defaults + */ + public function __construct($route, array $defaults = []) + { + $this->route = $route; + $this->defaults = $defaults; + } + + /** + * factory(): defined by RouteInterface interface. + * + * @see \Zend\Mvc\Router\RouteInterface::factory() + * @param array|Traversable $options + * @return Literal + * @throws Exception\InvalidArgumentException + */ + public static function factory($options = []) + { + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } elseif (!is_array($options)) { + throw new Exception\InvalidArgumentException(__METHOD__ . ' expects an array or Traversable set of options'); + } + + if (!isset($options['route'])) { + throw new Exception\InvalidArgumentException('Missing "route" in options array'); + } + + if (!isset($options['defaults'])) { + $options['defaults'] = []; + } + + return new static($options['route'], $options['defaults']); + } + + /** + * match(): defined by RouteInterface interface. + * + * @see \Zend\Mvc\Router\RouteInterface::match() + * @param Request $request + * @param integer|null $pathOffset + * @return RouteMatch|null + */ + public function match(Request $request, $pathOffset = null) + { + if (!method_exists($request, 'getUri')) { + return; + } + + $uri = $request->getUri(); + $path = $uri->getPath(); + + if ($pathOffset !== null) { + if ($pathOffset >= 0 && strlen($path) >= $pathOffset && !empty($this->route)) { + if (strpos($path, $this->route, $pathOffset) === $pathOffset) { + return new RouteMatch($this->defaults, strlen($this->route)); + } + } + + return; + } + + if ($path === $this->route) { + return new RouteMatch($this->defaults, strlen($this->route)); + } + + return; + } + + /** + * assemble(): Defined by RouteInterface interface. + * + * @see \Zend\Mvc\Router\RouteInterface::assemble() + * @param array $params + * @param array $options + * @return mixed + */ + public function assemble(array $params = [], array $options = []) + { + return $this->route; + } + + /** + * getAssembledParams(): defined by RouteInterface interface. + * + * @see RouteInterface::getAssembledParams + * @return array + */ + public function getAssembledParams() + { + return []; + } +} diff --git a/vendor/Zend/Mvc/Router/Http/Method.php b/vendor/Zend/Mvc/Router/Http/Method.php new file mode 100644 index 0000000..f8c4402 --- /dev/null +++ b/vendor/Zend/Mvc/Router/Http/Method.php @@ -0,0 +1,123 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Router\Http; + +use Traversable; +use Zend\Mvc\Router\Exception; +use Zend\Stdlib\ArrayUtils; +use Zend\Stdlib\RequestInterface as Request; + +/** + * Method route. + */ +class Method implements RouteInterface +{ + /** + * Verb to match. + * + * @var string + */ + protected $verb; + + /** + * Default values. + * + * @var array + */ + protected $defaults; + + /** + * Create a new method route. + * + * @param string $verb + * @param array $defaults + */ + public function __construct($verb, array $defaults = []) + { + $this->verb = $verb; + $this->defaults = $defaults; + } + + /** + * factory(): defined by RouteInterface interface. + * + * @see \Zend\Mvc\Router\RouteInterface::factory() + * @param array|Traversable $options + * @return Method + * @throws Exception\InvalidArgumentException + */ + public static function factory($options = []) + { + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } elseif (!is_array($options)) { + throw new Exception\InvalidArgumentException(__METHOD__ . ' expects an array or Traversable set of options'); + } + + if (!isset($options['verb'])) { + throw new Exception\InvalidArgumentException('Missing "verb" in options array'); + } + + if (!isset($options['defaults'])) { + $options['defaults'] = []; + } + + return new static($options['verb'], $options['defaults']); + } + + /** + * match(): defined by RouteInterface interface. + * + * @see \Zend\Mvc\Router\RouteInterface::match() + * @param Request $request + * @return RouteMatch|null + */ + public function match(Request $request) + { + if (!method_exists($request, 'getMethod')) { + return; + } + + $requestVerb = strtoupper($request->getMethod()); + $matchVerbs = explode(',', strtoupper($this->verb)); + $matchVerbs = array_map('trim', $matchVerbs); + + if (in_array($requestVerb, $matchVerbs)) { + return new RouteMatch($this->defaults); + } + + return; + } + + /** + * assemble(): Defined by RouteInterface interface. + * + * @see \Zend\Mvc\Router\RouteInterface::assemble() + * @param array $params + * @param array $options + * @return mixed + */ + public function assemble(array $params = [], array $options = []) + { + // The request method does not contribute to the path, thus nothing is returned. + return ''; + } + + /** + * getAssembledParams(): defined by RouteInterface interface. + * + * @see RouteInterface::getAssembledParams + * @return array + */ + public function getAssembledParams() + { + return []; + } +} diff --git a/vendor/Zend/Mvc/Router/Http/Part.php b/vendor/Zend/Mvc/Router/Http/Part.php new file mode 100644 index 0000000..4f97f56 --- /dev/null +++ b/vendor/Zend/Mvc/Router/Http/Part.php @@ -0,0 +1,242 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Router\Http; + +use ArrayObject; +use Traversable; +use Zend\Mvc\Router\Exception; +use Zend\Mvc\Router\PriorityList; +use Zend\Mvc\Router\RoutePluginManager; +use Zend\Stdlib\ArrayUtils; +use Zend\Stdlib\RequestInterface as Request; + +/** + * Part route. + */ +class Part extends TreeRouteStack implements RouteInterface +{ + /** + * RouteInterface to match. + * + * @var RouteInterface + */ + protected $route; + + /** + * Whether the route may terminate. + * + * @var bool + */ + protected $mayTerminate; + + /** + * Child routes. + * + * @var mixed + */ + protected $childRoutes; + + /** + * Create a new part route. + * + * @param mixed $route + * @param bool $mayTerminate + * @param RoutePluginManager $routePlugins + * @param array|null $childRoutes + * @param ArrayObject|null $prototypes + * @throws Exception\InvalidArgumentException + */ + public function __construct($route, $mayTerminate, RoutePluginManager $routePlugins, array $childRoutes = null, ArrayObject $prototypes = null) + { + $this->routePluginManager = $routePlugins; + + if (!$route instanceof RouteInterface) { + $route = $this->routeFromArray($route); + } + + if ($route instanceof self) { + throw new Exception\InvalidArgumentException('Base route may not be a part route'); + } + + $this->route = $route; + $this->mayTerminate = $mayTerminate; + $this->childRoutes = $childRoutes; + $this->prototypes = $prototypes; + $this->routes = new PriorityList(); + } + + /** + * factory(): defined by RouteInterface interface. + * + * @see \Zend\Mvc\Router\RouteInterface::factory() + * @param mixed $options + * @return Part + * @throws Exception\InvalidArgumentException + */ + public static function factory($options = []) + { + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } elseif (!is_array($options)) { + throw new Exception\InvalidArgumentException(__METHOD__ . ' expects an array or Traversable set of options'); + } + + if (!isset($options['route'])) { + throw new Exception\InvalidArgumentException('Missing "route" in options array'); + } + + if (!isset($options['route_plugins'])) { + throw new Exception\InvalidArgumentException('Missing "route_plugins" in options array'); + } + + if (!isset($options['prototypes'])) { + $options['prototypes'] = null; + } + + if (!isset($options['may_terminate'])) { + $options['may_terminate'] = false; + } + + if (!isset($options['child_routes']) || !$options['child_routes']) { + $options['child_routes'] = null; + } + + if ($options['child_routes'] instanceof Traversable) { + $options['child_routes'] = ArrayUtils::iteratorToArray($options['child_routes']); + } + + return new static( + $options['route'], + $options['may_terminate'], + $options['route_plugins'], + $options['child_routes'], + $options['prototypes'] + ); + } + + /** + * match(): defined by RouteInterface interface. + * + * @see \Zend\Mvc\Router\RouteInterface::match() + * @param Request $request + * @param integer|null $pathOffset + * @param array $options + * @return RouteMatch|null + */ + public function match(Request $request, $pathOffset = null, array $options = []) + { + if ($pathOffset === null) { + $pathOffset = 0; + } + + $match = $this->route->match($request, $pathOffset, $options); + + if ($match !== null && method_exists($request, 'getUri')) { + if ($this->childRoutes !== null) { + $this->addRoutes($this->childRoutes); + $this->childRoutes = null; + } + + $nextOffset = $pathOffset + $match->getLength(); + + $uri = $request->getUri(); + $pathLength = strlen($uri->getPath()); + + if ($this->mayTerminate && $nextOffset === $pathLength) { + $query = $uri->getQuery(); + if ('' == trim($query) || !$this->hasQueryChild()) { + return $match; + } + } + + if (isset($options['translator']) && !isset($options['locale']) && null !== ($locale = $match->getParam('locale', null))) { + $options['locale'] = $locale; + } + + foreach ($this->routes as $name => $route) { + if (($subMatch = $route->match($request, $nextOffset, $options)) instanceof RouteMatch) { + if ($match->getLength() + $subMatch->getLength() + $pathOffset === $pathLength) { + return $match->merge($subMatch)->setMatchedRouteName($name); + } + } + } + } + + return; + } + + /** + * assemble(): Defined by RouteInterface interface. + * + * @see \Zend\Mvc\Router\RouteInterface::assemble() + * @param array $params + * @param array $options + * @return mixed + * @throws Exception\RuntimeException + */ + public function assemble(array $params = [], array $options = []) + { + if ($this->childRoutes !== null) { + $this->addRoutes($this->childRoutes); + $this->childRoutes = null; + } + + $options['has_child'] = (isset($options['name'])); + + if (isset($options['translator']) && !isset($options['locale']) && isset($params['locale'])) { + $options['locale'] = $params['locale']; + } + + $path = $this->route->assemble($params, $options); + $params = array_diff_key($params, array_flip($this->route->getAssembledParams())); + + if (!isset($options['name'])) { + if (!$this->mayTerminate) { + throw new Exception\RuntimeException('Part route may not terminate'); + } else { + return $path; + } + } + + unset($options['has_child']); + $options['only_return_path'] = true; + $path .= parent::assemble($params, $options); + + return $path; + } + + /** + * getAssembledParams(): defined by RouteInterface interface. + * + * @see RouteInterface::getAssembledParams + * @return array + */ + public function getAssembledParams() + { + // Part routes may not occur as base route of other part routes, so we + // don't have to return anything here. + return []; + } + + /** + * Is one of the child routes a query route? + * + * @return bool + */ + protected function hasQueryChild() + { + foreach ($this->routes as $route) { + if ($route instanceof Query) { + return true; + } + } + return false; + } +} diff --git a/vendor/Zend/Mvc/Router/Http/Query.php b/vendor/Zend/Mvc/Router/Http/Query.php new file mode 100644 index 0000000..c04799c --- /dev/null +++ b/vendor/Zend/Mvc/Router/Http/Query.php @@ -0,0 +1,146 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Router\Http; + +use Traversable; +use Zend\Mvc\Router\Exception; +use Zend\Stdlib\ArrayUtils; +use Zend\Stdlib\RequestInterface as Request; + +/** + * Query route. + * + * @deprecated + */ +class Query implements RouteInterface +{ + /** + * Default values. + * + * @var array + */ + protected $defaults; + + /** + * List of assembled parameters. + * + * @var array + */ + protected $assembledParams = []; + + /** + * Create a new wildcard route. + * + * @param array $defaults + */ + public function __construct(array $defaults = []) + { + /** + * Legacy purposes only, to prevent code that uses it from breaking. + */ + trigger_error('Query route deprecated as of ZF 2.1.4; use the "query" option of the HTTP router\'s assembling method instead', E_USER_DEPRECATED); + $this->defaults = $defaults; + } + + /** + * factory(): defined by RouteInterface interface. + * + * @see \Zend\Mvc\Router\RouteInterface::factory() + * @param array|Traversable $options + * @return Query + * @throws Exception\InvalidArgumentException + */ + public static function factory($options = []) + { + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } elseif (!is_array($options)) { + throw new Exception\InvalidArgumentException(__METHOD__ . ' expects an array or Traversable set of options'); + } + + if (!isset($options['defaults'])) { + $options['defaults'] = []; + } + + return new static($options['defaults']); + } + + /** + * match(): defined by RouteInterface interface. + * + * @see \Zend\Mvc\Router\RouteInterface::match() + * @param Request $request + * @return RouteMatch + */ + public function match(Request $request) + { + // We don't merge the query parameters into the rotue match here because + // of possible security problems. Use the Query object instead which is + // included in the Request object. + return new RouteMatch($this->defaults); + } + + /** + * Recursively urldecodes keys and values from an array + * + * @param array $array + * @return array + */ + protected function recursiveUrldecode(array $array) + { + $matches = []; + + foreach ($array as $key => $value) { + if (is_array($value)) { + $matches[urldecode($key)] = $this->recursiveUrldecode($value); + } else { + $matches[urldecode($key)] = urldecode($value); + } + } + + return $matches; + } + + /** + * assemble(): Defined by RouteInterface interface. + * + * @see \Zend\Mvc\Router\RouteInterface::assemble() + * @param array $params + * @param array $options + * @return mixed + */ + public function assemble(array $params = [], array $options = []) + { + $mergedParams = array_merge($this->defaults, $params); + $this->assembledParams = []; + + if (isset($options['uri']) && count($mergedParams)) { + foreach ($mergedParams as $key => $value) { + $this->assembledParams[] = $key; + } + + $options['uri']->setQuery($mergedParams); + } + + // A query does not contribute to the path, thus nothing is returned. + return ''; + } + + /** + * getAssembledParams(): defined by RouteInterface interface. + * + * @see RouteInterface::getAssembledParams + * @return array + */ + public function getAssembledParams() + { + return $this->assembledParams; + } +} diff --git a/vendor/Zend/Mvc/Router/Http/Regex.php b/vendor/Zend/Mvc/Router/Http/Regex.php new file mode 100644 index 0000000..3cb0cd1 --- /dev/null +++ b/vendor/Zend/Mvc/Router/Http/Regex.php @@ -0,0 +1,174 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Router\Http; + +use Traversable; +use Zend\Mvc\Router\Exception; +use Zend\Stdlib\ArrayUtils; +use Zend\Stdlib\RequestInterface as Request; + +/** + * Regex route. + */ +class Regex implements RouteInterface +{ + /** + * Regex to match. + * + * @var string + */ + protected $regex; + + /** + * Default values. + * + * @var array + */ + protected $defaults; + + /** + * Specification for URL assembly. + * + * Parameters accepting substitutions should be denoted as "%key%" + * + * @var string + */ + protected $spec; + + /** + * List of assembled parameters. + * + * @var array + */ + protected $assembledParams = []; + + /** + * Create a new regex route. + * + * @param string $regex + * @param string $spec + * @param array $defaults + */ + public function __construct($regex, $spec, array $defaults = []) + { + $this->regex = $regex; + $this->spec = $spec; + $this->defaults = $defaults; + } + + /** + * factory(): defined by RouteInterface interface. + * + * @see \Zend\Mvc\Router\RouteInterface::factory() + * @param array|Traversable $options + * @return Regex + * @throws \Zend\Mvc\Router\Exception\InvalidArgumentException + */ + public static function factory($options = []) + { + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } elseif (!is_array($options)) { + throw new Exception\InvalidArgumentException(__METHOD__ . ' expects an array or Traversable set of options'); + } + + if (!isset($options['regex'])) { + throw new Exception\InvalidArgumentException('Missing "regex" in options array'); + } + + if (!isset($options['spec'])) { + throw new Exception\InvalidArgumentException('Missing "spec" in options array'); + } + + if (!isset($options['defaults'])) { + $options['defaults'] = []; + } + + return new static($options['regex'], $options['spec'], $options['defaults']); + } + + /** + * match(): defined by RouteInterface interface. + * + * @param Request $request + * @param int $pathOffset + * @return RouteMatch|null + */ + public function match(Request $request, $pathOffset = null) + { + if (!method_exists($request, 'getUri')) { + return; + } + + $uri = $request->getUri(); + $path = $uri->getPath(); + + if ($pathOffset !== null) { + $result = preg_match('(\G' . $this->regex . ')', $path, $matches, null, $pathOffset); + } else { + $result = preg_match('(^' . $this->regex . '$)', $path, $matches); + } + + if (!$result) { + die("here"); + return; + } + + $matchedLength = strlen($matches[0]); + + foreach ($matches as $key => $value) { + if (is_numeric($key) || is_int($key) || $value === '') { + unset($matches[$key]); + } else { + $matches[$key] = rawurldecode($value); + } + } + var_dump($matches); + return new RouteMatch(array_merge($this->defaults, $matches), $matchedLength); + } + + /** + * assemble(): Defined by RouteInterface interface. + * + * @see \Zend\Mvc\Router\RouteInterface::assemble() + * @param array $params + * @param array $options + * @return mixed + */ + public function assemble(array $params = [], array $options = []) + { + $url = $this->spec; + $mergedParams = array_merge($this->defaults, $params); + $this->assembledParams = []; + + foreach ($mergedParams as $key => $value) { + $spec = '%' . $key . '%'; + + if (strpos($url, $spec) !== false) { + $url = str_replace($spec, rawurlencode($value), $url); + + $this->assembledParams[] = $key; + } + } + + return $url; + } + + /** + * getAssembledParams(): defined by RouteInterface interface. + * + * @see RouteInterface::getAssembledParams + * @return array + */ + public function getAssembledParams() + { + return $this->assembledParams; + } +} diff --git a/vendor/Zend/Mvc/Router/Http/RouteInterface.php b/vendor/Zend/Mvc/Router/Http/RouteInterface.php new file mode 100644 index 0000000..50d5f3f --- /dev/null +++ b/vendor/Zend/Mvc/Router/Http/RouteInterface.php @@ -0,0 +1,25 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Router\Http; + +use Zend\Mvc\Router\RouteInterface as BaseRoute; + +/** + * Tree specific route interface. + */ +interface RouteInterface extends BaseRoute +{ + /** + * Get a list of parameters used while assembling. + * + * @return array + */ + public function getAssembledParams(); +} diff --git a/vendor/Zend/Mvc/Router/Http/RouteMatch.php b/vendor/Zend/Mvc/Router/Http/RouteMatch.php new file mode 100644 index 0000000..f1864f2 --- /dev/null +++ b/vendor/Zend/Mvc/Router/Http/RouteMatch.php @@ -0,0 +1,82 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Router\Http; + +use Zend\Mvc\Router\RouteMatch as BaseRouteMatch; + +/** + * Part route match. + */ +class RouteMatch extends BaseRouteMatch +{ + /** + * Length of the matched path. + * + * @var int + */ + protected $length; + + /** + * Create a part RouteMatch with given parameters and length. + * + * @param array $params + * @param int $length + */ + public function __construct(array $params, $length = 0) + { + parent::__construct($params); + + $this->length = $length; + } + + /** + * setMatchedRouteName(): defined by BaseRouteMatch. + * + * @see BaseRouteMatch::setMatchedRouteName() + * @param string $name + * @return RouteMatch + */ + public function setMatchedRouteName($name) + { + if ($this->matchedRouteName === null) { + $this->matchedRouteName = $name; + } else { + $this->matchedRouteName = $name . '/' . $this->matchedRouteName; + } + + return $this; + } + + /** + * Merge parameters from another match. + * + * @param RouteMatch $match + * @return RouteMatch + */ + public function merge(RouteMatch $match) + { + $this->params = array_merge($this->params, $match->getParams()); + $this->length += $match->getLength(); + + $this->matchedRouteName = $match->getMatchedRouteName(); + + return $this; + } + + /** + * Get the matched path length. + * + * @return int + */ + public function getLength() + { + return $this->length; + } +} diff --git a/vendor/Zend/Mvc/Router/Http/Scheme.php b/vendor/Zend/Mvc/Router/Http/Scheme.php new file mode 100644 index 0000000..8677536 --- /dev/null +++ b/vendor/Zend/Mvc/Router/Http/Scheme.php @@ -0,0 +1,126 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Router\Http; + +use Traversable; +use Zend\Mvc\Router\Exception; +use Zend\Stdlib\ArrayUtils; +use Zend\Stdlib\RequestInterface as Request; + +/** + * Scheme route. + */ +class Scheme implements RouteInterface +{ + /** + * Scheme to match. + * + * @var string + */ + protected $scheme; + + /** + * Default values. + * + * @var array + */ + protected $defaults; + + /** + * Create a new scheme route. + * + * @param string $scheme + * @param array $defaults + */ + public function __construct($scheme, array $defaults = []) + { + $this->scheme = $scheme; + $this->defaults = $defaults; + } + + /** + * factory(): defined by RouteInterface interface. + * + * @see \Zend\Mvc\Router\RouteInterface::factory() + * @param array|Traversable $options + * @return Scheme + * @throws Exception\InvalidArgumentException + */ + public static function factory($options = []) + { + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } elseif (!is_array($options)) { + throw new Exception\InvalidArgumentException(__METHOD__ . ' expects an array or Traversable set of options'); + } + + if (!isset($options['scheme'])) { + throw new Exception\InvalidArgumentException('Missing "scheme" in options array'); + } + + if (!isset($options['defaults'])) { + $options['defaults'] = []; + } + + return new static($options['scheme'], $options['defaults']); + } + + /** + * match(): defined by RouteInterface interface. + * + * @see \Zend\Mvc\Router\RouteInterface::match() + * @param Request $request + * @return RouteMatch|null + */ + public function match(Request $request) + { + if (!method_exists($request, 'getUri')) { + return; + } + + $uri = $request->getUri(); + $scheme = $uri->getScheme(); + + if ($scheme !== $this->scheme) { + return; + } + + return new RouteMatch($this->defaults); + } + + /** + * assemble(): Defined by RouteInterface interface. + * + * @see \Zend\Mvc\Router\RouteInterface::assemble() + * @param array $params + * @param array $options + * @return mixed + */ + public function assemble(array $params = [], array $options = []) + { + if (isset($options['uri'])) { + $options['uri']->setScheme($this->scheme); + } + + // A scheme does not contribute to the path, thus nothing is returned. + return ''; + } + + /** + * getAssembledParams(): defined by RouteInterface interface. + * + * @see RouteInterface::getAssembledParams + * @return array + */ + public function getAssembledParams() + { + return []; + } +} diff --git a/vendor/Zend/Mvc/Router/Http/Segment.php b/vendor/Zend/Mvc/Router/Http/Segment.php new file mode 100644 index 0000000..9a6b0a5 --- /dev/null +++ b/vendor/Zend/Mvc/Router/Http/Segment.php @@ -0,0 +1,449 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Router\Http; + +use Traversable; +use Zend\I18n\Translator\TranslatorInterface as Translator; +use Zend\Mvc\Router\Exception; +use Zend\Stdlib\ArrayUtils; +use Zend\Stdlib\RequestInterface as Request; + +/** + * Segment route. + */ +class Segment implements RouteInterface +{ + /** + * Cache for the encode output. + * + * @var array + */ + protected static $cacheEncode = []; + + /** + * Map of allowed special chars in path segments. + * + * http://tools.ietf.org/html/rfc3986#appendix-A + * segement = *pchar + * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" + * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" + * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" + * / "*" / "+" / "," / ";" / "=" + * + * @var array + */ + protected static $urlencodeCorrectionMap = [ + '%21' => "!", // sub-delims + '%24' => "$", // sub-delims + '%26' => "&", // sub-delims + '%27' => "'", // sub-delims + '%28' => "(", // sub-delims + '%29' => ")", // sub-delims + '%2A' => "*", // sub-delims + '%2B' => "+", // sub-delims + '%2C' => ",", // sub-delims +// '%2D' => "-", // unreserved - not touched by rawurlencode +// '%2E' => ".", // unreserved - not touched by rawurlencode + '%3A' => ":", // pchar + '%3B' => ";", // sub-delims + '%3D' => "=", // sub-delims + '%40' => "@", // pchar +// '%5F' => "_", // unreserved - not touched by rawurlencode +// '%7E' => "~", // unreserved - not touched by rawurlencode + ]; + + /** + * Parts of the route. + * + * @var array + */ + protected $parts; + + /** + * Regex used for matching the route. + * + * @var string + */ + protected $regex; + + /** + * Map from regex groups to parameter names. + * + * @var array + */ + protected $paramMap = []; + + /** + * Default values. + * + * @var array + */ + protected $defaults; + + /** + * List of assembled parameters. + * + * @var array + */ + protected $assembledParams = []; + + /** + * Translation keys used in the regex. + * + * @var array + */ + protected $translationKeys = []; + + /** + * Create a new regex route. + * + * @param string $route + * @param array $constraints + * @param array $defaults + */ + public function __construct($route, array $constraints = [], array $defaults = []) + { + $this->defaults = $defaults; + $this->parts = $this->parseRouteDefinition($route); + $this->regex = $this->buildRegex($this->parts, $constraints); + } + + /** + * factory(): defined by RouteInterface interface. + * + * @see \Zend\Mvc\Router\RouteInterface::factory() + * @param array|Traversable $options + * @return Segment + * @throws Exception\InvalidArgumentException + */ + public static function factory($options = []) + { + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } elseif (!is_array($options)) { + throw new Exception\InvalidArgumentException(__METHOD__ . ' expects an array or Traversable set of options'); + } + + if (!isset($options['route'])) { + throw new Exception\InvalidArgumentException('Missing "route" in options array'); + } + + if (!isset($options['constraints'])) { + $options['constraints'] = []; + } + + if (!isset($options['defaults'])) { + $options['defaults'] = []; + } + + return new static($options['route'], $options['constraints'], $options['defaults']); + } + + /** + * Parse a route definition. + * + * @param string $def + * @return array + * @throws Exception\RuntimeException + */ + protected function parseRouteDefinition($def) + { + $currentPos = 0; + $length = strlen($def); + $parts = []; + $levelParts = [&$parts]; + $level = 0; + + while ($currentPos < $length) { + preg_match('(\G(?P<literal>[^:{\[\]]*)(?P<token>[:{\[\]]|$))', $def, $matches, 0, $currentPos); + + $currentPos += strlen($matches[0]); + + if (!empty($matches['literal'])) { + $levelParts[$level][] = ['literal', $matches['literal']]; + } + + if ($matches['token'] === ':') { + if (!preg_match('(\G(?P<name>[^:/{\[\]]+)(?:{(?P<delimiters>[^}]+)})?:?)', $def, $matches, 0, $currentPos)) { + throw new Exception\RuntimeException('Found empty parameter name'); + } + + $levelParts[$level][] = ['parameter', $matches['name'], isset($matches['delimiters']) ? $matches['delimiters'] : null]; + + $currentPos += strlen($matches[0]); + } elseif ($matches['token'] === '{') { + if (!preg_match('(\G(?P<literal>[^}]+)\})', $def, $matches, 0, $currentPos)) { + throw new Exception\RuntimeException('Translated literal missing closing bracket'); + } + + $currentPos += strlen($matches[0]); + + $levelParts[$level][] = ['translated-literal', $matches['literal']]; + } elseif ($matches['token'] === '[') { + $levelParts[$level][] = ['optional', []]; + $levelParts[$level + 1] = &$levelParts[$level][count($levelParts[$level]) - 1][1]; + + $level++; + } elseif ($matches['token'] === ']') { + unset($levelParts[$level]); + $level--; + + if ($level < 0) { + throw new Exception\RuntimeException('Found closing bracket without matching opening bracket'); + } + } else { + break; + } + } + + if ($level > 0) { + throw new Exception\RuntimeException('Found unbalanced brackets'); + } + + return $parts; + } + + /** + * Build the matching regex from parsed parts. + * + * @param array $parts + * @param array $constraints + * @param int $groupIndex + * @return string + */ + protected function buildRegex(array $parts, array $constraints, &$groupIndex = 1) + { + $regex = ''; + + foreach ($parts as $part) { + switch ($part[0]) { + case 'literal': + $regex .= preg_quote($part[1]); + break; + + case 'parameter': + $groupName = '?P<param' . $groupIndex . '>'; + + if (isset($constraints[$part[1]])) { + $regex .= '(' . $groupName . $constraints[$part[1]] . ')'; + } elseif ($part[2] === null) { + $regex .= '(' . $groupName . '[^/]+)'; + } else { + $regex .= '(' . $groupName . '[^' . $part[2] . ']+)'; + } + + $this->paramMap['param' . $groupIndex++] = $part[1]; + break; + + case 'optional': + $regex .= '(?:' . $this->buildRegex($part[1], $constraints, $groupIndex) . ')?'; + break; + + case 'translated-literal': + $regex .= '#' . $part[1] . '#'; + $this->translationKeys[] = $part[1]; + break; + } + } + + return $regex; + } + + /** + * Build a path. + * + * @param array $parts + * @param array $mergedParams + * @param bool $isOptional + * @param bool $hasChild + * @param array $options + * @return string + * @throws Exception\InvalidArgumentException + * @throws Exception\RuntimeException + */ + protected function buildPath(array $parts, array $mergedParams, $isOptional, $hasChild, array $options) + { + if ($this->translationKeys) { + if (!isset($options['translator']) || !$options['translator'] instanceof Translator) { + throw new Exception\RuntimeException('No translator provided'); + } + + $translator = $options['translator']; + $textDomain = (isset($options['text_domain']) ? $options['text_domain'] : 'default'); + $locale = (isset($options['locale']) ? $options['locale'] : null); + } + + $path = ''; + $skip = true; + $skippable = false; + + foreach ($parts as $part) { + switch ($part[0]) { + case 'literal': + $path .= $part[1]; + break; + + case 'parameter': + $skippable = true; + + if (!isset($mergedParams[$part[1]])) { + if (!$isOptional || $hasChild) { + throw new Exception\InvalidArgumentException(sprintf('Missing parameter "%s"', $part[1])); + } + + return ''; + } elseif (!$isOptional || $hasChild || !isset($this->defaults[$part[1]]) || $this->defaults[$part[1]] !== $mergedParams[$part[1]]) { + $skip = false; + } + + $path .= $this->encode($mergedParams[$part[1]]); + + $this->assembledParams[] = $part[1]; + break; + + case 'optional': + $skippable = true; + $optionalPart = $this->buildPath($part[1], $mergedParams, true, $hasChild, $options); + + if ($optionalPart !== '') { + $path .= $optionalPart; + $skip = false; + } + break; + + case 'translated-literal': + $path .= $translator->translate($part[1], $textDomain, $locale); + break; + } + } + + if ($isOptional && $skippable && $skip) { + return ''; + } + + return $path; + } + + /** + * match(): defined by RouteInterface interface. + * + * @see \Zend\Mvc\Router\RouteInterface::match() + * @param Request $request + * @param string|null $pathOffset + * @param array $options + * @return RouteMatch|null + * @throws Exception\RuntimeException + */ + public function match(Request $request, $pathOffset = null, array $options = []) + { + if (!method_exists($request, 'getUri')) { + return; + } + + $uri = $request->getUri(); + $path = $uri->getPath(); + + $regex = $this->regex; + + if ($this->translationKeys) { + if (!isset($options['translator']) || !$options['translator'] instanceof Translator) { + throw new Exception\RuntimeException('No translator provided'); + } + + $translator = $options['translator']; + $textDomain = (isset($options['text_domain']) ? $options['text_domain'] : 'default'); + $locale = (isset($options['locale']) ? $options['locale'] : null); + + foreach ($this->translationKeys as $key) { + $regex = str_replace('#' . $key . '#', $translator->translate($key, $textDomain, $locale), $regex); + } + } + + if ($pathOffset !== null) { + $result = preg_match('(\G' . $regex . ')', $path, $matches, null, $pathOffset); + } else { + $result = preg_match('(^' . $regex . '$)', $path, $matches); + } + + if (!$result) { + return; + } + + $matchedLength = strlen($matches[0]); + $params = []; + + foreach ($this->paramMap as $index => $name) { + if (isset($matches[$index]) && $matches[$index] !== '') { + $params[$name] = $this->decode($matches[$index]); + } + } + + return new RouteMatch(array_merge($this->defaults, $params), $matchedLength); + } + + /** + * assemble(): Defined by RouteInterface interface. + * + * @see \Zend\Mvc\Router\RouteInterface::assemble() + * @param array $params + * @param array $options + * @return mixed + */ + public function assemble(array $params = [], array $options = []) + { + $this->assembledParams = []; + + return $this->buildPath( + $this->parts, + array_merge($this->defaults, $params), + false, + (isset($options['has_child']) ? $options['has_child'] : false), + $options + ); + } + + /** + * getAssembledParams(): defined by RouteInterface interface. + * + * @see RouteInterface::getAssembledParams + * @return array + */ + public function getAssembledParams() + { + return $this->assembledParams; + } + + /** + * Encode a path segment. + * + * @param string $value + * @return string + */ + protected function encode($value) + { + $key = (string) $value; + if (!isset(static::$cacheEncode[$key])) { + static::$cacheEncode[$key] = rawurlencode($value); + static::$cacheEncode[$key] = strtr(static::$cacheEncode[$key], static::$urlencodeCorrectionMap); + } + return static::$cacheEncode[$key]; + } + + /** + * Decode a path segment. + * + * @param string $value + * @return string + */ + protected function decode($value) + { + return rawurldecode($value); + } +} diff --git a/vendor/Zend/Mvc/Router/Http/TranslatorAwareTreeRouteStack.php b/vendor/Zend/Mvc/Router/Http/TranslatorAwareTreeRouteStack.php new file mode 100644 index 0000000..709c6f6 --- /dev/null +++ b/vendor/Zend/Mvc/Router/Http/TranslatorAwareTreeRouteStack.php @@ -0,0 +1,177 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Router\Http; + +use Zend\I18n\Translator\TranslatorInterface as Translator; +use Zend\I18n\Translator\TranslatorAwareInterface; +use Zend\Mvc\Router\Exception; +use Zend\Stdlib\RequestInterface as Request; + +/** + * Translator aware tree route stack. + */ +class TranslatorAwareTreeRouteStack extends TreeRouteStack implements TranslatorAwareInterface +{ + /** + * Translator used for translatable segments. + * + * @var Translator + */ + protected $translator; + + /** + * Whether the translator is enabled. + * + * @var bool + */ + protected $translatorEnabled = true; + + /** + * Translator text domain to use. + * + * @var string + */ + protected $translatorTextDomain = 'default'; + + /** + * match(): defined by \Zend\Mvc\Router\RouteInterface + * + * @see \Zend\Mvc\Router\RouteInterface::match() + * @param Request $request + * @param integer|null $pathOffset + * @param array $options + * @return RouteMatch|null + */ + public function match(Request $request, $pathOffset = null, array $options = []) + { + if ($this->hasTranslator() && $this->isTranslatorEnabled() && !isset($options['translator'])) { + $options['translator'] = $this->getTranslator(); + } + + if (!isset($options['text_domain'])) { + $options['text_domain'] = $this->getTranslatorTextDomain(); + } + + return parent::match($request, $pathOffset, $options); + } + + /** + * assemble(): defined by \Zend\Mvc\Router\RouteInterface interface. + * + * @see \Zend\Mvc\Router\RouteInterface::assemble() + * @param array $params + * @param array $options + * @return mixed + * @throws Exception\InvalidArgumentException + * @throws Exception\RuntimeException + */ + public function assemble(array $params = [], array $options = []) + { + if ($this->hasTranslator() && $this->isTranslatorEnabled() && !isset($options['translator'])) { + $options['translator'] = $this->getTranslator(); + } + + if (!isset($options['text_domain'])) { + $options['text_domain'] = $this->getTranslatorTextDomain(); + } + + return parent::assemble($params, $options); + } + + /** + * setTranslator(): defined by TranslatorAwareInterface. + * + * @see TranslatorAwareInterface::setTranslator() + * @param Translator $translator + * @param string $textDomain + * @return TreeRouteStack + */ + public function setTranslator(Translator $translator = null, $textDomain = null) + { + $this->translator = $translator; + + if ($textDomain !== null) { + $this->setTranslatorTextDomain($textDomain); + } + + return $this; + } + + /** + * getTranslator(): defined by TranslatorAwareInterface. + * + * @see TranslatorAwareInterface::getTranslator() + * @return Translator + */ + public function getTranslator() + { + return $this->translator; + } + + /** + * hasTranslator(): defined by TranslatorAwareInterface. + * + * @see TranslatorAwareInterface::hasTranslator() + * @return bool + */ + public function hasTranslator() + { + return $this->translator !== null; + } + + /** + * setTranslatorEnabled(): defined by TranslatorAwareInterface. + * + * @see TranslatorAwareInterface::setTranslatorEnabled() + * @param bool $enabled + * @return TreeRouteStack + */ + public function setTranslatorEnabled($enabled = true) + { + $this->translatorEnabled = $enabled; + return $this; + } + + /** + * isTranslatorEnabled(): defined by TranslatorAwareInterface. + * + * @see TranslatorAwareInterface::isTranslatorEnabled() + * @return bool + */ + public function isTranslatorEnabled() + { + return $this->translatorEnabled; + } + + /** + * setTranslatorTextDomain(): defined by TranslatorAwareInterface. + * + * @see TranslatorAwareInterface::setTranslatorTextDomain() + * @param string $textDomain + * @return self + */ + public function setTranslatorTextDomain($textDomain = 'default') + { + $this->translatorTextDomain = $textDomain; + + return $this; + } + + /** + * getTranslatorTextDomain(): defined by TranslatorAwareInterface. + * + * @see TranslatorAwareInterface::getTranslatorTextDomain() + * @return string + */ + public function getTranslatorTextDomain() + { + return $this->translatorTextDomain; + } +} diff --git a/vendor/Zend/Mvc/Router/Http/TreeRouteStack.php b/vendor/Zend/Mvc/Router/Http/TreeRouteStack.php new file mode 100644 index 0000000..373953c --- /dev/null +++ b/vendor/Zend/Mvc/Router/Http/TreeRouteStack.php @@ -0,0 +1,477 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Router\Http; + +use ArrayObject; +use Traversable; +use Zend\Mvc\Router\Exception; +use Zend\Mvc\Router\RouteInvokableFactory; +use Zend\Mvc\Router\SimpleRouteStack; +use Zend\ServiceManager\Config; +use Zend\Stdlib\ArrayUtils; +use Zend\Stdlib\RequestInterface as Request; +use Zend\Uri\Http as HttpUri; + +/** + * Tree search implementation. + */ +class TreeRouteStack extends SimpleRouteStack +{ + /** + * Base URL. + * + * @var string + */ + protected $baseUrl; + + /** + * Request URI. + * + * @var HttpUri + */ + protected $requestUri; + + /** + * Prototype routes. + * + * We use an ArrayObject in this case so we can easily pass it down the tree + * by reference. + * + * @var ArrayObject + */ + protected $prototypes; + + /** + * factory(): defined by RouteInterface interface. + * + * @see \Zend\Mvc\Router\RouteInterface::factory() + * @param array|Traversable $options + * @return SimpleRouteStack + * @throws Exception\InvalidArgumentException + */ + public static function factory($options = []) + { + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } + + if (! is_array($options)) { + throw new Exception\InvalidArgumentException(__METHOD__ . ' expects an array or Traversable set of options'); + } + + $instance = parent::factory($options); + + if (isset($options['prototypes'])) { + $instance->addPrototypes($options['prototypes']); + } + + return $instance; + } + + /** + * init(): defined by SimpleRouteStack. + * + * @see SimpleRouteStack::init() + */ + protected function init() + { + $this->prototypes = new ArrayObject; + + (new Config([ + 'aliases' => [ + 'chain' => Chain::class, + 'Chain' => Chain::class, + 'hostname' => Hostname::class, + 'Hostname' => Hostname::class, + 'hostName' => Hostname::class, + 'HostName' => Hostname::class, + 'literal' => Literal::class, + 'Literal' => Literal::class, + 'method' => Method::class, + 'Method' => Method::class, + 'part' => Part::class, + 'Part' => Part::class, + 'query' => Query::class, + 'Query' => Query::class, + 'regex' => Regex::class, + 'Regex' => Regex::class, + 'scheme' => Scheme::class, + 'Scheme' => Scheme::class, + 'segment' => Segment::class, + 'Segment' => Segment::class, + 'wildcard' => Wildcard::class, + 'Wildcard' => Wildcard::class, + 'wildCard' => Wildcard::class, + 'WildCard' => Wildcard::class, + ], + 'factories' => [ + Chain::class => RouteInvokableFactory::class, + Hostname::class => RouteInvokableFactory::class, + Literal::class => RouteInvokableFactory::class, + Method::class => RouteInvokableFactory::class, + Part::class => RouteInvokableFactory::class, + Query::class => RouteInvokableFactory::class, + Regex::class => RouteInvokableFactory::class, + Scheme::class => RouteInvokableFactory::class, + Segment::class => RouteInvokableFactory::class, + Wildcard::class => RouteInvokableFactory::class, + + // v2 normalized names + + 'zendmvcrouterhttpchain' => RouteInvokableFactory::class, + 'zendmvcrouterhttphostname' => RouteInvokableFactory::class, + 'zendmvcrouterhttpliteral' => RouteInvokableFactory::class, + 'zendmvcrouterhttpmethod' => RouteInvokableFactory::class, + 'zendmvcrouterhttppart' => RouteInvokableFactory::class, + 'zendmvcrouterhttpquery' => RouteInvokableFactory::class, + 'zendmvcrouterhttpregex' => RouteInvokableFactory::class, + 'zendmvcrouterhttpscheme' => RouteInvokableFactory::class, + 'zendmvcrouterhttpsegment' => RouteInvokableFactory::class, + 'zendmvcrouterhttpwildcard' => RouteInvokableFactory::class, + ], + ]))->configureServiceManager($this->routePluginManager); + } + + /** + * addRoute(): defined by RouteStackInterface interface. + * + * @see RouteStackInterface::addRoute() + * @param string $name + * @param mixed $route + * @param int $priority + * @return TreeRouteStack + */ + public function addRoute($name, $route, $priority = null) + { + if (!$route instanceof RouteInterface) { + $route = $this->routeFromArray($route); + } + + return parent::addRoute($name, $route, $priority); + } + + /** + * routeFromArray(): defined by SimpleRouteStack. + * + * @see SimpleRouteStack::routeFromArray() + * @param string|array|Traversable $specs + * @return RouteInterface + * @throws Exception\InvalidArgumentException When route definition is not an array nor traversable + * @throws Exception\InvalidArgumentException When chain routes are not an array nor traversable + * @throws Exception\RuntimeException When a generated routes does not implement the HTTP route interface + */ + protected function routeFromArray($specs) + { + if (is_string($specs)) { + if (null === ($route = $this->getPrototype($specs))) { + throw new Exception\RuntimeException(sprintf('Could not find prototype with name %s', $specs)); + } + + return $route; + } elseif ($specs instanceof Traversable) { + $specs = ArrayUtils::iteratorToArray($specs); + } elseif (!is_array($specs)) { + throw new Exception\InvalidArgumentException('Route definition must be an array or Traversable object'); + } + + if (isset($specs['chain_routes'])) { + if (!is_array($specs['chain_routes'])) { + throw new Exception\InvalidArgumentException('Chain routes must be an array or Traversable object'); + } + + $chainRoutes = array_merge([$specs], $specs['chain_routes']); + unset($chainRoutes[0]['chain_routes']); + + if (isset($specs['child_routes'])) { + unset($chainRoutes[0]['child_routes']); + } + + $options = [ + 'routes' => $chainRoutes, + 'route_plugins' => $this->routePluginManager, + 'prototypes' => $this->prototypes, + ]; + + $route = $this->routePluginManager->get('chain', $options); + } else { + $route = parent::routeFromArray($specs); + } + + if (!$route instanceof RouteInterface) { + throw new Exception\RuntimeException('Given route does not implement HTTP route interface'); + } + + if (isset($specs['child_routes'])) { + $options = [ + 'route' => $route, + 'may_terminate' => (isset($specs['may_terminate']) && $specs['may_terminate']), + 'child_routes' => $specs['child_routes'], + 'route_plugins' => $this->routePluginManager, + 'prototypes' => $this->prototypes, + ]; + + $priority = (isset($route->priority) ? $route->priority : null); + + $route = $this->routePluginManager->get('part', $options); + $route->priority = $priority; + } + + return $route; + } + + /** + * Add multiple prototypes at once. + * + * @param Traversable $routes + * @return TreeRouteStack + * @throws Exception\InvalidArgumentException + */ + public function addPrototypes($routes) + { + if (!is_array($routes) && !$routes instanceof Traversable) { + throw new Exception\InvalidArgumentException('addPrototypes expects an array or Traversable set of routes'); + } + + foreach ($routes as $name => $route) { + $this->addPrototype($name, $route); + } + + return $this; + } + + /** + * Add a prototype. + * + * @param string $name + * @param mixed $route + * @return TreeRouteStack + */ + public function addPrototype($name, $route) + { + if (!$route instanceof RouteInterface) { + $route = $this->routeFromArray($route); + } + + $this->prototypes[$name] = $route; + + return $this; + } + + /** + * Get a prototype. + * + * @param string $name + * @return RouteInterface|null + */ + public function getPrototype($name) + { + if (isset($this->prototypes[$name])) { + return $this->prototypes[$name]; + } + + return; + } + + /** + * match(): defined by \Zend\Mvc\Router\RouteInterface + * + * @see \Zend\Mvc\Router\RouteInterface::match() + * @param Request $request + * @param integer|null $pathOffset + * @param array $options + * @return RouteMatch|null + */ + public function match(Request $request, $pathOffset = null, array $options = []) + { + if (!method_exists($request, 'getUri')) { + return; + } + + if ($this->baseUrl === null && method_exists($request, 'getBaseUrl')) { + $this->setBaseUrl($request->getBaseUrl()); + } + + $uri = $request->getUri(); + $baseUrlLength = strlen($this->baseUrl) ?: null; + + if ($pathOffset !== null) { + $baseUrlLength += $pathOffset; + } + + if ($this->requestUri === null) { + $this->setRequestUri($uri); + } + + if ($baseUrlLength !== null) { + $pathLength = strlen($uri->getPath()) - $baseUrlLength; + } else { + $pathLength = null; + } + + foreach ($this->routes as $name => $route) { + if (($match = $route->match($request, $baseUrlLength, $options)) instanceof RouteMatch + && ($pathLength === null || $match->getLength() === $pathLength) + ) { + $match->setMatchedRouteName($name); + + foreach ($this->defaultParams as $paramName => $value) { + if ($match->getParam($paramName) === null) { + $match->setParam($paramName, $value); + } + } + + return $match; + } + } + + return; + } + + /** + * assemble(): defined by \Zend\Mvc\Router\RouteInterface interface. + * + * @see \Zend\Mvc\Router\RouteInterface::assemble() + * @param array $params + * @param array $options + * @return mixed + * @throws Exception\InvalidArgumentException + * @throws Exception\RuntimeException + */ + public function assemble(array $params = [], array $options = []) + { + if (!isset($options['name'])) { + throw new Exception\InvalidArgumentException('Missing "name" option'); + } + + $names = explode('/', $options['name'], 2); + $route = $this->routes->get($names[0]); + + if (!$route) { + throw new Exception\RuntimeException(sprintf('Route with name "%s" not found', $names[0])); + } + + if (isset($names[1])) { + if (!$route instanceof TreeRouteStack) { + throw new Exception\RuntimeException(sprintf('Route with name "%s" does not have child routes', $names[0])); + } + $options['name'] = $names[1]; + } else { + unset($options['name']); + } + + if (isset($options['only_return_path']) && $options['only_return_path']) { + return $this->baseUrl . $route->assemble(array_merge($this->defaultParams, $params), $options); + } + + if (!isset($options['uri'])) { + $uri = new HttpUri(); + + if (isset($options['force_canonical']) && $options['force_canonical']) { + if ($this->requestUri === null) { + throw new Exception\RuntimeException('Request URI has not been set'); + } + + $uri->setScheme($this->requestUri->getScheme()) + ->setHost($this->requestUri->getHost()) + ->setPort($this->requestUri->getPort()); + } + + $options['uri'] = $uri; + } else { + $uri = $options['uri']; + } + + $path = $this->baseUrl . $route->assemble(array_merge($this->defaultParams, $params), $options); + + if (isset($options['query'])) { + $uri->setQuery($options['query']); + } + + if (isset($options['fragment'])) { + $uri->setFragment($options['fragment']); + } + + if ((isset($options['force_canonical']) && $options['force_canonical']) || $uri->getHost() !== null || $uri->getScheme() !== null) { + if (($uri->getHost() === null || $uri->getScheme() === null) && $this->requestUri === null) { + throw new Exception\RuntimeException('Request URI has not been set'); + } + + if ($uri->getHost() === null) { + $uri->setHost($this->requestUri->getHost()); + } + + if ($uri->getScheme() === null) { + $uri->setScheme($this->requestUri->getScheme()); + } + + $uri->setPath($path); + + if (!isset($options['normalize_path']) || $options['normalize_path']) { + $uri->normalize(); + } + + return $uri->toString(); + } elseif (!$uri->isAbsolute() && $uri->isValidRelative()) { + $uri->setPath($path); + + if (!isset($options['normalize_path']) || $options['normalize_path']) { + $uri->normalize(); + } + + return $uri->toString(); + } + + return $path; + } + + /** + * Set the base URL. + * + * @param string $baseUrl + * @return self + */ + public function setBaseUrl($baseUrl) + { + $this->baseUrl = rtrim($baseUrl, '/'); + return $this; + } + + /** + * Get the base URL. + * + * @return string + */ + public function getBaseUrl() + { + return $this->baseUrl; + } + + /** + * Set the request URI. + * + * @param HttpUri $uri + * @return TreeRouteStack + */ + public function setRequestUri(HttpUri $uri) + { + $this->requestUri = $uri; + return $this; + } + + /** + * Get the request URI. + * + * @return HttpUri + */ + public function getRequestUri() + { + return $this->requestUri; + } +} diff --git a/vendor/Zend/Mvc/Router/Http/Wildcard.php b/vendor/Zend/Mvc/Router/Http/Wildcard.php new file mode 100644 index 0000000..2dc16ec --- /dev/null +++ b/vendor/Zend/Mvc/Router/Http/Wildcard.php @@ -0,0 +1,190 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Router\Http; + +use Traversable; +use Zend\Mvc\Router\Exception; +use Zend\Stdlib\ArrayUtils; +use Zend\Stdlib\RequestInterface as Request; + +/** + * Wildcard route. + */ +class Wildcard implements RouteInterface +{ + /** + * Delimiter between keys and values. + * + * @var string + */ + protected $keyValueDelimiter; + + /** + * Delimiter before parameters. + * + * @var array + */ + protected $paramDelimiter; + + /** + * Default values. + * + * @var array + */ + protected $defaults; + + /** + * List of assembled parameters. + * + * @var array + */ + protected $assembledParams = []; + + /** + * Create a new wildcard route. + * + * @param string $keyValueDelimiter + * @param string $paramDelimiter + * @param array $defaults + */ + public function __construct($keyValueDelimiter = '/', $paramDelimiter = '/', array $defaults = []) + { + $this->keyValueDelimiter = $keyValueDelimiter; + $this->paramDelimiter = $paramDelimiter; + $this->defaults = $defaults; + } + + /** + * factory(): defined by RouteInterface interface. + * + * @see \Zend\Mvc\Router\RouteInterface::factory() + * @param array|Traversable $options + * @return Wildcard + * @throws Exception\InvalidArgumentException + */ + public static function factory($options = []) + { + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } elseif (!is_array($options)) { + throw new Exception\InvalidArgumentException(sprintf( + '%s expects an array or Traversable set of options', + __METHOD__ + )); + } + + if (!isset($options['key_value_delimiter'])) { + $options['key_value_delimiter'] = '/'; + } + + if (!isset($options['param_delimiter'])) { + $options['param_delimiter'] = '/'; + } + + if (!isset($options['defaults'])) { + $options['defaults'] = []; + } + + return new static($options['key_value_delimiter'], $options['param_delimiter'], $options['defaults']); + } + + /** + * match(): defined by RouteInterface interface. + * + * @see \Zend\Mvc\Router\RouteInterface::match() + * @param Request $request + * @param integer|null $pathOffset + * @return RouteMatch|null + */ + public function match(Request $request, $pathOffset = null) + { + if (!method_exists($request, 'getUri')) { + return; + } + + $uri = $request->getUri(); + $path = $uri->getPath() ?: ''; + + if ($path === '/') { + $path = ''; + } + + if ($pathOffset !== null) { + $path = substr($path, $pathOffset) ?: ''; + } + + $matches = []; + $params = explode($this->paramDelimiter, $path); + + if (count($params) > 1 && ($params[0] !== '' || end($params) === '')) { + return; + } + + if ($this->keyValueDelimiter === $this->paramDelimiter) { + $count = count($params); + + for ($i = 1; $i < $count; $i += 2) { + if (isset($params[$i + 1])) { + $matches[rawurldecode($params[$i])] = rawurldecode($params[$i + 1]); + } + } + } else { + array_shift($params); + + foreach ($params as $param) { + $param = explode($this->keyValueDelimiter, $param, 2); + + if (isset($param[1])) { + $matches[rawurldecode($param[0])] = rawurldecode($param[1]); + } + } + } + + return new RouteMatch(array_merge($this->defaults, $matches), strlen($path)); + } + + /** + * assemble(): Defined by RouteInterface interface. + * + * @see \Zend\Mvc\Router\RouteInterface::assemble() + * @param array $params + * @param array $options + * @return mixed + */ + public function assemble(array $params = [], array $options = []) + { + $elements = []; + $mergedParams = array_merge($this->defaults, $params); + $this->assembledParams = []; + + if ($mergedParams) { + foreach ($mergedParams as $key => $value) { + $elements[] = rawurlencode($key) . $this->keyValueDelimiter . rawurlencode($value); + + $this->assembledParams[] = $key; + } + + return $this->paramDelimiter . implode($this->paramDelimiter, $elements); + } + + return ''; + } + + /** + * getAssembledParams(): defined by RouteInterface interface. + * + * @see RouteInterface::getAssembledParams + * @return array + */ + public function getAssembledParams() + { + return $this->assembledParams; + } +} diff --git a/vendor/Zend/Mvc/Router/PriorityList.php b/vendor/Zend/Mvc/Router/PriorityList.php new file mode 100644 index 0000000..3fcf8ad --- /dev/null +++ b/vendor/Zend/Mvc/Router/PriorityList.php @@ -0,0 +1,19 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Router; + +use Zend\Stdlib\PriorityList as StdlibPriorityList; + +/** + * Priority list + */ +class PriorityList extends StdlibPriorityList +{ +} diff --git a/vendor/Zend/Mvc/Router/RouteInterface.php b/vendor/Zend/Mvc/Router/RouteInterface.php new file mode 100644 index 0000000..e66d2db --- /dev/null +++ b/vendor/Zend/Mvc/Router/RouteInterface.php @@ -0,0 +1,50 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Router; + +use Zend\Stdlib\RequestInterface as Request; + +/** + * RouteInterface interface. + */ +interface RouteInterface +{ + /** + * Priority used for route stacks. + * + * @var int + * public $priority; + */ + + /** + * Create a new route with given options. + * + * @param array|\Traversable $options + * @return void + */ + public static function factory($options = []); + + /** + * Match a given request. + * + * @param Request $request + * @return RouteMatch|null + */ + public function match(Request $request); + + /** + * Assemble the route. + * + * @param array $params + * @param array $options + * @return mixed + */ + public function assemble(array $params = [], array $options = []); +} diff --git a/vendor/Zend/Mvc/Router/RouteInvokableFactory.php b/vendor/Zend/Mvc/Router/RouteInvokableFactory.php new file mode 100644 index 0000000..c17e33c --- /dev/null +++ b/vendor/Zend/Mvc/Router/RouteInvokableFactory.php @@ -0,0 +1,148 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Router; + +use Interop\Container\ContainerInterface; +use Zend\ServiceManager\Exception\ServiceNotCreatedException; +use Zend\ServiceManager\AbstractFactoryInterface; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; + +/** + * Specialized invokable/abstract factory for use with RoutePluginManager. + * + * Can be mapped directly to specific route plugin names, or used as an + * abstract factory to map FQCN services to invokables. + */ +class RouteInvokableFactory implements + AbstractFactoryInterface, + FactoryInterface +{ + /** + * Options used to create instance (used with zend-servicemanager v2) + * + * @var array + */ + protected $creationOptions = []; + + /** + * Can we create a route instance with the given name? (v3) + * + * Only works for FQCN $routeName values, for classes that implement RouteInterface. + * + * @param ContainerInterface $container + * @param string $routeName + * @return bool + */ + public function canCreate(ContainerInterface $container, $routeName) + { + if (! class_exists($routeName)) { + return false; + } + + if (! is_subclass_of($routeName, RouteInterface::class)) { + return false; + } + + return true; + } + + /** + * Can we create a route instance with the given name? (v2) + * + * Proxies to canCreate(). + * + * @param ServiceLocatorInterface $container + * @param string $normalizedName + * @param string $routeName + * @return bool + */ + public function canCreateServiceWithName(ServiceLocatorInterface $container, $normalizedName, $routeName) + { + return $this->canCreate($container, $routeName); + } + + /** + * Create and return a RouteInterface instance. + * + * If the specified $routeName class does not exist or does not implement + * RouteInterface, this method will raise an exception. + * + * Otherwise, it uses the class' `factory()` method with the provided + * $options to produce an instance. + * + * @param ContainerInterface $container + * @param string $routeName + * @param null|array $options + * @return RouteInterface + */ + public function __invoke(ContainerInterface $container, $routeName, array $options = null) + { + $options = $options ?: []; + + if (! class_exists($routeName)) { + throw new ServiceNotCreatedException(sprintf( + '%s: failed retrieving invokable class "%s"; class does not exist', + __CLASS__, + $routeName + )); + } + + if (! is_subclass_of($routeName, RouteInterface::class)) { + throw new ServiceNotCreatedException(sprintf( + '%s: failed retrieving invokable class "%s"; class does not implement %s', + __CLASS__, + $routeName, + RouteInterface::class + )); + } + + return $routeName::factory($options); + } + + /** + * Create a route instance with the given name. (v2) + * + * Proxies to __invoke(). + * + * @param ServiceLocatorInterface $container + * @param string $normalizedName + * @param string $routeName + * @return RouteInterface + */ + public function createServiceWithName(ServiceLocatorInterface $container, $normalizedName, $routeName) + { + return $this($container, $routeName, $this->creationOptions); + } + + /** + * Create and return RouteInterface instance + * + * For use with zend-servicemanager v2; proxies to __invoke(). + * + * @param ServiceLocatorInterface $container + * @return RouteInterface + */ + public function createService(ServiceLocatorInterface $container, $normalizedName = null, $routeName = null) + { + $routeName = $routeName ?: RouteInterface::class; + return $this($container, $routeName, $this->creationOptions); + } + + /** + * Set options to use when creating a service (v2) + * + * @param array $creationOptions + */ + public function setCreationOptions(array $creationOptions) + { + $this->creationOptions = $creationOptions; + } +} diff --git a/vendor/Zend/Mvc/Router/RouteMatch.php b/vendor/Zend/Mvc/Router/RouteMatch.php new file mode 100644 index 0000000..6cfc965 --- /dev/null +++ b/vendor/Zend/Mvc/Router/RouteMatch.php @@ -0,0 +1,101 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Router; + +/** + * RouteInterface match. + */ +class RouteMatch +{ + /** + * Match parameters. + * + * @var array + */ + protected $params = []; + + /** + * Matched route name. + * + * @var string + */ + protected $matchedRouteName; + + /** + * Create a RouteMatch with given parameters. + * + * @param array $params + */ + public function __construct(array $params) + { + $this->params = $params; + } + + /** + * Set name of matched route. + * + * @param string $name + * @return RouteMatch + */ + public function setMatchedRouteName($name) + { + $this->matchedRouteName = $name; + return $this; + } + + /** + * Get name of matched route. + * + * @return string + */ + public function getMatchedRouteName() + { + return $this->matchedRouteName; + } + + /** + * Set a parameter. + * + * @param string $name + * @param mixed $value + * @return RouteMatch + */ + public function setParam($name, $value) + { + $this->params[$name] = $value; + return $this; + } + + /** + * Get all parameters. + * + * @return array + */ + public function getParams() + { + return $this->params; + } + + /** + * Get a specific parameter. + * + * @param string $name + * @param mixed $default + * @return mixed + */ + public function getParam($name, $default = null) + { + if (array_key_exists($name, $this->params)) { + return $this->params[$name]; + } + + return $default; + } +} diff --git a/vendor/Zend/Mvc/Router/RoutePluginManager.php b/vendor/Zend/Mvc/Router/RoutePluginManager.php new file mode 100644 index 0000000..65cfa1b --- /dev/null +++ b/vendor/Zend/Mvc/Router/RoutePluginManager.php @@ -0,0 +1,177 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Router; + +use Interop\Container\ContainerInterface; +use Zend\ServiceManager\AbstractPluginManager; +use Zend\ServiceManager\Exception\InvalidServiceException; + +/** + * Plugin manager implementation for routes + * + * Enforces that routes retrieved are instances of RouteInterface. It overrides + * configure() to map invokables to the component-specific + * RouteInvokableFactory. + * + * The manager is marked to not share by default, in order to allow multiple + * route instances of the same type. + */ +class RoutePluginManager extends AbstractPluginManager +{ + /** + * Only RouteInterface instances are valid + * + * @var string + */ + protected $instanceOf = RouteInterface::class; + + /** + * Do not share instances. (v3) + * + * @var bool + */ + protected $shareByDefault = false; + + /** + * Do not share instances. (v2) + * + * @var bool + */ + protected $sharedByDefault = false; + + /** + * Constructor + * + * Ensure that the instance is seeded with the RouteInvokableFactory as an + * abstract factory. + * + * @param ContainerInterface|\Zend\ServiceManager\ConfigInterface $configOrContainerInstance + * @param array $v3config + */ + public function __construct($configOrContainerInstance, array $v3config = []) + { + $this->addAbstractFactory(RouteInvokableFactory::class); + parent::__construct($configOrContainerInstance, $v3config); + } + + /** + * Validate a route plugin. (v2) + * + * @param object $plugin + * @throws InvalidServiceException + */ + public function validate($plugin) + { + if (! $plugin instanceof $this->instanceOf) { + throw new InvalidServiceException(sprintf( + 'Plugin of type %s is invalid; must implement %s', + (is_object($plugin) ? get_class($plugin) : gettype($plugin)), + RouteInterface::class + )); + } + } + + /** + * Validate a route plugin. (v2) + * + * @param object $plugin + * @throws Exception\RuntimeException + */ + public function validatePlugin($plugin) + { + try { + $this->validate($plugin); + } catch (InvalidServiceException $e) { + throw new Exception\RuntimeException( + $e->getMessage(), + $e->getCode(), + $e + ); + } + } + + /** + * Pre-process configuration. (v3) + * + * Checks for invokables, and, if found, maps them to the + * component-specific RouteInvokableFactory; removes the invokables entry + * before passing to the parent. + * + * @param array $config + * @return void + */ + public function configure(array $config) + { + if (isset($config['invokables']) && ! empty($config['invokables'])) { + $aliases = $this->createAliasesForInvokables($config['invokables']); + $factories = $this->createFactoriesForInvokables($config['invokables']); + + if (! empty($aliases)) { + $config['aliases'] = isset($config['aliases']) + ? array_merge($config['aliases'], $aliases) + : $aliases; + } + + $config['factories'] = isset($config['factories']) + ? array_merge($config['factories'], $factories) + : $factories; + + unset($config['invokables']); + } + + parent::configure($config); + } + + /** + * Create aliases for invokable classes. + * + * If an invokable service name does not match the class it maps to, this + * creates an alias to the class (which will later be mapped as an + * invokable factory). + * + * @param array $invokables + * @return array + */ + protected function createAliasesForInvokables(array $invokables) + { + $aliases = []; + foreach ($invokables as $name => $class) { + if ($name === $class) { + continue; + } + $aliases[$name] = $class; + } + return $aliases; + } + + /** + * Create invokable factories for invokable classes. + * + * If an invokable service name does not match the class it maps to, this + * creates an invokable factory entry for the class name; otherwise, it + * creates an invokable factory for the entry name. + * + * @param array $invokables + * @return array + */ + protected function createFactoriesForInvokables(array $invokables) + { + $factories = []; + foreach ($invokables as $name => $class) { + if ($name === $class) { + $factories[$name] = RouteInvokableFactory::class; + continue; + } + + $factories[$class] = RouteInvokableFactory::class; + } + return $factories; + } +} diff --git a/vendor/Zend/Mvc/Router/RouteStackInterface.php b/vendor/Zend/Mvc/Router/RouteStackInterface.php new file mode 100644 index 0000000..2470da0 --- /dev/null +++ b/vendor/Zend/Mvc/Router/RouteStackInterface.php @@ -0,0 +1,47 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Router; + +interface RouteStackInterface extends RouteInterface +{ + /** + * Add a route to the stack. + * + * @param string $name + * @param mixed $route + * @param int $priority + * @return RouteStackInterface + */ + public function addRoute($name, $route, $priority = null); + + /** + * Add multiple routes to the stack. + * + * @param array|\Traversable $routes + * @return RouteStackInterface + */ + public function addRoutes($routes); + + /** + * Remove a route from the stack. + * + * @param string $name + * @return RouteStackInterface + */ + public function removeRoute($name); + + /** + * Remove all routes from the stack and set new ones. + * + * @param array|\Traversable $routes + * @return RouteStackInterface + */ + public function setRoutes($routes); +} diff --git a/vendor/Zend/Mvc/Router/SimpleRouteStack.php b/vendor/Zend/Mvc/Router/SimpleRouteStack.php new file mode 100644 index 0000000..911d906 --- /dev/null +++ b/vendor/Zend/Mvc/Router/SimpleRouteStack.php @@ -0,0 +1,340 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Router; + +use Traversable; +use Zend\ServiceManager\ServiceManager; +use Zend\Stdlib\ArrayUtils; +use Zend\Stdlib\RequestInterface as Request; + +/** + * Simple route stack implementation. + */ +class SimpleRouteStack implements RouteStackInterface +{ + /** + * Stack containing all routes. + * + * @var PriorityList + */ + protected $routes; + + /** + * Route plugin manager + * + * @var RoutePluginManager + */ + protected $routePluginManager; + + /** + * Default parameters. + * + * @var array + */ + protected $defaultParams = []; + + /** + * Create a new simple route stack. + * + * @param RoutePluginManager $routePluginManager + */ + public function __construct(RoutePluginManager $routePluginManager = null) + { + $this->routes = new PriorityList(); + + if (null === $routePluginManager) { + $routePluginManager = new RoutePluginManager(new ServiceManager()); + } + + $this->routePluginManager = $routePluginManager; + + $this->init(); + } + + /** + * factory(): defined by RouteInterface interface. + * + * @see \Zend\Mvc\Router\RouteInterface::factory() + * @param array|Traversable $options + * @return SimpleRouteStack + * @throws Exception\InvalidArgumentException + */ + public static function factory($options = []) + { + if ($options instanceof Traversable) { + $options = ArrayUtils::iteratorToArray($options); + } elseif (!is_array($options)) { + throw new Exception\InvalidArgumentException(__METHOD__ . ' expects an array or Traversable set of options'); + } + + $routePluginManager = null; + if (isset($options['route_plugins'])) { + $routePluginManager = $options['route_plugins']; + } + + $instance = new static($routePluginManager); + + if (isset($options['routes'])) { + $instance->addRoutes($options['routes']); + } + + if (isset($options['default_params'])) { + $instance->setDefaultParams($options['default_params']); + } + + return $instance; + } + + /** + * Init method for extending classes. + * + * @return void + */ + protected function init() + { + } + + /** + * Set the route plugin manager. + * + * @param RoutePluginManager $routePlugins + * @return SimpleRouteStack + */ + public function setRoutePluginManager(RoutePluginManager $routePlugins) + { + $this->routePluginManager = $routePlugins; + return $this; + } + + /** + * Get the route plugin manager. + * + * @return RoutePluginManager + */ + public function getRoutePluginManager() + { + return $this->routePluginManager; + } + + /** + * addRoutes(): defined by RouteStackInterface interface. + * + * @see RouteStackInterface::addRoutes() + * @param array|Traversable $routes + * @return SimpleRouteStack + * @throws Exception\InvalidArgumentException + */ + public function addRoutes($routes) + { + if (!is_array($routes) && !$routes instanceof Traversable) { + throw new Exception\InvalidArgumentException('addRoutes expects an array or Traversable set of routes'); + } + + foreach ($routes as $name => $route) { + $this->addRoute($name, $route); + } + + return $this; + } + + /** + * addRoute(): defined by RouteStackInterface interface. + * + * @see RouteStackInterface::addRoute() + * @param string $name + * @param mixed $route + * @param int $priority + * @return SimpleRouteStack + */ + public function addRoute($name, $route, $priority = null) + { + if (!$route instanceof RouteInterface) { + $route = $this->routeFromArray($route); + } + + if ($priority === null && isset($route->priority)) { + $priority = $route->priority; + } + + $this->routes->insert($name, $route, $priority); + + return $this; + } + + /** + * removeRoute(): defined by RouteStackInterface interface. + * + * @see RouteStackInterface::removeRoute() + * @param string $name + * @return SimpleRouteStack + */ + public function removeRoute($name) + { + $this->routes->remove($name); + return $this; + } + + /** + * setRoutes(): defined by RouteStackInterface interface. + * + * @param array|Traversable $routes + * @return SimpleRouteStack + */ + public function setRoutes($routes) + { + $this->routes->clear(); + $this->addRoutes($routes); + return $this; + } + + /** + * Get the added routes + * + * @return Traversable list of all routes + */ + public function getRoutes() + { + return $this->routes; + } + + /** + * Check if a route with a specific name exists + * + * @param string $name + * @return bool true if route exists + */ + public function hasRoute($name) + { + return $this->routes->get($name) !== null; + } + + /** + * Get a route by name + * + * @param string $name + * @return RouteInterface the route + */ + public function getRoute($name) + { + return $this->routes->get($name); + } + + /** + * Set a default parameters. + * + * @param array $params + * @return SimpleRouteStack + */ + public function setDefaultParams(array $params) + { + $this->defaultParams = $params; + return $this; + } + + /** + * Set a default parameter. + * + * @param string $name + * @param mixed $value + * @return SimpleRouteStack + */ + public function setDefaultParam($name, $value) + { + $this->defaultParams[$name] = $value; + return $this; + } + + /** + * Create a route from array specifications. + * + * @param array|Traversable $specs + * @return RouteInterface + * @throws Exception\InvalidArgumentException + */ + protected function routeFromArray($specs) + { + if ($specs instanceof Traversable) { + $specs = ArrayUtils::iteratorToArray($specs); + } + + if (! is_array($specs)) { + throw new Exception\InvalidArgumentException('Route definition must be an array or Traversable object'); + } + + if (! isset($specs['type'])) { + throw new Exception\InvalidArgumentException('Missing "type" option'); + } + + if (! isset($specs['options'])) { + $specs['options'] = []; + } + + $route = $this->getRoutePluginManager()->get($specs['type'], $specs['options']); + + if (isset($specs['priority'])) { + $route->priority = $specs['priority']; + } + + return $route; + } + + /** + * match(): defined by RouteInterface interface. + * + * @see \Zend\Mvc\Router\RouteInterface::match() + * @param Request $request + * @return RouteMatch|null + */ + public function match(Request $request) + { + foreach ($this->routes as $name => $route) { + if (($match = $route->match($request)) instanceof RouteMatch) { + $match->setMatchedRouteName($name); + + foreach ($this->defaultParams as $paramName => $value) { + if ($match->getParam($paramName) === null) { + $match->setParam($paramName, $value); + } + } + + return $match; + } + } + + return; + } + + /** + * assemble(): defined by RouteInterface interface. + * + * @see \Zend\Mvc\Router\RouteInterface::assemble() + * @param array $params + * @param array $options + * @return mixed + * @throws Exception\InvalidArgumentException + * @throws Exception\RuntimeException + */ + public function assemble(array $params = [], array $options = []) + { + if (!isset($options['name'])) { + throw new Exception\InvalidArgumentException('Missing "name" option'); + } + + $route = $this->routes->get($options['name']); + + if (!$route) { + throw new Exception\RuntimeException(sprintf('Route with name "%s" not found', $options['name'])); + } + + unset($options['name']); + + return $route->assemble(array_merge($this->defaultParams, $params), $options); + } +} diff --git a/vendor/Zend/Mvc/SendResponseListener.php b/vendor/Zend/Mvc/SendResponseListener.php new file mode 100644 index 0000000..8ee7931 --- /dev/null +++ b/vendor/Zend/Mvc/SendResponseListener.php @@ -0,0 +1,143 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc; + +use Zend\EventManager\AbstractListenerAggregate; +use Zend\EventManager\EventManager; +use Zend\EventManager\EventManagerAwareInterface; +use Zend\EventManager\EventManagerInterface; +use Zend\Mvc\ResponseSender\ConsoleResponseSender; +use Zend\Mvc\ResponseSender\HttpResponseSender; +use Zend\Mvc\ResponseSender\PhpEnvironmentResponseSender; +use Zend\Mvc\ResponseSender\SendResponseEvent; +use Zend\Mvc\ResponseSender\SimpleStreamResponseSender; +use Zend\Stdlib\ResponseInterface as Response; + +class SendResponseListener extends AbstractListenerAggregate implements + EventManagerAwareInterface +{ + /** + * @var SendResponseEvent + */ + protected $event; + + /** + * @var EventManagerInterface + */ + protected $eventManager; + + /** + * Inject an EventManager instance + * + * @param EventManagerInterface $eventManager + * @return SendResponseListener + */ + public function setEventManager(EventManagerInterface $eventManager) + { + $eventManager->setIdentifiers([ + __CLASS__, + get_class($this), + ]); + $this->eventManager = $eventManager; + $this->attachDefaultListeners(); + return $this; + } + + /** + * Retrieve the event manager + * + * Lazy-loads an EventManager instance if none registered. + * + * @return EventManagerInterface + */ + public function getEventManager() + { + if (!$this->eventManager instanceof EventManagerInterface) { + $this->setEventManager(new EventManager()); + } + return $this->eventManager; + } + + /** + * Attach the aggregate to the specified event manager + * + * @param EventManagerInterface $events + * @param int $priority + * @return void + */ + public function attach(EventManagerInterface $events, $priority = 1) + { + $this->listeners[] = $events->attach(MvcEvent::EVENT_FINISH, [$this, 'sendResponse'], -10000); + } + + /** + * Send the response + * + * @param MvcEvent $e + * @return void + */ + public function sendResponse(MvcEvent $e) + { + $response = $e->getResponse(); + if (!$response instanceof Response) { + return; // there is no response to send + } + $event = $this->getEvent(); + $event->setResponse($response); + $event->setTarget($this); + $this->getEventManager()->triggerEvent($event); + } + + /** + * Get the send response event + * + * @return SendResponseEvent + */ + public function getEvent() + { + if (!$this->event instanceof SendResponseEvent) { + $this->setEvent(new SendResponseEvent()); + } + return $this->event; + } + + /** + * Set the send response event + * + * @param SendResponseEvent $e + * @return SendResponseEvent + */ + public function setEvent(SendResponseEvent $e) + { + $this->event = $e; + return $this; + } + + /** + * Register the default event listeners + * + * The order in which the response sender are listed here, is by their usage: + * PhpEnvironmentResponseSender has highest priority, because it's used most often. + * ConsoleResponseSender and SimpleStreamResponseSender are not used that often, yo they have a lower priority. + * You can attach your response sender before or after every default response sender implementation. + * All default response sender implementation have negative priority. + * You are able to attach listeners without giving a priority and your response sender would be first to try. + * + * @return SendResponseListener + */ + protected function attachDefaultListeners() + { + $events = $this->getEventManager(); + $events->attach(SendResponseEvent::EVENT_SEND_RESPONSE, new PhpEnvironmentResponseSender(), -1000); + $events->attach(SendResponseEvent::EVENT_SEND_RESPONSE, new ConsoleResponseSender(), -2000); + $events->attach(SendResponseEvent::EVENT_SEND_RESPONSE, new SimpleStreamResponseSender(), -3000); + $events->attach(SendResponseEvent::EVENT_SEND_RESPONSE, new HttpResponseSender(), -4000); + } +} diff --git a/vendor/Zend/Mvc/Service/AbstractPluginManagerFactory.php b/vendor/Zend/Mvc/Service/AbstractPluginManagerFactory.php new file mode 100644 index 0000000..2875c2b --- /dev/null +++ b/vendor/Zend/Mvc/Service/AbstractPluginManagerFactory.php @@ -0,0 +1,51 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Interop\Container\ContainerInterface; +use Zend\ServiceManager\AbstractPluginManager; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; + +abstract class AbstractPluginManagerFactory implements FactoryInterface +{ + const PLUGIN_MANAGER_CLASS = 'AbstractPluginManager'; + + /** + * Create and return a plugin manager. + * + * Classes that extend this should provide a valid class for + * the PLUGIN_MANGER_CLASS constant. + * + * @param ContainerInterface $container + * @param string $name + * @param null|array $options + * @return AbstractPluginManager + */ + public function __invoke(ContainerInterface $container, $name, array $options = null) + { + $options = $options ?: []; + $pluginManagerClass = static::PLUGIN_MANAGER_CLASS; + return new $pluginManagerClass($container, $options); + } + + /** + * Create and return AbstractPluginManager instance + * + * For use with zend-servicemanager v2; proxies to __invoke(). + * + * @param ServiceLocatorInterface $container + * @return AbstractPluginManager + */ + public function createService(ServiceLocatorInterface $container) + { + return $this($container, AbstractPluginManager::class); + } +} diff --git a/vendor/Zend/Mvc/Service/ApplicationFactory.php b/vendor/Zend/Mvc/Service/ApplicationFactory.php new file mode 100644 index 0000000..f8e5d9f --- /dev/null +++ b/vendor/Zend/Mvc/Service/ApplicationFactory.php @@ -0,0 +1,53 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Interop\Container\ContainerInterface; +use Zend\Mvc\Application; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; + +class ApplicationFactory implements FactoryInterface +{ + /** + * Create the Application service (v3) + * + * Creates a Zend\Mvc\Application service, passing it the configuration + * service and the service manager instance. + * + * @param ContainerInterface $container + * @param string $name + * @param null|array $options + * @return Application + */ + public function __invoke(ContainerInterface $container, $name, array $options = null) + { + return new Application( + $container->get('config'), + $container, + $container->get('EventManager'), + $container->get('Request'), + $container->get('Response') + ); + } + + /** + * Create the Application service (v2) + * + * Proxies to __invoke(). + * + * @param ServiceLocatorInterface $container + * @return Application + */ + public function createService(ServiceLocatorInterface $container) + { + return $this($container, Application::class); + } +} diff --git a/vendor/Zend/Mvc/Service/ConfigFactory.php b/vendor/Zend/Mvc/Service/ConfigFactory.php new file mode 100644 index 0000000..6fc33e1 --- /dev/null +++ b/vendor/Zend/Mvc/Service/ConfigFactory.php @@ -0,0 +1,52 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Interop\Container\ContainerInterface; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; + +class ConfigFactory implements FactoryInterface +{ + /** + * Create the application configuration service + * + * Retrieves the Module Manager from the service locator, and executes + * {@link Zend\ModuleManager\ModuleManager::loadModules()}. + * + * It then retrieves the config listener from the module manager, and from + * that the merged configuration. + * + * @param ContainerInterface $container + * @param string $name + * @param null|array $options + * @return array|\Traversable + */ + public function __invoke(ContainerInterface $container, $name, array $options = null) + { + $moduleManager = $container->get('ModuleManager'); + $moduleManager->loadModules(); + $moduleParams = $moduleManager->getEvent()->getParams(); + return $moduleParams['configListener']->getMergedConfig(false); + } + + /** + * Create and return config instance + * + * For use with zend-servicemanager v2; proxies to __invoke(). + * + * @param ServiceLocatorInterface $container + * @return array|\Traversable + */ + public function createService(ServiceLocatorInterface $container) + { + return $this($container, 'config'); + } +} diff --git a/vendor/Zend/Mvc/Service/ConsoleAdapterFactory.php b/vendor/Zend/Mvc/Service/ConsoleAdapterFactory.php new file mode 100644 index 0000000..6172b44 --- /dev/null +++ b/vendor/Zend/Mvc/Service/ConsoleAdapterFactory.php @@ -0,0 +1,91 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Interop\Container\ContainerInterface; +use stdClass; +use Zend\Console\Adapter\AdapterInterface; +use Zend\Console\Console; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; + +class ConsoleAdapterFactory implements FactoryInterface +{ + /** + * Create and return a Console adapter instance. + * In case we're not in a Console environment, return a dummy stdClass object. + * + * In order to disable adapter auto-detection and use a specific adapter (and charset), + * add the following fields to application configuration, for example: + * + * 'console' => array( + * 'adapter' => 'MyConsoleAdapter', // always use this console adapter + * 'charset' => 'MyConsoleCharset', // always use this console charset + * ), + * 'service_manager' => array( + * 'invokables' => array( + * 'MyConsoleAdapter' => 'Zend\Console\Adapter\Windows', + * 'MyConsoleCharset' => 'Zend\Console\Charset\DESCG', + * ) + * ) + * + * @param ContainerInterface $container + * @param string $name + * @param null|array $options + * @return AdapterInterface|stdClass + */ + public function __invoke(ContainerInterface $container, $name, array $options = null) + { + // First, check if we're actually in a Console environment + if (! Console::isConsole()) { + // SM factory cannot currently return null, so we return dummy object + return new stdClass(); + } + + // Read app config and determine Console adapter to use + $config = $container->get('config'); + if (! empty($config['console']) && ! empty($config['console']['adapter'])) { + // use the adapter supplied in application config + $adapter = $container->get($config['console']['adapter']); + } else { + // try to detect best console adapter + $adapter = Console::detectBestAdapter(); + $adapter = new $adapter(); + } + + // check if we have a valid console adapter + if (! $adapter instanceof AdapterInterface) { + // SM factory cannot currently return null, so we convert it to dummy object + return new stdClass(); + } + + // Optionally, change Console charset + if (! empty($config['console']) && ! empty($config['console']['charset'])) { + // use the charset supplied in application config + $charset = $container->get($config['console']['charset']); + $adapter->setCharset($charset); + } + + return $adapter; + } + + /** + * Create and return AdapterInterface instance + * + * For use with zend-servicemanager v2; proxies to __invoke(). + * + * @param ServiceLocatorInterface $container + * @return AdapterInterface|stdClass + */ + public function createService(ServiceLocatorInterface $container) + { + return $this($container, AdapterInterface::class); + } +} diff --git a/vendor/Zend/Mvc/Service/ConsoleExceptionStrategyFactory.php b/vendor/Zend/Mvc/Service/ConsoleExceptionStrategyFactory.php new file mode 100644 index 0000000..6c02459 --- /dev/null +++ b/vendor/Zend/Mvc/Service/ConsoleExceptionStrategyFactory.php @@ -0,0 +1,75 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Interop\Container\ContainerInterface; +use Zend\Mvc\View\Console\ExceptionStrategy; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; + +class ConsoleExceptionStrategyFactory implements FactoryInterface +{ + use ConsoleViewManagerConfigTrait; + + /** + * @param ContainerInterface $container + * @param string $name + * @param null|array $options + * @return ExceptionStrategy + */ + public function __invoke(ContainerInterface $container, $name, array $options = null) + { + $strategy = new ExceptionStrategy(); + $config = $this->getConfig($container); + + $this->injectDisplayExceptions($strategy, $config); + $this->injectExceptionMessage($strategy, $config); + + return $strategy; + } + + /** + * Create and return ExceptionStrategy instance + * + * For use with zend-servicemanager v2; proxies to __invoke(). + * + * @param ServiceLocatorInterface $container + * @return ExceptionStrategy + */ + public function createService(ServiceLocatorInterface $container) + { + return $this($container, ExceptionStrategy::class); + } + + /** + * Inject strategy with configured display_exceptions flag. + * + * @param ExceptionStrategy $strategy + * @param array $config + */ + private function injectDisplayExceptions(ExceptionStrategy $strategy, array $config) + { + $flag = array_key_exists('display_exceptions', $config) ? $config['display_exceptions'] : true; + $strategy->setDisplayExceptions($flag); + } + + /** + * Inject strategy with configured exception_message + * + * @param ExceptionStrategy $strategy + * @param array $config + */ + private function injectExceptionMessage(ExceptionStrategy $strategy, array $config) + { + if (isset($config['exception_message'])) { + $strategy->setMessage($config['exception_message']); + } + } +} diff --git a/vendor/Zend/Mvc/Service/ConsoleRouteNotFoundStrategyFactory.php b/vendor/Zend/Mvc/Service/ConsoleRouteNotFoundStrategyFactory.php new file mode 100644 index 0000000..628ae96 --- /dev/null +++ b/vendor/Zend/Mvc/Service/ConsoleRouteNotFoundStrategyFactory.php @@ -0,0 +1,59 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Interop\Container\ContainerInterface; +use Zend\Mvc\View\Console\RouteNotFoundStrategy; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; + +class ConsoleRouteNotFoundStrategyFactory implements FactoryInterface +{ + use ConsoleViewManagerConfigTrait; + + /** + * @param ContainerInterface $container + * @param string $name + * @param null|array $options + * @return RouteNotFoundStrategy + */ + public function __invoke(ContainerInterface $container, $name, array $options = null) + { + $strategy = new RouteNotFoundStrategy(); + $config = $this->getConfig($container); + + $this->injectDisplayNotFoundReason($strategy, $config); + + return $strategy; + } + + /** + * Create and return RouteNotFoundStrategy instance + * + * @param ServiceLocatorInterface $container + * @return RouteNotFoundStrategy + */ + public function createService(ServiceLocatorInterface $container) + { + return $this($container, RouteNotFoundStrategy::class); + } + + /** + * Inject strategy with configured display_not_found_reason flag. + * + * @param RouteNotFoundStrategy $strategy + * @param array $config + */ + private function injectDisplayNotFoundReason(RouteNotFoundStrategy $strategy, array $config) + { + $flag = array_key_exists('display_not_found_reason', $config) ? $config['display_not_found_reason'] : true; + $strategy->setDisplayNotFoundReason($flag); + } +} diff --git a/vendor/Zend/Mvc/Service/ConsoleRouterFactory.php b/vendor/Zend/Mvc/Service/ConsoleRouterFactory.php new file mode 100644 index 0000000..dc18deb --- /dev/null +++ b/vendor/Zend/Mvc/Service/ConsoleRouterFactory.php @@ -0,0 +1,53 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Interop\Container\ContainerInterface; +use Zend\Console\Console; +use Zend\Mvc\Router\RouteStackInterface; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; + +class ConsoleRouterFactory implements FactoryInterface +{ + use RouterConfigTrait; + + /** + * Create and return the console router + * + * @param ContainerInterface $container + * @param string $name + * @param null|array $options + * @return RouteStackInterface + */ + public function __invoke(ContainerInterface $container, $name, array $options = null) + { + $config = $container->has('config') ? $container->get('config') : []; + + // Defaults + $class = 'Zend\Mvc\Router\Console\SimpleRouteStack'; + $config = isset($config['console']['router']) ? $config['console']['router'] : []; + + return $this->createRouter($class, $config, $container); + } + + /** + * Create and return RouteStackInterface instance + * + * For use with zend-servicemanager v2; proxies to __invoke(). + * + * @param ServiceLocatorInterface $container + * @return RouteStackInterface + */ + public function createService(ServiceLocatorInterface $container) + { + return $this($container, RouteStackInterface::class); + } +} diff --git a/vendor/Zend/Mvc/Service/ConsoleViewManagerConfigTrait.php b/vendor/Zend/Mvc/Service/ConsoleViewManagerConfigTrait.php new file mode 100644 index 0000000..21f49df --- /dev/null +++ b/vendor/Zend/Mvc/Service/ConsoleViewManagerConfigTrait.php @@ -0,0 +1,39 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use ArrayAccess; +use Interop\Container\ContainerInterface; + +trait ConsoleViewManagerConfigTrait +{ + /** + * Retrieve view_manager configuration, if present. + * + * @param ContainerInterface $container + * @return array + */ + private function getConfig(ContainerInterface $container) + { + $config = $container->has('config') ? $container->get('config') : []; + + if (isset($config['console']['view_manager'])) { + $config = $config['console']['view_manager']; + } elseif (isset($config['view_manager'])) { + $config = $config['view_manager']; + } else { + $config = []; + } + + return (is_array($config) || $config instanceof ArrayAccess) + ? $config + : []; + } +} diff --git a/vendor/Zend/Mvc/Service/ConsoleViewManagerFactory.php b/vendor/Zend/Mvc/Service/ConsoleViewManagerFactory.php new file mode 100644 index 0000000..7a725f4 --- /dev/null +++ b/vendor/Zend/Mvc/Service/ConsoleViewManagerFactory.php @@ -0,0 +1,52 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Interop\Container\ContainerInterface; +use Zend\Console\Console; +use Zend\ServiceManager\Exception\ServiceNotCreatedException; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; +use Zend\Mvc\View\Console\ViewManager as ConsoleViewManager; + +class ConsoleViewManagerFactory implements FactoryInterface +{ + /** + * Create and return the view manager for the console environment + * + * @param ContainerInterface $container + * @param string $name + * @param null|array $options + * @return ConsoleViewManager + */ + public function __invoke(ContainerInterface $container, $name, array $options = null) + { + if (! Console::isConsole()) { + throw new ServiceNotCreatedException( + 'ConsoleViewManager requires a Console environment; console environment not detected' + ); + } + + return new ConsoleViewManager(); + } + + /** + * Create and return ConsoleViewManager instance + * + * For use with zend-servicemanager v2; proxies to __invoke(). + * + * @param ServiceLocatorInterface $container + * @return ConsoleViewManager + */ + public function createService(ServiceLocatorInterface $container) + { + return $this($container, ConsoleViewManager::class); + } +} diff --git a/vendor/Zend/Mvc/Service/ControllerLoaderFactory.php b/vendor/Zend/Mvc/Service/ControllerLoaderFactory.php new file mode 100644 index 0000000..e962711 --- /dev/null +++ b/vendor/Zend/Mvc/Service/ControllerLoaderFactory.php @@ -0,0 +1,58 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Zend\Mvc\Controller\ControllerManager; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; + +/** + * @see \Zend\Mvc\Service\ControllerManagerFactory + * @deprecated please use Zend\Mvc\Service\ControllerManagerFactory instead; + * this class will be removed in release 3.0 + */ +class ControllerLoaderFactory implements FactoryInterface +{ + /** + * Create the controller loader service + * + * Creates and returns an instance of ControllerManager. The + * only controllers this manager will allow are those defined in the + * application configuration's "controllers" array. If a controller is + * matched, the scoped manager will attempt to load the controller. + * Finally, it will attempt to inject the controller plugin manager + * if the controller implements a setPluginManager() method. + * + * This plugin manager is _not_ peered against DI, and as such, will + * not load unknown classes. + * + * @param ServiceLocatorInterface $serviceLocator + * @return ControllerManager + */ + public function createService(ServiceLocatorInterface $serviceLocator) + { + trigger_error(sprintf( + '%s is deprecated; please use %s instead', + __CLASS__, + ControllerManagerFactory::class + ), E_USER_DEPRECATED); + + $controllerLoader = new ControllerManager($serviceLocator); + $controllerLoader->addPeeringServiceManager($serviceLocator); + + $config = $serviceLocator->get('Config'); + + if (isset($config['di']) && isset($config['di']['allowed_controllers']) && $serviceLocator->has('Di')) { + $controllerLoader->addAbstractFactory($serviceLocator->get('DiStrictAbstractServiceFactory')); + } + + return $controllerLoader; + } +} diff --git a/vendor/Zend/Mvc/Service/ControllerManagerFactory.php b/vendor/Zend/Mvc/Service/ControllerManagerFactory.php new file mode 100644 index 0000000..c0d8d65 --- /dev/null +++ b/vendor/Zend/Mvc/Service/ControllerManagerFactory.php @@ -0,0 +1,54 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Interop\Container\ContainerInterface; +use Zend\Mvc\Controller\ControllerManager; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; + +class ControllerManagerFactory implements FactoryInterface +{ + /** + * Create the controller manager service + * + * Creates and returns an instance of ControllerManager. The + * only controllers this manager will allow are those defined in the + * application configuration's "controllers" array. If a controller is + * matched, the scoped manager will attempt to load the controller. + * Finally, it will attempt to inject the controller plugin manager + * if the controller implements a setPluginManager() method. + * + * @param ContainerInterface $container + * @param string $Name + * @param null|array $options + * @return ControllerManager + */ + public function __invoke(ContainerInterface $container, $name, array $options = null) + { + if ($options) { + return new ControllerManager($container, $options); + } + return new ControllerManager($container); + } + + /** + * Create and return ControllerManager instance + * + * For use with zend-servicemanager v2; proxies to __invoke(). + * + * @param ServiceLocatorInterface $container + * @return ControllerManager + */ + public function createService(ServiceLocatorInterface $container) + { + return $this($container, ControllerManager::class); + } +} diff --git a/vendor/Zend/Mvc/Service/ControllerPluginManagerFactory.php b/vendor/Zend/Mvc/Service/ControllerPluginManagerFactory.php new file mode 100644 index 0000000..a35ffb8 --- /dev/null +++ b/vendor/Zend/Mvc/Service/ControllerPluginManagerFactory.php @@ -0,0 +1,17 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Zend\Mvc\Controller\PluginManager as ControllerPluginManager; + +class ControllerPluginManagerFactory extends AbstractPluginManagerFactory +{ + const PLUGIN_MANAGER_CLASS = ControllerPluginManager::class; +} diff --git a/vendor/Zend/Mvc/Service/DiAbstractServiceFactoryFactory.php b/vendor/Zend/Mvc/Service/DiAbstractServiceFactoryFactory.php new file mode 100644 index 0000000..a131e7d --- /dev/null +++ b/vendor/Zend/Mvc/Service/DiAbstractServiceFactoryFactory.php @@ -0,0 +1,68 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Interop\Container\ContainerInterface; +use Zend\Mvc\Exception; +use Zend\ServiceManager\Di\DiAbstractServiceFactory; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; +use Zend\ServiceManager\ServiceManager; + +/** + * @deprecated Since 2.7.9. The factory is now defined in zend-servicemanager-di, + * and removed in 3.0.0. Use Zend\ServiceManager\Di\DiAbstractServiceFactoryFactory + * from zend-servicemanager-di if you are using zend-servicemanager v3, and/or when + * ready to migrate to zend-mvc 3.0. + */ +class DiAbstractServiceFactoryFactory implements FactoryInterface +{ + /** + * Class responsible for instantiating a DiAbstractServiceFactory + * + * @param ContainerInterface $container + * @param string $name + * @param null|array $options + * @return DiAbstractServiceFactory + * @throws Exception\RuntimeException if zend-servicemanager v3 is in use. + */ + public function __invoke(ContainerInterface $container, $name, array $options = null) + { + if (! class_exists(DiAbstractServiceFactory::class)) { + throw new Exception\RuntimeException(sprintf( + "%s is not compatible with zend-servicemanager v3, which you are currently using. \n" + . "Please run 'composer require zendframework/zend-servicemanager-di', and then update\n" + . "your configuration to use Zend\ServiceManager\Di\DiAbstractServiceFactoryFactory instead.", + __CLASS__ + )); + } + + $factory = new DiAbstractServiceFactory($container->get('Di'), DiAbstractServiceFactory::USE_SL_BEFORE_DI); + + if ($container instanceof ServiceManager) { + $container->addAbstractFactory($factory, false); + } + + return $factory; + } + + /** + * Create and return DiAbstractServiceFactory instance + * + * For use with zend-servicemanager v2; proxies to __invoke(). + * + * @param ServiceLocatorInterface $container + * @return DiAbstractServiceFactory + */ + public function createService(ServiceLocatorInterface $container) + { + return $this($container, DiAbstractServiceFactory::class); + } +} diff --git a/vendor/Zend/Mvc/Service/DiFactory.php b/vendor/Zend/Mvc/Service/DiFactory.php new file mode 100644 index 0000000..9bf478e --- /dev/null +++ b/vendor/Zend/Mvc/Service/DiFactory.php @@ -0,0 +1,65 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Interop\Container\ContainerInterface; +use Zend\Di\Config; +use Zend\Di\Di; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; + +/** + * @deprecated Since 2.7.9. The factory is now defined in zend-servicemanager-di, + * and removed in 3.0.0. Use Zend\ServiceManager\Di\DiFactory from + * from zend-servicemanager-di if you are using zend-servicemanager v3, and/or when + * ready to migrate to zend-mvc 3.0. + */ +class DiFactory implements FactoryInterface +{ + /** + * Create and return abstract factory seeded by dependency injector + * + * Creates and returns an abstract factory seeded by the dependency + * injector. If the "di" key of the configuration service is set, that + * sub-array is passed to a DiConfig object and used to configure + * the DI instance. The DI instance is then used to seed the + * DiAbstractServiceFactory, which is then registered with the service + * manager. + * + * @param ContainerInterface $container + * @param string $name + * @param null|array $options + * @return Di + */ + public function __invoke(ContainerInterface $container, $name, array $options = null) + { + $di = new Di(); + $config = $container->has('config') ? $container->get('config') : []; + + if (isset($config['di'])) { + (new Config($config['di']))->configure($di); + } + + return $di; + } + + /** + * Create and return Di instance + * + * For use with zend-servicemanager v2; proxies to __invoke(). + * + * @param ServiceLocatorInterface $container + * @return Di + */ + public function createService(ServiceLocatorInterface $container) + { + return $this($container, Di::class); + } +} diff --git a/vendor/Zend/Mvc/Service/DiServiceInitializerFactory.php b/vendor/Zend/Mvc/Service/DiServiceInitializerFactory.php new file mode 100644 index 0000000..6dc1cb3 --- /dev/null +++ b/vendor/Zend/Mvc/Service/DiServiceInitializerFactory.php @@ -0,0 +1,61 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Interop\Container\ContainerInterface; +use Zend\Mvc\Exception; +use Zend\ServiceManager\Di\DiServiceInitializer; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; +use Zend\ServiceManager\ServiceManager; + +/** + * @deprecated Since 2.7.9. The factory is now defined in zend-servicemanager-di, + * and removed in 3.0.0. Use Zend\ServiceManager\Di\DiServiceInitializerFactory + * from zend-servicemanager-di if you are using zend-servicemanager v3, and/or when + * ready to migrate to zend-mvc 3.0. + */ +class DiServiceInitializerFactory implements FactoryInterface +{ + /** + * Class responsible for instantiating a DiServiceInitializer + * + * @param ContainerInterface $container + * @param string $name + * @param null|array $options + * @return DiServiceInitializer + */ + public function __invoke(ContainerInterface $container, $requestedName, array $options = null) + { + if (! class_exists(DiServiceInitializer::class)) { + throw new Exception\RuntimeException(sprintf( + "%s is not compatible with zend-servicemanager v3, which you are currently using. \n" + . "Please run 'composer require zendframework/zend-servicemanager-di', and then update\n" + . "your configuration to use Zend\ServiceManager\Di\DiServiceInitializerFactory instead.", + __CLASS__ + )); + } + + return new DiServiceInitializer($container->get('Di'), $container); + } + + /** + * Create and return DiServiceInitializer instance + * + * For use with zend-servicemanager v2; proxies to __invoke(). + * + * @param ServiceLocatorInterface $container + * @return DiServiceInitializer + */ + public function createService(ServiceLocatorInterface $container) + { + return $this($container, DiServiceInitializer::class); + } +} diff --git a/vendor/Zend/Mvc/Service/DiStrictAbstractServiceFactory.php b/vendor/Zend/Mvc/Service/DiStrictAbstractServiceFactory.php new file mode 100644 index 0000000..1c7c019 --- /dev/null +++ b/vendor/Zend/Mvc/Service/DiStrictAbstractServiceFactory.php @@ -0,0 +1,191 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Interop\Container\ContainerInterface; +use Zend\Di\Di; +use Zend\Di\Exception\ClassNotFoundException; +use Zend\ServiceManager\AbstractFactoryInterface; +use Zend\ServiceManager\AbstractPluginManager; +use Zend\ServiceManager\Exception; +use Zend\ServiceManager\ServiceLocatorInterface; + +/** + * Create and return instances from a DI container and/or the parent container. + * + * This abstract factory can be mapped to arbitrary class names, and used to + * pull them from the composed Di instance, using the following behaviors: + * + * - If USE_SL_BEFORE_DI is passed as the second argument to the constructor, + * the factory will attempt to fetch the service from the passed container + * first, and fall back to the composed DI container only on failure. + * - If USE_SL_AFTER_DI is passed as the second argument to the constructor, + * the factory will attempt to fetch the service from the composed DI + * container first, and fall back to the passed container only on failure. + * - If USE_SL_NONE is passed as the second argument to the constructor (or no + * argument is passed), then the factory will only fetch from the composed + * DI container. + * + * Unlike DiAbstractServiceFactory and DiServiceFactory, this abstract factory + * requires that classes requested are in a provided whitelist; if the requested + * service is not, an exception is raised. This is useful to provide a scoped + * container, e.g., to limit to known controller classes, etc. + * + * @deprecated Since 2.7.9. The factory is now defined in zend-servicemanager-di, + * and removed in 3.0.0. Use Zend\ServiceManager\Di\DiStrictAbstractServiceFactory + * from zend-servicemanager-di if you are using zend-servicemanager v3, and/or when + * ready to migrate to zend-mvc 3.0. + */ +class DiStrictAbstractServiceFactory extends Di implements AbstractFactoryInterface +{ + /**@#+ + * constants + */ + const USE_SL_BEFORE_DI = 'before'; + const USE_SL_AFTER_DI = 'after'; + const USE_SL_NONE = 'none'; + /**@#-*/ + + /** + * @var Di + */ + protected $di = null; + + /** + * @var string + */ + protected $useContainer = self::USE_SL_AFTER_DI; + + /** + * @var ContainerInterface + */ + protected $container = null; + + /** + * @var array an array of whitelisted service names (keys are the service names) + */ + protected $allowedServiceNames = []; + + /** + * @param Di $di + * @param string $useContainer + */ + public function __construct(Di $di, $useContainer = self::USE_SL_NONE) + { + $this->useContainer = $useContainer; + + // Since we are using this in a proxy-fashion, localize state + $this->di = $di; + $this->definitions = $this->di->definitions; + $this->instanceManager = $this->di->instanceManager; + } + + /** + * @param array $allowedServiceNames + */ + public function setAllowedServiceNames(array $allowedServiceNames) + { + $this->allowedServiceNames = array_flip(array_values($allowedServiceNames)); + } + + /** + * @return array + */ + public function getAllowedServiceNames() + { + return array_keys($this->allowedServiceNames); + } + + /** + * {@inheritDoc} + * + * Allows creation of services only when in a whitelist + */ + public function __invoke(ContainerInterface $container, $name, array $options = null) + { + if (! isset($this->allowedServiceNames[$name])) { + throw new Exception\InvalidServiceException(sprintf( + 'Service "%s" is not whitelisted', + $name + )); + } + + $this->container = ($container instanceof AbstractPluginManager) + ? $container->getServiceLocator() + : $container; + + return parent::get($name); + } + + /** + * {@inheritDoc} + * + * For use with zend-servicemanager v2; proxies to __invoke(). + */ + public function createServiceWithName(ServiceLocatorInterface $container, $serviceName, $requestedName) + { + return $this($container, $requestedName); + } + + /** + * Overrides Zend\Di to allow the given container's services to be reused by Di itself + * + * {@inheritDoc} + * + * @throws Exception\InvalidServiceNameException + */ + public function get($name, array $params = []) + { + if (null === $this->container) { + throw new Exception\DomainException( + 'No ServiceLocator defined, use `createServiceWithName` instead of `get`' + ); + } + + if (self::USE_SL_BEFORE_DI === $this->useContainer && $this->container->has($name)) { + return $this->container->get($name); + } + + try { + return parent::get($name, $params); + } catch (ClassNotFoundException $e) { + if (self::USE_SL_AFTER_DI === $this->useContainer && $this->container->has($name)) { + return $this->container->get($name); + } + + throw new Exception\ServiceNotFoundException( + sprintf('Service %s was not found in this DI instance', $name), + null, + $e + ); + } + } + + /** + * {@inheritDoc} + * + * Allows creation of services only when in a whitelist. + */ + public function canCreate(ContainerInterface $container, $requestedName) + { + // won't check if the service exists, we are trusting the user's whitelist + return isset($this->allowedServiceNames[$requestedName]); + } + + /** + * {@inheritDoc} + * + * For use with zend-servicemanager v2; proxies to canCreate(). + */ + public function canCreateServiceWithName(ServiceLocatorInterface $container, $name, $requestedName) + { + return $this->canCreate($container, $requestedName); + } +} diff --git a/vendor/Zend/Mvc/Service/DiStrictAbstractServiceFactoryFactory.php b/vendor/Zend/Mvc/Service/DiStrictAbstractServiceFactoryFactory.php new file mode 100644 index 0000000..7d97e1e --- /dev/null +++ b/vendor/Zend/Mvc/Service/DiStrictAbstractServiceFactoryFactory.php @@ -0,0 +1,59 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Interop\Container\ContainerInterface; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; + +/** + * @deprecated Since 2.7.9. The factory is now defined in zend-servicemanager-di, + * and removed in 3.0.0. Use Zend\ServiceManager\Di\DiStrictAbstractServiceFactoryFactory + * from zend-servicemanager-di if you are using zend-servicemanager v3, and/or when + * ready to migrate to zend-mvc 3.0. + */ +class DiStrictAbstractServiceFactoryFactory implements FactoryInterface +{ + /** + * Class responsible for instantiating a DiStrictAbstractServiceFactory + * + * @param ContainerInterface $container + * @param string $name + * @param null|array $options + * @return DiStrictAbstractServiceFactory + */ + public function __invoke(ContainerInterface $container, $name, array $options = null) + { + $diAbstractFactory = new DiStrictAbstractServiceFactory( + $container->get('Di'), + DiStrictAbstractServiceFactory::USE_SL_BEFORE_DI + ); + $config = $container->get('config'); + + if (isset($config['di']['allowed_controllers'])) { + $diAbstractFactory->setAllowedServiceNames($config['di']['allowed_controllers']); + } + + return $diAbstractFactory; + } + + /** + * Create and return DiStrictAbstractServiceFactory instance + * + * For use with zend-servicemanager v2; proxies to __invoke(). + * + * @param ServiceLocatorInterface $container + * @return DiStrictAbstractServiceFactory + */ + public function createService(ServiceLocatorInterface $container) + { + return $this($container, DiStrictAbstractServiceFactory::class); + } +} diff --git a/vendor/Zend/Mvc/Service/DispatchListenerFactory.php b/vendor/Zend/Mvc/Service/DispatchListenerFactory.php new file mode 100644 index 0000000..7c95157 --- /dev/null +++ b/vendor/Zend/Mvc/Service/DispatchListenerFactory.php @@ -0,0 +1,44 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Interop\Container\ContainerInterface; +use Zend\Mvc\DispatchListener; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; + +class DispatchListenerFactory implements FactoryInterface +{ + /** + * Create the default dispatch listener. + * + * @param ContainerInterface $container + * @param string $name + * @param null|array $options + * @return DispatchListener + */ + public function __invoke(ContainerInterface $container, $name, array $options = null) + { + return new DispatchListener($container->get('ControllerManager')); + } + + /** + * Create and return DispatchListener instance + * + * For use with zend-servicemanager v2; proxies to __invoke(). + * + * @param ServiceLocatorInterface $container + * @return DispatchListener + */ + public function createService(ServiceLocatorInterface $container) + { + return $this($container, DispatchListener::class); + } +} diff --git a/vendor/Zend/Mvc/Service/EventManagerFactory.php b/vendor/Zend/Mvc/Service/EventManagerFactory.php new file mode 100644 index 0000000..57d39bb --- /dev/null +++ b/vendor/Zend/Mvc/Service/EventManagerFactory.php @@ -0,0 +1,77 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Interop\Container\ContainerInterface; +use ReflectionClass; +use Zend\EventManager\EventManager; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; + +class EventManagerFactory implements FactoryInterface +{ + /** + * Create an EventManager instance + * + * Creates a new EventManager instance, seeding it with a shared instance + * of SharedEventManager. + * + * @param ContainerInterface $container + * @param string $name + * @param null|array $options + * @return EventManager + */ + public function __invoke(ContainerInterface $container, $name, array $options = null) + { + if ($this->acceptsSharedManagerToConstructor()) { + // zend-eventmanager v3 + return new EventManager( + $container->has('SharedEventManager') ? $container->get('SharedEventManager') : null + ); + } + + // zend-eventmanager v2 + $events = new EventManager(); + + if ($container->has('SharedEventManager')) { + $events->setSharedManager($container->get('SharedEventManager')); + } + + return $events; + } + + /** + * Create and return EventManager instance + * + * For use with zend-servicemanager v2; proxies to __invoke(). + * + * @param ServiceLocatorInterface $container + * @return EventManager + */ + public function createService(ServiceLocatorInterface $container) + { + return $this($container, EventManager::class); + } + + /** + * Does the EventManager accept the shared manager to the constructor? + * + * In zend-eventmanager v3, the EventManager accepts the shared manager + * instance to the constructor *only*, while in v2, it must be injected + * via the setSharedManager() method. + * + * @return bool + */ + private function acceptsSharedManagerToConstructor() + { + $r = new ReflectionClass(EventManager::class); + return ! $r->hasMethod('setSharedManager'); + } +} diff --git a/vendor/Zend/Mvc/Service/FilterManagerFactory.php b/vendor/Zend/Mvc/Service/FilterManagerFactory.php new file mode 100644 index 0000000..b95fabd --- /dev/null +++ b/vendor/Zend/Mvc/Service/FilterManagerFactory.php @@ -0,0 +1,17 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Zend\Filter\FilterPluginManager; + +class FilterManagerFactory extends AbstractPluginManagerFactory +{ + const PLUGIN_MANAGER_CLASS = FilterPluginManager::class; +} diff --git a/vendor/Zend/Mvc/Service/FormAnnotationBuilderFactory.php b/vendor/Zend/Mvc/Service/FormAnnotationBuilderFactory.php new file mode 100644 index 0000000..d344665 --- /dev/null +++ b/vendor/Zend/Mvc/Service/FormAnnotationBuilderFactory.php @@ -0,0 +1,80 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Interop\Container\ContainerInterface; +use Zend\EventManager\ListenerAggregateInterface; +use Zend\Form\Annotation\AnnotationBuilder; +use Zend\ServiceManager\Exception\ServiceNotCreatedException; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; + +class FormAnnotationBuilderFactory implements FactoryInterface +{ + /** + * Create service + * + * @param ContainerInterface $container + * @param string $name + * @param null|array $options + * @return AnnotationBuilder + * @throws ServiceNotCreatedException for invalid listener configuration. + */ + public function __invoke(ContainerInterface $container, $name, array $options = null) + { + //setup a form factory which can use custom form elements + $annotationBuilder = new AnnotationBuilder(); + $eventManager = $container->get('EventManager'); + $annotationBuilder->setEventManager($eventManager); + + $formElementManager = $container->get('FormElementManager'); + $formElementManager->injectFactory($container, $annotationBuilder); + + $config = $container->get('config'); + if (isset($config['form_annotation_builder'])) { + $config = $config['form_annotation_builder']; + + if (isset($config['annotations'])) { + foreach ((array) $config['annotations'] as $fullyQualifiedClassName) { + $annotationBuilder->getAnnotationParser()->registerAnnotation($fullyQualifiedClassName); + } + } + + if (isset($config['listeners'])) { + foreach ((array) $config['listeners'] as $listenerName) { + $listener = $container->get($listenerName); + if (!($listener instanceof ListenerAggregateInterface)) { + throw new ServiceNotCreatedException(sprintf('Invalid event listener (%s) provided', $listenerName)); + } + $listener->attach($eventManager); + } + } + + if (isset($config['preserve_defined_order'])) { + $annotationBuilder->setPreserveDefinedOrder($config['preserve_defined_order']); + } + } + + return $annotationBuilder; + } + + /** + * Create and return AnnotationBuilder instance + * + * For use with zend-servicemanager v2; proxies to __invoke(). + * + * @param ServiceLocatorInterface $container + * @return AnnotationBuilder + */ + public function createService(ServiceLocatorInterface $container) + { + return $this($container, AnnotationBuilder::class); + } +} diff --git a/vendor/Zend/Mvc/Service/FormElementManagerFactory.php b/vendor/Zend/Mvc/Service/FormElementManagerFactory.php new file mode 100644 index 0000000..4f5f33b --- /dev/null +++ b/vendor/Zend/Mvc/Service/FormElementManagerFactory.php @@ -0,0 +1,17 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Zend\Form\FormElementManager; + +class FormElementManagerFactory extends AbstractPluginManagerFactory +{ + const PLUGIN_MANAGER_CLASS = FormElementManager::class; +} diff --git a/vendor/Zend/Mvc/Service/HttpDefaultRenderingStrategyFactory.php b/vendor/Zend/Mvc/Service/HttpDefaultRenderingStrategyFactory.php new file mode 100644 index 0000000..329cd04 --- /dev/null +++ b/vendor/Zend/Mvc/Service/HttpDefaultRenderingStrategyFactory.php @@ -0,0 +1,64 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Interop\Container\ContainerInterface; +use Zend\Mvc\View\Http\DefaultRenderingStrategy; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; +use Zend\View\View; + +class HttpDefaultRenderingStrategyFactory implements FactoryInterface +{ + use HttpViewManagerConfigTrait; + + /** + * @param ContainerInterface $container + * @param string $name + * @param null|array $options + * @return DefaultRenderingStrategy + */ + public function __invoke(ContainerInterface $container, $name, array $options = null) + { + $strategy = new DefaultRenderingStrategy($container->get(View::class)); + $config = $this->getConfig($container); + + $this->injectLayoutTemplate($strategy, $config); + + return $strategy; + } + + /** + * Create and return DefaultRendererStrategy instance + * + * For use with zend-servicemanager v2; proxies to __invoke(). + * + * @param ServiceLocatorInterface $container + * @return DefaultRendererStrategy + */ + public function createService(ServiceLocatorInterface $container) + { + return $this($container, DefaultRendererStrategy::class); + } + + /** + * Inject layout template. + * + * Uses layout template from configuration; if none available, defaults to "layout/layout". + * + * @param DefaultRendererStrategy $strategy + * @param array $config + */ + private function injectLayoutTemplate(DefaultRenderingStrategy $strategy, array $config) + { + $layout = isset($config['layout']) ? $config['layout'] : 'layout/layout'; + $strategy->setLayoutTemplate($layout); + } +} diff --git a/vendor/Zend/Mvc/Service/HttpExceptionStrategyFactory.php b/vendor/Zend/Mvc/Service/HttpExceptionStrategyFactory.php new file mode 100644 index 0000000..9a94bd9 --- /dev/null +++ b/vendor/Zend/Mvc/Service/HttpExceptionStrategyFactory.php @@ -0,0 +1,74 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Interop\Container\ContainerInterface; +use Zend\Mvc\View\Http\ExceptionStrategy; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; + +class HttpExceptionStrategyFactory implements FactoryInterface +{ + use HttpViewManagerConfigTrait; + + /** + * @param ContainerInterface $container + * @param string $name + * @param null|array $options + * @return ExceptionStrategy + */ + public function __invoke(ContainerInterface $container, $name, array $options = null) + { + $strategy = new ExceptionStrategy(); + $config = $this->getConfig($container); + + $this->injectDisplayExceptions($strategy, $config); + $this->injectExceptionTemplate($strategy, $config); + + return $strategy; + } + + /** + * Create and return ExceptionStrategy instance + * + * For use with zend-servicemanager v2; proxies to __invoke(). + * + * @param ServiceLocatorInterface $container + * @return ExceptionStrategy + */ + public function createService(ServiceLocatorInterface $container) + { + return $this($container, ExceptionStrategy::class); + } + + /** + * Inject strategy with configured display_exceptions flag. + * + * @param ExceptionStrategy $strategy + * @param array $config + */ + private function injectDisplayExceptions(ExceptionStrategy $strategy, array $config) + { + $flag = isset($config['display_exceptions']) ? $config['display_exceptions'] : false; + $strategy->setDisplayExceptions($flag); + } + + /** + * Inject strategy with configured exception_template + * + * @param ExceptionStrategy $strategy + * @param array $config + */ + private function injectExceptionTemplate(ExceptionStrategy $strategy, array $config) + { + $template = isset($config['exception_template']) ? $config['exception_template'] : 'error'; + $strategy->setExceptionTemplate($template); + } +} diff --git a/vendor/Zend/Mvc/Service/HttpMethodListenerFactory.php b/vendor/Zend/Mvc/Service/HttpMethodListenerFactory.php new file mode 100644 index 0000000..1ef58bf --- /dev/null +++ b/vendor/Zend/Mvc/Service/HttpMethodListenerFactory.php @@ -0,0 +1,54 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Interop\Container\ContainerInterface; +use Zend\Mvc\HttpMethodListener; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; + +class HttpMethodListenerFactory implements FactoryInterface +{ + /** + * {@inheritdoc} + * @return HttpMethodListener + */ + public function __invoke(ContainerInterface $container, $name, array $options = null) + { + $config = $container->get('config'); + + if (! isset($config['http_methods_listener'])) { + return new HttpMethodListener(); + } + + $listenerConfig = $config['http_methods_listener']; + $enabled = array_key_exists('enabled', $listenerConfig) + ? $listenerConfig['enabled'] + : true; + $allowedMethods = (isset($listenerConfig['allowed_methods']) && is_array($listenerConfig['allowed_methods'])) + ? $listenerConfig['allowed_methods'] + : null; + + return new HttpMethodListener($enabled, $allowedMethods); + } + + /** + * Create and return HttpMethodListener instance + * + * For use with zend-servicemanager v2; proxies to __invoke(). + * + * @param ServiceLocatorInterface $container + * @return HttpMethodListener + */ + public function createService(ServiceLocatorInterface $container) + { + return $this($container, HttpMethodListener::class); + } +} diff --git a/vendor/Zend/Mvc/Service/HttpRouteNotFoundStrategyFactory.php b/vendor/Zend/Mvc/Service/HttpRouteNotFoundStrategyFactory.php new file mode 100644 index 0000000..a8d3294 --- /dev/null +++ b/vendor/Zend/Mvc/Service/HttpRouteNotFoundStrategyFactory.php @@ -0,0 +1,87 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Interop\Container\ContainerInterface; +use Zend\Mvc\View\Http\RouteNotFoundStrategy; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; + +class HttpRouteNotFoundStrategyFactory implements FactoryInterface +{ + use HttpViewManagerConfigTrait; + + /** + * @param ContainerInterface $container + * @param string $name + * @param null|array $options + * @return RouteNotFoundStrategy + */ + public function __invoke(ContainerInterface $container, $name, array $options = null) + { + $strategy = new RouteNotFoundStrategy(); + $config = $this->getConfig($container); + + $this->injectDisplayExceptions($strategy, $config); + $this->injectDisplayNotFoundReason($strategy, $config); + $this->injectNotFoundTemplate($strategy, $config); + + return $strategy; + } + + /** + * Create and return RouteNotFoundStrategy instance + * + * For use with zend-servicemanager v2; proxies to __invoke(). + * + * @param ServiceLocatorInterface $container + * @return RouteNotFoundStrategy + */ + public function createService(ServiceLocatorInterface $container) + { + return $this($container, RouteNotFoundStrategy::class); + } + + /** + * Inject strategy with configured display_exceptions flag. + * + * @param RouteNotFoundStrategy $strategy + * @param array $config + */ + private function injectDisplayExceptions(RouteNotFoundStrategy $strategy, array $config) + { + $flag = isset($config['display_exceptions']) ? $config['display_exceptions'] : false; + $strategy->setDisplayExceptions($flag); + } + + /** + * Inject strategy with configured display_not_found_reason flag. + * + * @param RouteNotFoundStrategy $strategy + * @param array $config + */ + private function injectDisplayNotFoundReason(RouteNotFoundStrategy $strategy, array $config) + { + $flag = isset($config['display_not_found_reason']) ? $config['display_not_found_reason'] : false; + $strategy->setDisplayNotFoundReason($flag); + } + + /** + * Inject strategy with configured not_found_template. + * + * @param RouteNotFoundStrategy $strategy + * @param array $config + */ + private function injectNotFoundTemplate(RouteNotFoundStrategy $strategy, array $config) + { + $template = isset($config['not_found_template']) ? $config['not_found_template'] : '404'; + $strategy->setNotFoundTemplate($template); + } +} diff --git a/vendor/Zend/Mvc/Service/HttpRouterFactory.php b/vendor/Zend/Mvc/Service/HttpRouterFactory.php new file mode 100644 index 0000000..074bfee --- /dev/null +++ b/vendor/Zend/Mvc/Service/HttpRouterFactory.php @@ -0,0 +1,56 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Interop\Container\ContainerInterface; +use Zend\Mvc\Router\RouteStackInterface; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; + +class HttpRouterFactory implements FactoryInterface +{ + use RouterConfigTrait; + + /** + * Create and return the HTTP router + * + * Retrieves the "router" key of the Config service, and uses it + * to instantiate the router. Uses the TreeRouteStack implementation by + * default. + * + * @param ContainerInterface $container + * @param string $name + * @param null|array $options + * @return RouteStackInterface + */ + public function __invoke(ContainerInterface $container, $name, array $options = null) + { + $config = $container->has('config') ? $container->get('config') : []; + + // Defaults + $class = 'Zend\Mvc\Router\Http\TreeRouteStack'; + $config = isset($config['router']) ? $config['router'] : []; + + return $this->createRouter($class, $config, $container); + } + + /** + * Create and return RouteStackInterface instance + * + * For use with zend-servicemanager v2; proxies to __invoke(). + * + * @param ServiceLocatorInterface $container + * @return RouteStackInterface + */ + public function createService(ServiceLocatorInterface $container) + { + return $this($container, RouteStackInterface::class); + } +} diff --git a/vendor/Zend/Mvc/Service/HttpViewManagerConfigTrait.php b/vendor/Zend/Mvc/Service/HttpViewManagerConfigTrait.php new file mode 100644 index 0000000..24239f5 --- /dev/null +++ b/vendor/Zend/Mvc/Service/HttpViewManagerConfigTrait.php @@ -0,0 +1,37 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use ArrayAccess; +use Interop\Container\ContainerInterface; + +trait HttpViewManagerConfigTrait +{ + /** + * Retrieve view_manager configuration, if present. + * + * @param ContainerInterface $container + * @return array + */ + private function getConfig(ContainerInterface $container) + { + $config = $container->has('config') ? $container->get('config') : []; + + if (isset($config['view_manager']) + && (is_array($config['view_manager']) + || $config['view_manager'] instanceof ArrayAccess + ) + ) { + return $config['view_manager']; + } + + return []; + } +} diff --git a/vendor/Zend/Mvc/Service/HttpViewManagerFactory.php b/vendor/Zend/Mvc/Service/HttpViewManagerFactory.php new file mode 100644 index 0000000..b439ba0 --- /dev/null +++ b/vendor/Zend/Mvc/Service/HttpViewManagerFactory.php @@ -0,0 +1,44 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Interop\Container\ContainerInterface; +use Zend\Mvc\View\Http\ViewManager as HttpViewManager; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; + +class HttpViewManagerFactory implements FactoryInterface +{ + /** + * Create and return a view manager for the HTTP environment + * + * @param ContainerInterface $container + * @param string $name + * @param null|array $options + * @return HttpViewManager + */ + public function __invoke(ContainerInterface $container, $name, array $options = null) + { + return new HttpViewManager(); + } + + /** + * Create and return HttpViewManager instance + * + * For use with zend-servicemanager v2; proxies to __invoke(). + * + * @param ServiceLocatorInterface $container + * @return HttpViewManager + */ + public function createService(ServiceLocatorInterface $container) + { + return $this($container, HttpViewManager::class); + } +} diff --git a/vendor/Zend/Mvc/Service/HydratorManagerFactory.php b/vendor/Zend/Mvc/Service/HydratorManagerFactory.php new file mode 100644 index 0000000..7d889a9 --- /dev/null +++ b/vendor/Zend/Mvc/Service/HydratorManagerFactory.php @@ -0,0 +1,17 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Zend\Hydrator\HydratorPluginManager; + +class HydratorManagerFactory extends AbstractPluginManagerFactory +{ + const PLUGIN_MANAGER_CLASS = HydratorPluginManager::class; +} diff --git a/vendor/Zend/Mvc/Service/InjectTemplateListenerFactory.php b/vendor/Zend/Mvc/Service/InjectTemplateListenerFactory.php new file mode 100644 index 0000000..0e059b9 --- /dev/null +++ b/vendor/Zend/Mvc/Service/InjectTemplateListenerFactory.php @@ -0,0 +1,52 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Interop\Container\ContainerInterface; +use Zend\Mvc\View\Http\InjectTemplateListener; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; + +class InjectTemplateListenerFactory implements FactoryInterface +{ + /** + * {@inheritDoc} + * + * Create and return an InjectTemplateListener instance. + * + * @return InjectTemplateListener + */ + public function __invoke(ContainerInterface $container, $name, array $options = null) + { + $listener = new InjectTemplateListener(); + $config = $container->get('config'); + + if (isset($config['view_manager']['controller_map']) + && (is_array($config['view_manager']['controller_map'])) + ) { + $listener->setControllerMap($config['view_manager']['controller_map']); + } + + return $listener; + } + + /** + * Create and return InjectTemplateListener instance + * + * For use with zend-servicemanager v2; proxies to __invoke(). + * + * @param ServiceLocatorInterface $container + * @return InjectTemplateListener + */ + public function createService(ServiceLocatorInterface $container) + { + return $this($container, InjectTemplateListener::class); + } +} diff --git a/vendor/Zend/Mvc/Service/InputFilterManagerFactory.php b/vendor/Zend/Mvc/Service/InputFilterManagerFactory.php new file mode 100644 index 0000000..8878b78 --- /dev/null +++ b/vendor/Zend/Mvc/Service/InputFilterManagerFactory.php @@ -0,0 +1,17 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Zend\InputFilter\InputFilterPluginManager; + +class InputFilterManagerFactory extends AbstractPluginManagerFactory +{ + const PLUGIN_MANAGER_CLASS = InputFilterPluginManager::class; +} diff --git a/vendor/Zend/Mvc/Service/LogProcessorManagerFactory.php b/vendor/Zend/Mvc/Service/LogProcessorManagerFactory.php new file mode 100644 index 0000000..cab6e2e --- /dev/null +++ b/vendor/Zend/Mvc/Service/LogProcessorManagerFactory.php @@ -0,0 +1,17 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Zend\Log\ProcessorPluginManager as LogProcessorPluginManager; + +class LogProcessorManagerFactory extends AbstractPluginManagerFactory +{ + const PLUGIN_MANAGER_CLASS = LogProcessorPluginManager::class; +} diff --git a/vendor/Zend/Mvc/Service/LogWriterManagerFactory.php b/vendor/Zend/Mvc/Service/LogWriterManagerFactory.php new file mode 100644 index 0000000..6a984c0 --- /dev/null +++ b/vendor/Zend/Mvc/Service/LogWriterManagerFactory.php @@ -0,0 +1,17 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Zend\Log\WriterPluginManager as LogWriterPluginManager; + +class LogWriterManagerFactory extends AbstractPluginManagerFactory +{ + const PLUGIN_MANAGER_CLASS = LogWriterPluginManager::class; +} diff --git a/vendor/Zend/Mvc/Service/ModuleManagerFactory.php b/vendor/Zend/Mvc/Service/ModuleManagerFactory.php new file mode 100644 index 0000000..34e19ab --- /dev/null +++ b/vendor/Zend/Mvc/Service/ModuleManagerFactory.php @@ -0,0 +1,156 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Interop\Container\ContainerInterface; +use Zend\ModuleManager\Listener\DefaultListenerAggregate; +use Zend\ModuleManager\Listener\ListenerOptions; +use Zend\ModuleManager\ModuleEvent; +use Zend\ModuleManager\ModuleManager; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; + +class ModuleManagerFactory implements FactoryInterface +{ + /** + * Creates and returns the module manager + * + * Instantiates the default module listeners, providing them configuration + * from the "module_listener_options" key of the ApplicationConfig + * service. Also sets the default config glob path. + * + * Module manager is instantiated and provided with an EventManager, to which + * the default listener aggregate is attached. The ModuleEvent is also created + * and attached to the module manager. + * + * @param ContainerInterface $container + * @param string $name + * @param null|array $options + * @return ModuleManager + */ + public function __invoke(ContainerInterface $container, $name, array $options = null) + { + $configuration = $container->get('ApplicationConfig'); + $listenerOptions = new ListenerOptions($configuration['module_listener_options']); + $defaultListeners = new DefaultListenerAggregate($listenerOptions); + $serviceListener = $container->get('ServiceListener'); + + $serviceListener->addServiceManager( + $container, + 'service_manager', + 'Zend\ModuleManager\Feature\ServiceProviderInterface', + 'getServiceConfig' + ); + + $serviceListener->addServiceManager( + 'ControllerManager', + 'controllers', + 'Zend\ModuleManager\Feature\ControllerProviderInterface', + 'getControllerConfig' + ); + $serviceListener->addServiceManager( + 'ControllerPluginManager', + 'controller_plugins', + 'Zend\ModuleManager\Feature\ControllerPluginProviderInterface', + 'getControllerPluginConfig' + ); + $serviceListener->addServiceManager( + 'ViewHelperManager', + 'view_helpers', + 'Zend\ModuleManager\Feature\ViewHelperProviderInterface', + 'getViewHelperConfig' + ); + $serviceListener->addServiceManager( + 'ValidatorManager', + 'validators', + 'Zend\ModuleManager\Feature\ValidatorProviderInterface', + 'getValidatorConfig' + ); + $serviceListener->addServiceManager( + 'FilterManager', + 'filters', + 'Zend\ModuleManager\Feature\FilterProviderInterface', + 'getFilterConfig' + ); + $serviceListener->addServiceManager( + 'FormElementManager', + 'form_elements', + 'Zend\ModuleManager\Feature\FormElementProviderInterface', + 'getFormElementConfig' + ); + $serviceListener->addServiceManager( + 'RoutePluginManager', + 'route_manager', + 'Zend\ModuleManager\Feature\RouteProviderInterface', + 'getRouteConfig' + ); + $serviceListener->addServiceManager( + 'SerializerAdapterManager', + 'serializers', + 'Zend\ModuleManager\Feature\SerializerProviderInterface', + 'getSerializerConfig' + ); + $serviceListener->addServiceManager( + 'HydratorManager', + 'hydrators', + 'Zend\ModuleManager\Feature\HydratorProviderInterface', + 'getHydratorConfig' + ); + $serviceListener->addServiceManager( + 'InputFilterManager', + 'input_filters', + 'Zend\ModuleManager\Feature\InputFilterProviderInterface', + 'getInputFilterConfig' + ); + $serviceListener->addServiceManager( + 'LogProcessorManager', + 'log_processors', + 'Zend\ModuleManager\Feature\LogProcessorProviderInterface', + 'getLogProcessorConfig' + ); + $serviceListener->addServiceManager( + 'LogWriterManager', + 'log_writers', + 'Zend\ModuleManager\Feature\LogWriterProviderInterface', + 'getLogWriterConfig' + ); + $serviceListener->addServiceManager( + 'TranslatorPluginManager', + 'translator_plugins', + 'Zend\ModuleManager\Feature\TranslatorPluginProviderInterface', + 'getTranslatorPluginConfig' + ); + + $events = $container->get('EventManager'); + $defaultListeners->attach($events); + $serviceListener->attach($events); + + $moduleEvent = new ModuleEvent; + $moduleEvent->setParam('ServiceManager', $container); + + $moduleManager = new ModuleManager($configuration['modules'], $events); + $moduleManager->setEvent($moduleEvent); + + return $moduleManager; + } + + /** + * Create and return ModuleManager instance + * + * For use with zend-servicemanager v2; proxies to __invoke(). + * + * @param ServiceLocatorInterface $container + * @return ModuleManager + */ + public function createService(ServiceLocatorInterface $container) + { + return $this($container, ModuleManager::class); + } +} diff --git a/vendor/Zend/Mvc/Service/PaginatorPluginManagerFactory.php b/vendor/Zend/Mvc/Service/PaginatorPluginManagerFactory.php new file mode 100644 index 0000000..547db29 --- /dev/null +++ b/vendor/Zend/Mvc/Service/PaginatorPluginManagerFactory.php @@ -0,0 +1,17 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Zend\Paginator\AdapterPluginManager as PaginatorPluginManager; + +class PaginatorPluginManagerFactory extends AbstractPluginManagerFactory +{ + const PLUGIN_MANAGER_CLASS = PaginatorPluginManager::class; +} diff --git a/vendor/Zend/Mvc/Service/RequestFactory.php b/vendor/Zend/Mvc/Service/RequestFactory.php new file mode 100644 index 0000000..04f2b75 --- /dev/null +++ b/vendor/Zend/Mvc/Service/RequestFactory.php @@ -0,0 +1,51 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Interop\Container\ContainerInterface; +use Zend\Console\Console; +use Zend\Console\Request as ConsoleRequest; +use Zend\Http\PhpEnvironment\Request as HttpRequest; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; + +class RequestFactory implements FactoryInterface +{ + /** + * Create and return a request instance, according to current environment. + * + * @param ContainerInterface $container + * @param string $name + * @param null|array $options + * @return ConsoleRequest|HttpRequest + */ + public function __invoke(ContainerInterface $container, $name, array $options = null) + { + if (Console::isConsole()) { + return new ConsoleRequest(); + } + + return new HttpRequest(); + } + + /** + * Create and return HttpRequest or ConsoleRequest instance + * + * For use with zend-servicemanager v2; proxies to __invoke(). + * + * @param ServiceLocatorInterface $container + * @return HttpRequest|ConsoleRequest + */ + public function createService(ServiceLocatorInterface $container) + { + $type = Console::isConsole() ? ConsoleRequest::class : HttpRequest::class; + return $this($container, $type); + } +} diff --git a/vendor/Zend/Mvc/Service/ResponseFactory.php b/vendor/Zend/Mvc/Service/ResponseFactory.php new file mode 100644 index 0000000..7d1e6cf --- /dev/null +++ b/vendor/Zend/Mvc/Service/ResponseFactory.php @@ -0,0 +1,51 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Interop\Container\ContainerInterface; +use Zend\Console\Console; +use Zend\Console\Response as ConsoleResponse; +use Zend\Http\PhpEnvironment\Response as HttpResponse; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; +use Zend\Stdlib\MessageInterface; + +class ResponseFactory implements FactoryInterface +{ + /** + * Create and return a response instance, according to current environment. + * + * @param ContainerInterface $container + * @param string $name + * @param null|array $options + * @return MessageInterface + */ + public function __invoke(ContainerInterface $container, $name, array $options = null) + { + if (Console::isConsole()) { + return new ConsoleResponse(); + } + + return new HttpResponse(); + } + + /** + * Create and return MessageInterface instance + * + * For use with zend-servicemanager v2; proxies to __invoke(). + * + * @param ServiceLocatorInterface $container + * @return MessageInterface + */ + public function createService(ServiceLocatorInterface $container) + { + return $this($container, MessageInterface::class); + } +} diff --git a/vendor/Zend/Mvc/Service/RoutePluginManagerFactory.php b/vendor/Zend/Mvc/Service/RoutePluginManagerFactory.php new file mode 100644 index 0000000..1752f61 --- /dev/null +++ b/vendor/Zend/Mvc/Service/RoutePluginManagerFactory.php @@ -0,0 +1,17 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Zend\Mvc\Router\RoutePluginManager; + +class RoutePluginManagerFactory extends AbstractPluginManagerFactory +{ + const PLUGIN_MANAGER_CLASS = RoutePluginManager::class; +} diff --git a/vendor/Zend/Mvc/Service/RouterConfigTrait.php b/vendor/Zend/Mvc/Service/RouterConfigTrait.php new file mode 100644 index 0000000..fb7b08b --- /dev/null +++ b/vendor/Zend/Mvc/Service/RouterConfigTrait.php @@ -0,0 +1,40 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Interop\Container\ContainerInterface; + +trait RouterConfigTrait +{ + /** + * Create and return a router instance, by calling the appropriate factory. + * + * @param string $class + * @param array $config + * @param ContainerInterface $container + */ + private function createRouter($class, array $config, ContainerInterface $container) + { + // Obtain the configured router class, if any + if (isset($config['router_class']) && class_exists($config['router_class'])) { + $class = $config['router_class']; + } + + // Inject the route plugins + if (! isset($config['route_plugins'])) { + $routePluginManager = $container->get('RoutePluginManager'); + $config['route_plugins'] = $routePluginManager; + } + + // Obtain an instance + $factory = sprintf('%s::factory', $class); + return call_user_func($factory, $config); + } +} diff --git a/vendor/Zend/Mvc/Service/RouterFactory.php b/vendor/Zend/Mvc/Service/RouterFactory.php new file mode 100644 index 0000000..ac54bd0 --- /dev/null +++ b/vendor/Zend/Mvc/Service/RouterFactory.php @@ -0,0 +1,61 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Interop\Container\ContainerInterface; +use Zend\Console\Console; +use Zend\Mvc\Router\RouteStackInterface; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; + +class RouterFactory implements FactoryInterface +{ + /** + * Create and return the router + * + * Delegates to either the ConsoleRouter or HttpRouter service based + * on the environment type. + * + * @param ContainerInterface $container + * @param string $name + * @param null|array $options + * @return RouteStackInterface + */ + public function __invoke(ContainerInterface $container, $name, array $options = null) + { + // Console environment? + if ($name === 'ConsoleRouter' // force console router + || (strtolower($name) === 'router' && Console::isConsole()) // auto detect console + ) { + return $container->get('ConsoleRouter'); + } + + return $container->get('HttpRouter'); + } + + /** + * Create and return RouteStackInterface instance + * + * For use with zend-servicemanager v2; proxies to __invoke(). + * + * @param ServiceLocatorInterface $container + * @param null|string $normalizedName + * @param null|string $requestedName + * @return RouteStackInterface + */ + public function createService(ServiceLocatorInterface $container, $normalizedName = null, $requestedName = null) + { + if ($normalizedName === 'router' && Console::isConsole()) { + $requestedName = 'ConsoleRouter'; + } + + return $this($container, $requestedName); + } +} diff --git a/vendor/Zend/Mvc/Service/SerializerAdapterPluginManagerFactory.php b/vendor/Zend/Mvc/Service/SerializerAdapterPluginManagerFactory.php new file mode 100644 index 0000000..005001d --- /dev/null +++ b/vendor/Zend/Mvc/Service/SerializerAdapterPluginManagerFactory.php @@ -0,0 +1,17 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Zend\Serializer\AdapterPluginManager as SerializerAdapterPluginManager; + +class SerializerAdapterPluginManagerFactory extends AbstractPluginManagerFactory +{ + const PLUGIN_MANAGER_CLASS = SerializerAdapterPluginManager::class; +} diff --git a/vendor/Zend/Mvc/Service/ServiceListenerFactory.php b/vendor/Zend/Mvc/Service/ServiceListenerFactory.php new file mode 100644 index 0000000..ded3573 --- /dev/null +++ b/vendor/Zend/Mvc/Service/ServiceListenerFactory.php @@ -0,0 +1,320 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Interop\Container\ContainerInterface; +use ReflectionClass; +use Zend\Config\Config; +use Zend\ModuleManager\Listener\ServiceListener; +use Zend\ModuleManager\Listener\ServiceListenerInterface; +use Zend\Mvc\Application; +use Zend\Mvc\View; +use Zend\ServiceManager\Exception\ServiceNotCreatedException; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\Factory\InvokableFactory; +use Zend\ServiceManager\ServiceLocatorInterface; + +class ServiceListenerFactory implements FactoryInterface +{ + /** + * @var string + */ + const MISSING_KEY_ERROR = 'Invalid service listener options detected, %s array must contain %s key.'; + + /** + * @var string + */ + const VALUE_TYPE_ERROR = 'Invalid service listener options detected, %s must be a string, %s given.'; + + /** + * Default mvc-related service configuration -- can be overridden by modules. + * + * @todo Re-enable form abstract service factory after zend-form updated to servicemanager v3. + * @var array + */ + protected $defaultServiceConfig = [ + 'aliases' => [ + 'configuration' => 'config', + 'Configuration' => 'config', + 'console' => 'ConsoleAdapter', + 'Console' => 'ConsoleAdapter', + 'ConsoleDefaultRenderingStrategy' => View\Console\DefaultRenderingStrategy::class, + 'ControllerLoader' => 'ControllerManager', + 'Di' => 'DependencyInjector', + 'HttpDefaultRenderingStrategy' => View\Http\DefaultRenderingStrategy::class, + 'MiddlewareListener' => 'Zend\Mvc\MiddlewareListener', + 'RouteListener' => 'Zend\Mvc\RouteListener', + 'SendResponseListener' => 'Zend\Mvc\SendResponseListener', + 'View' => 'Zend\View\View', + 'ViewFeedRenderer' => 'Zend\View\Renderer\FeedRenderer', + 'ViewJsonRenderer' => 'Zend\View\Renderer\JsonRenderer', + 'ViewPhpRendererStrategy' => 'Zend\View\Strategy\PhpRendererStrategy', + 'ViewPhpRenderer' => 'Zend\View\Renderer\PhpRenderer', + 'ViewRenderer' => 'Zend\View\Renderer\PhpRenderer', + 'Zend\Di\LocatorInterface' => 'DependencyInjector', + 'Zend\Form\Annotation\FormAnnotationBuilder' => 'FormAnnotationBuilder', + 'Zend\Mvc\Controller\PluginManager' => 'ControllerPluginManager', + 'Zend\Mvc\View\Http\InjectTemplateListener' => 'InjectTemplateListener', + 'Zend\View\Renderer\RendererInterface' => 'Zend\View\Renderer\PhpRenderer', + 'Zend\View\Resolver\TemplateMapResolver' => 'ViewTemplateMapResolver', + 'Zend\View\Resolver\TemplatePathStack' => 'ViewTemplatePathStack', + 'Zend\View\Resolver\AggregateResolver' => 'ViewResolver', + 'Zend\View\Resolver\ResolverInterface' => 'ViewResolver', + ], + 'invokables' => [], + 'factories' => [ + 'Application' => ApplicationFactory::class, + 'config' => 'Zend\Mvc\Service\ConfigFactory', + 'ControllerManager' => 'Zend\Mvc\Service\ControllerManagerFactory', + 'ControllerPluginManager' => 'Zend\Mvc\Service\ControllerPluginManagerFactory', + 'ConsoleAdapter' => 'Zend\Mvc\Service\ConsoleAdapterFactory', + 'ConsoleExceptionStrategy' => ConsoleExceptionStrategyFactory::class, + 'ConsoleRouter' => ConsoleRouterFactory::class, + 'ConsoleRouteNotFoundStrategy' => ConsoleRouteNotFoundStrategyFactory::class, + 'ConsoleViewManager' => 'Zend\Mvc\Service\ConsoleViewManagerFactory', + 'DependencyInjector' => DiFactory::class, + 'DiAbstractServiceFactory' => DiAbstractServiceFactoryFactory::class, + 'DiServiceInitializer' => DiServiceInitializerFactory::class, + 'DiStrictAbstractServiceFactory' => DiStrictAbstractServiceFactoryFactory::class, + 'DispatchListener' => 'Zend\Mvc\Service\DispatchListenerFactory', + 'FilterManager' => 'Zend\Mvc\Service\FilterManagerFactory', + 'FormAnnotationBuilder' => 'Zend\Mvc\Service\FormAnnotationBuilderFactory', + 'FormElementManager' => 'Zend\Mvc\Service\FormElementManagerFactory', + 'HttpExceptionStrategy' => HttpExceptionStrategyFactory::class, + 'HttpMethodListener' => 'Zend\Mvc\Service\HttpMethodListenerFactory', + 'HttpRouteNotFoundStrategy' => HttpRouteNotFoundStrategyFactory::class, + 'HttpRouter' => HttpRouterFactory::class, + 'HttpViewManager' => 'Zend\Mvc\Service\HttpViewManagerFactory', + 'HydratorManager' => 'Zend\Mvc\Service\HydratorManagerFactory', + 'InjectTemplateListener' => 'Zend\Mvc\Service\InjectTemplateListenerFactory', + 'InputFilterManager' => 'Zend\Mvc\Service\InputFilterManagerFactory', + 'LogProcessorManager' => 'Zend\Mvc\Service\LogProcessorManagerFactory', + 'LogWriterManager' => 'Zend\Mvc\Service\LogWriterManagerFactory', + 'MvcTranslator' => 'Zend\Mvc\Service\TranslatorServiceFactory', + 'PaginatorPluginManager' => 'Zend\Mvc\Service\PaginatorPluginManagerFactory', + 'Request' => 'Zend\Mvc\Service\RequestFactory', + 'Response' => 'Zend\Mvc\Service\ResponseFactory', + 'Router' => 'Zend\Mvc\Service\RouterFactory', + 'RoutePluginManager' => 'Zend\Mvc\Service\RoutePluginManagerFactory', + 'SerializerAdapterManager' => 'Zend\Mvc\Service\SerializerAdapterPluginManagerFactory', + 'TranslatorPluginManager' => 'Zend\Mvc\Service\TranslatorPluginManagerFactory', + 'ValidatorManager' => 'Zend\Mvc\Service\ValidatorManagerFactory', + View\Console\DefaultRenderingStrategy::class => InvokableFactory::class, + 'ViewHelperManager' => 'Zend\Mvc\Service\ViewHelperManagerFactory', + View\Http\DefaultRenderingStrategy::class => HttpDefaultRenderingStrategyFactory::class, + 'ViewFeedStrategy' => 'Zend\Mvc\Service\ViewFeedStrategyFactory', + 'ViewJsonStrategy' => 'Zend\Mvc\Service\ViewJsonStrategyFactory', + 'ViewManager' => 'Zend\Mvc\Service\ViewManagerFactory', + 'ViewResolver' => 'Zend\Mvc\Service\ViewResolverFactory', + 'ViewTemplateMapResolver' => 'Zend\Mvc\Service\ViewTemplateMapResolverFactory', + 'ViewTemplatePathStack' => 'Zend\Mvc\Service\ViewTemplatePathStackFactory', + 'ViewPrefixPathStackResolver' => 'Zend\Mvc\Service\ViewPrefixPathStackResolverFactory', + 'Zend\Mvc\MiddlewareListener' => InvokableFactory::class, + 'Zend\Mvc\RouteListener' => InvokableFactory::class, + 'Zend\Mvc\SendResponseListener' => InvokableFactory::class, + 'Zend\View\Renderer\FeedRenderer' => InvokableFactory::class, + 'Zend\View\Renderer\JsonRenderer' => InvokableFactory::class, + 'Zend\View\Renderer\PhpRenderer' => ViewPhpRendererFactory::class, + 'Zend\View\Strategy\PhpRendererStrategy' => ViewPhpRendererStrategyFactory::class, + 'Zend\View\View' => ViewFactory::class, + ], + 'abstract_factories' => [ + 'Zend\Form\FormAbstractServiceFactory', + ], + ]; + + /** + * Constructor + * + * When executed under zend-servicemanager v3, injects additional aliases + * to ensure backwards compatibility. + */ + public function __construct() + { + $r = new ReflectionClass(ServiceLocatorInterface::class); + if ($r->hasMethod('build')) { + $this->injectV3Aliases(); + } + } + + /** + * Create the service listener service + * + * Tries to get a service named ServiceListenerInterface from the service + * locator, otherwise creates a ServiceListener instance, passing it the + * container instance and the default service configuration, which can be + * overridden by modules. + * + * It looks for the 'service_listener_options' key in the application + * config and tries to add service/plugin managers as configured. The value + * of 'service_listener_options' must be a list (array) which contains the + * following keys: + * + * - service_manager: the name of the service manage to create as string + * - config_key: the name of the configuration key to search for as string + * - interface: the name of the interface that modules can implement as string + * - method: the name of the method that modules have to implement as string + * + * @param ServiceLocatorInterface $serviceLocator + * @return ServiceListenerInterface + * @throws ServiceNotCreatedException for invalid ServiceListener service + * @throws ServiceNotCreatedException For invalid configurations. + */ + public function __invoke(ContainerInterface $container, $requestedName, array $options = null) + { + $configuration = $container->get('ApplicationConfig'); + + $serviceListener = $container->has('ServiceListenerInterface') + ? $container->get('ServiceListenerInterface') + : new ServiceListener($container); + + if (! $serviceListener instanceof ServiceListenerInterface) { + throw new ServiceNotCreatedException( + 'The service named ServiceListenerInterface must implement ' + . ServiceListenerInterface::class + ); + } + + $serviceListener->setDefaultServiceConfig($this->defaultServiceConfig); + + if (isset($configuration['service_listener_options'])) { + $this->injectServiceListenerOptions($configuration['service_listener_options'], $serviceListener); + } + + return $serviceListener; + } + + /** + * Create and return the ServiceListener (v2) + * + * @param ServiceLocatorInterface $container + * @return ServiceListenerInterface + */ + public function createService(ServiceLocatorInterface $container) + { + return $this($container, ServiceListener::class); + } + + /** + * Validate and inject plugin manager options into the service listener. + * + * @param array $options + * @param ServiceListenerInterface $serviceListener + * @throws ServiceListenerInterface for invalid $options types + */ + private function injectServiceListenerOptions($options, ServiceListenerInterface $serviceListener) + { + if (! is_array($options)) { + throw new ServiceNotCreatedException(sprintf( + 'The value of service_listener_options must be an array, %s given.', + (is_object($options) ? get_class($options) : gettype($options)) + )); + } + + foreach ($options as $key => $newServiceManager) { + $this->validatePluginManagerOptions($newServiceManager, $key); + + $serviceListener->addServiceManager( + $newServiceManager['service_manager'], + $newServiceManager['config_key'], + $newServiceManager['interface'], + $newServiceManager['method'] + ); + } + } + + /** + * Validate the structure and types for plugin manager configuration options. + * + * Ensures all required keys are present in the expected types. + * + * @param array $options + * @param string $name Plugin manager service name; used for exception messages + * @throws ServiceNotCreatedException for any missing configuration options. + * @throws ServiceNotCreatedException for configuration options of invalid types. + */ + private function validatePluginManagerOptions($options, $name) + { + if (! is_array($options)) { + throw new ServiceNotCreatedException(sprintf( + 'Plugin manager configuration for "%s" is invalid; must be an array, received "%s"', + $name, + (is_object($options) ? get_class($options) : gettype($options)) + )); + } + + if (! isset($options['service_manager'])) { + throw new ServiceNotCreatedException(sprintf(self::MISSING_KEY_ERROR, $name, 'service_manager')); + } + + if (! is_string($options['service_manager'])) { + throw new ServiceNotCreatedException(sprintf( + self::VALUE_TYPE_ERROR, + 'service_manager', + gettype($options['service_manager']) + )); + } + + if (! isset($options['config_key'])) { + throw new ServiceNotCreatedException(sprintf(self::MISSING_KEY_ERROR, $name, 'config_key')); + } + + if (! is_string($options['config_key'])) { + throw new ServiceNotCreatedException(sprintf( + self::VALUE_TYPE_ERROR, + 'config_key', + gettype($options['config_key']) + )); + } + + if (! isset($options['interface'])) { + throw new ServiceNotCreatedException(sprintf(self::MISSING_KEY_ERROR, $name, 'interface')); + } + + if (! is_string($options['interface'])) { + throw new ServiceNotCreatedException(sprintf( + self::VALUE_TYPE_ERROR, + 'interface', + gettype($options['interface']) + )); + } + + if (! isset($options['method'])) { + throw new ServiceNotCreatedException(sprintf(self::MISSING_KEY_ERROR, $name, 'method')); + } + + if (! is_string($options['method'])) { + throw new ServiceNotCreatedException(sprintf( + self::VALUE_TYPE_ERROR, + 'method', + gettype($options['method']) + )); + } + } + + /** + * Inject additional aliases for zend-servicemanager v3 usage + * + * If the constructor detects that we're operating under zend-servicemanager v3, + * this method injects additional aliases to ensure that common services + * can be retrieved using both Titlecase and lowercase, and will get the + * same instances. + * + * @return void + */ + private function injectV3Aliases() + { + $this->defaultServiceConfig['aliases']['application'] = 'Application'; + $this->defaultServiceConfig['aliases']['Config'] = 'config'; + $this->defaultServiceConfig['aliases']['request'] = 'Request'; + $this->defaultServiceConfig['aliases']['response'] = 'Response'; + $this->defaultServiceConfig['aliases']['router'] = 'Router'; + } +} diff --git a/vendor/Zend/Mvc/Service/ServiceManagerConfig.php b/vendor/Zend/Mvc/Service/ServiceManagerConfig.php new file mode 100644 index 0000000..94badaf --- /dev/null +++ b/vendor/Zend/Mvc/Service/ServiceManagerConfig.php @@ -0,0 +1,253 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Interop\Container\ContainerInterface; +use Zend\EventManager\EventManager; +use Zend\EventManager\EventManagerAwareInterface; +use Zend\EventManager\EventManagerInterface; +use Zend\EventManager\SharedEventManager; +use Zend\EventManager\SharedEventManagerInterface; +use Zend\ModuleManager\Listener\ServiceListener; +use Zend\ModuleManager\ModuleManager; +use Zend\ServiceManager\AbstractPluginManager; +use Zend\ServiceManager\Config; +use Zend\ServiceManager\ServiceLocatorAwareInterface; +use Zend\ServiceManager\ServiceManager; +use Zend\ServiceManager\ServiceManagerAwareInterface; +use Zend\Stdlib\ArrayUtils; + +class ServiceManagerConfig extends Config +{ + + /** + * Default service configuration. + * + * In addition to these, the constructor registers several factories and + * initializers; see that method for details. + * + * @var array + */ + protected $config = [ + 'abstract_factories' => [], + 'aliases' => [ + 'EventManagerInterface' => EventManager::class, + EventManagerInterface::class => 'EventManager', + ModuleManager::class => 'ModuleManager', + ServiceListener::class => 'ServiceListener', + SharedEventManager::class => 'SharedEventManager', + 'SharedEventManagerInterface' => 'SharedEventManager', + SharedEventManagerInterface::class => 'SharedEventManager', + ], + 'delegators' => [], + 'factories' => [ + 'EventManager' => EventManagerFactory::class, + 'ModuleManager' => ModuleManagerFactory::class, + 'ServiceListener' => ServiceListenerFactory::class, + ], + 'lazy_services' => [], + 'initializers' => [], + 'invokables' => [], + 'services' => [], + 'shared' => [ + 'EventManager' => false, + ], + ]; + + /** + * Constructor + * + * Merges internal arrays with those passed via configuration, and also + * defines: + * + * - factory for the service 'SharedEventManager'. + * - initializer for EventManagerAwareInterface implementations + * - initializer for ServiceManagerAwareInterface implementations + * - initializer for ServiceLocatorAwareInterface implementations + * + * @param array $config + */ + public function __construct(array $config = []) + { + $this->config['factories']['ServiceManager'] = function ($container) { + return $container; + }; + + $this->config['factories']['SharedEventManager'] = function () { + return new SharedEventManager(); + }; + + $this->config['initializers'] = ArrayUtils::merge($this->config['initializers'], [ + 'EventManagerAwareInitializer' => function ($first, $second) { + if ($first instanceof ContainerInterface) { + $container = $first; + $instance = $second; + } else { + $container = $second; + $instance = $first; + } + + if (! $instance instanceof EventManagerAwareInterface) { + return; + } + + $eventManager = $instance->getEventManager(); + + // If the instance has an EM WITH an SEM composed, do nothing. + if ($eventManager instanceof EventManagerInterface + && $eventManager->getSharedManager() instanceof SharedEventManagerInterface + ) { + return; + } + + $instance->setEventManager($container->get('EventManager')); + }, + 'ServiceManagerAwareInitializer' => function ($first, $second) { + if ($first instanceof ContainerInterface) { + // zend-servicemanager v3 + $container = $first; + $instance = $second; + } else { + // zend-servicemanager v2 + $container = $second; + $instance = $first; + } + + if ($container instanceof ServiceManager && $instance instanceof ServiceManagerAwareInterface) { + trigger_error(sprintf( + 'ServiceManagerAwareInterface is deprecated and will be removed in version 3.0, along ' + . 'with the ServiceManagerAwareInitializer. Please update your class %s to remove ' + . 'the implementation, and start injecting your dependencies via factory instead.', + get_class($instance) + ), E_USER_DEPRECATED); + $instance->setServiceManager($container); + } + }, + 'ServiceLocatorAwareInitializer' => function ($first, $second) { + if ($first instanceof AbstractPluginManager) { + // Edge case under zend-servicemanager v2 + $container = $second; + $instance = $first; + } elseif ($first instanceof ContainerInterface) { + // zend-servicemanager v3 + $container = $first; + $instance = $second; + } else { + // zend-servicemanager v2 + $container = $second; + $instance = $first; + } + + // For service locator aware classes, inject the service + // locator, but emit a deprecation notice. Skip plugin manager + // implementations; they're dealt with later. + if ($instance instanceof ServiceLocatorAwareInterface + && ! $instance instanceof AbstractPluginManager + ) { + trigger_error(sprintf( + 'ServiceLocatorAwareInterface is deprecated and will be removed in version 3.0, along ' + . 'with the ServiceLocatorAwareInitializer. Please update your class %s to remove ' + . 'the implementation, and start injecting your dependencies via factory instead.', + get_class($instance) + ), E_USER_DEPRECATED); + $instance->setServiceLocator($container); + } + + // For service locator aware plugin managers that do not have + // the service locator already injected, inject it, but emit a + // deprecation notice. + if ($instance instanceof ServiceLocatorAwareInterface + && $instance instanceof AbstractPluginManager + && ! $instance->getServiceLocator() + ) { + trigger_error(sprintf( + 'ServiceLocatorAwareInterface is deprecated and will be removed in version 3.0, along ' + . 'with the ServiceLocatorAwareInitializer. Please update your %s plugin manager factory ' + . 'to inject the parent service locator via the constructor.', + get_class($instance) + ), E_USER_DEPRECATED); + $instance->setServiceLocator($container); + } + }, + ]); + + // In zend-servicemanager v2, incoming configuration is not merged + // with existing; it replaces. So we need to detect that and merge. + if (method_exists($this, 'getAllowOverride')) { + $config = ArrayUtils::merge($this->config, $config); + } + + parent::__construct($config); + } + + /** + * Configure service container. + * + * Uses the configuration present in the instance to configure the provided + * service container. + * + * Before doing so, it adds a "service" entry for the ServiceManager class, + * pointing to the provided service container. + * + * @param ServiceManager $services + * @return ServiceManager + */ + public function configureServiceManager(ServiceManager $services) + { + $this->config['services'][ServiceManager::class] = $services; + + /* + printf("Configuration prior to configuring servicemanager:\n"); + foreach ($this->config as $type => $list) { + switch ($type) { + case 'aliases': + case 'delegators': + case 'factories': + case 'invokables': + case 'lazy_services': + case 'services': + case 'shared': + foreach (array_keys($list) as $name) { + printf(" %s (%s)\n", $name, $type); + } + break; + + case 'initializers': + case 'abstract_factories': + foreach ($list as $callable) { + printf(" %s (%s)\n", (is_object($callable) ? get_class($callable) : $callable), $type); + } + break; + + default: + break; + } + } + */ + + // This is invoked as part of the bootstrapping process, and requires + // the ability to override services. + $services->setAllowOverride(true); + parent::configureServiceManager($services); + $services->setAllowOverride(false); + + return $services; + } + + /** + * Return all service configuration (v3) + * + * @return array + */ + public function toArray() + { + return $this->config; + } +} diff --git a/vendor/Zend/Mvc/Service/TranslatorPluginManagerFactory.php b/vendor/Zend/Mvc/Service/TranslatorPluginManagerFactory.php new file mode 100644 index 0000000..5a88a25 --- /dev/null +++ b/vendor/Zend/Mvc/Service/TranslatorPluginManagerFactory.php @@ -0,0 +1,17 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Zend\I18n\Translator\LoaderPluginManager as TranslatorLoaderPluginManager; + +class TranslatorPluginManagerFactory extends AbstractPluginManagerFactory +{ + const PLUGIN_MANAGER_CLASS = TranslatorLoaderPluginManager::class; +} diff --git a/vendor/Zend/Mvc/Service/TranslatorServiceFactory.php b/vendor/Zend/Mvc/Service/TranslatorServiceFactory.php new file mode 100644 index 0000000..1675b4b --- /dev/null +++ b/vendor/Zend/Mvc/Service/TranslatorServiceFactory.php @@ -0,0 +1,82 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Interop\Container\ContainerInterface; +use Traversable; +use Zend\I18n\Translator\Translator; +use Zend\Mvc\I18n\DummyTranslator; +use Zend\Mvc\I18n\Translator as MvcTranslator; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; + +/** + * Overrides the translator factory from the i18n component in order to + * replace it with the bridge class from this namespace. + */ +class TranslatorServiceFactory implements FactoryInterface +{ + /** + * @param ContainerInterface $container + * @param string $name + * @param null|array $options + * @return MvcTranslator + */ + public function __invoke(ContainerInterface $container, $name, array $options = null) + { + // Assume that if a user has registered a service for the + // TranslatorInterface, it must be valid + if ($container->has('Zend\I18n\Translator\TranslatorInterface')) { + return new MvcTranslator($container->get('Zend\I18n\Translator\TranslatorInterface')); + } + + // Load a translator from configuration, if possible + if ($container->has('config')) { + $config = $container->get('config'); + + // 'translator' => false + if (array_key_exists('translator', $config) && $config['translator'] === false) { + return new MvcTranslator(new DummyTranslator()); + } + + // 'translator' => array( ... translator options ... ) + if (array_key_exists('translator', $config) + && ((is_array($config['translator']) && !empty($config['translator'])) + || $config['translator'] instanceof Traversable) + ) { + $i18nTranslator = Translator::factory($config['translator']); + $i18nTranslator->setPluginManager($container->get('TranslatorPluginManager')); + $container->setService('Zend\I18n\Translator\TranslatorInterface', $i18nTranslator); + return new MvcTranslator($i18nTranslator); + } + } + + // If ext/intl is not loaded, return a dummy translator + if (!extension_loaded('intl')) { + return new MvcTranslator(new DummyTranslator()); + } + + // For BC purposes (pre-2.3.0), use the I18n Translator + return new MvcTranslator(new Translator()); + } + + /** + * Create and return MvcTranslator instance + * + * For use with zend-servicemanager v2; proxies to __invoke(). + * + * @param ServiceLocatorInterface $container + * @return MvcTranslator + */ + public function createService(ServiceLocatorInterface $container) + { + return $this($container, MvcTranslator::class); + } +} diff --git a/vendor/Zend/Mvc/Service/ValidatorManagerFactory.php b/vendor/Zend/Mvc/Service/ValidatorManagerFactory.php new file mode 100644 index 0000000..24691e4 --- /dev/null +++ b/vendor/Zend/Mvc/Service/ValidatorManagerFactory.php @@ -0,0 +1,17 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Zend\Validator\ValidatorPluginManager; + +class ValidatorManagerFactory extends AbstractPluginManagerFactory +{ + const PLUGIN_MANAGER_CLASS = ValidatorPluginManager::class; +} diff --git a/vendor/Zend/Mvc/Service/ViewFactory.php b/vendor/Zend/Mvc/Service/ViewFactory.php new file mode 100644 index 0000000..b8cc4bd --- /dev/null +++ b/vendor/Zend/Mvc/Service/ViewFactory.php @@ -0,0 +1,49 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Interop\Container\ContainerInterface; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; +use Zend\View\Strategy\PhpRendererStrategy; +use Zend\View\View; + +class ViewFactory implements FactoryInterface +{ + /** + * @param ContainerInterface $container + * @param string $name + * @param null|array $options + * @return View + */ + public function __invoke(ContainerInterface $container, $name, array $options = null) + { + $view = new View(); + $events = $container->get('EventManager'); + + $view->setEventManager($events); + $container->get(PhpRendererStrategy::class)->attach($events); + + return $view; + } + + /** + * Create and return View instance + * + * For use with zend-servicemanager v2; proxies to __invoke(). + * + * @param ServiceLocatorInterface $container + * @return View + */ + public function createService(ServiceLocatorInterface $container) + { + return $this($container, View::class); + } +} diff --git a/vendor/Zend/Mvc/Service/ViewFeedStrategyFactory.php b/vendor/Zend/Mvc/Service/ViewFeedStrategyFactory.php new file mode 100644 index 0000000..274b90d --- /dev/null +++ b/vendor/Zend/Mvc/Service/ViewFeedStrategyFactory.php @@ -0,0 +1,49 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Interop\Container\ContainerInterface; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; +use Zend\View\Strategy\FeedStrategy; + +class ViewFeedStrategyFactory implements FactoryInterface +{ + /** + * Create and return the Feed view strategy + * + * Retrieves the ViewFeedRenderer service from the service locator, and + * injects it into the constructor for the feed strategy. + * + * It then attaches the strategy to the View service, at a priority of 100. + * + * @param ContainerInterface $container + * @param string $name + * @param null|array $options + * @return FeedStrategy + */ + public function __invoke(ContainerInterface $container, $name, array $options = null) + { + return new FeedStrategy($container->get('ViewFeedRenderer')); + } + + /** + * Create and return FeedStrategy instance + * + * For use with zend-servicemanager v2; proxies to __invoke(). + * + * @param ServiceLocatorInterface $container + * @return FeedStrategy + */ + public function createService(ServiceLocatorInterface $container) + { + return $this($container, FeedStrategy::class); + } +} diff --git a/vendor/Zend/Mvc/Service/ViewHelperManagerFactory.php b/vendor/Zend/Mvc/Service/ViewHelperManagerFactory.php new file mode 100644 index 0000000..bcb2f16 --- /dev/null +++ b/vendor/Zend/Mvc/Service/ViewHelperManagerFactory.php @@ -0,0 +1,206 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Interop\Container\ContainerInterface; +use Zend\Console\Console; +use Zend\Mvc\Router\RouteMatch; +use Zend\ServiceManager\ConfigInterface; +use Zend\ServiceManager\Exception\ServiceNotCreatedException; +use Zend\View\Helper as ViewHelper; +use Zend\View\HelperPluginManager; + +class ViewHelperManagerFactory extends AbstractPluginManagerFactory +{ + const PLUGIN_MANAGER_CLASS = HelperPluginManager::class; + + /** + * An array of helper configuration classes to ensure are on the helper_map stack. + * + * These are *not* imported; that way they can be optional dependencies. + * + * @todo Re-enable these once their components have been updated to zend-servicemanager v3 + * @var array + */ + protected $defaultHelperMapClasses = [ + 'Zend\Form\View\HelperConfig', + 'Zend\I18n\View\HelperConfig', + 'Zend\Navigation\View\HelperConfig', + ]; + + /** + * Create and return the view helper manager + * + * @param ContainerInterface $container + * @return HelperPluginManager + * @throws ServiceNotCreatedException + */ + public function __invoke(ContainerInterface $container, $requestedName, array $options = null) + { + $options = $options ?: []; + $options['factories'] = isset($options['factories']) ? $options['factories'] : []; + $plugins = parent::__invoke($container, $requestedName, $options); + + // Configure default helpers from other components + $plugins = $this->configureHelpers($plugins); + + // Override plugin factories + $plugins = $this->injectOverrideFactories($plugins, $container); + + return $plugins; + } + + /** + * Configure helpers from other components. + * + * Loops through the list of default helper configuration classes, and uses + * each to configure the helper plugin manager. + * + * @param HelperPluginManager $plugins + * @return HelperPluginManager + */ + private function configureHelpers(HelperPluginManager $plugins) + { + foreach ($this->defaultHelperMapClasses as $configClass) { + if (! is_string($configClass) || ! class_exists($configClass)) { + continue; + } + + $config = new $configClass(); + + if (! $config instanceof ConfigInterface) { + throw new ServiceNotCreatedException(sprintf( + 'Invalid service manager configuration class provided; received "%s", expected class implementing %s', + $configClass, + ConfigInterface::class + )); + } + + $config->configureServiceManager($plugins); + } + + return $plugins; + } + + /** + * Inject override factories into the plugin manager. + * + * @param HelperPluginManager $plugins + * @param ContainerInterface $services + * @return HelperPluginManager + */ + private function injectOverrideFactories(HelperPluginManager $plugins, ContainerInterface $services) + { + // Configure URL view helper + $urlFactory = $this->createUrlHelperFactory($services); + $plugins->setFactory(ViewHelper\Url::class, $urlFactory); + $plugins->setFactory('zendviewhelperurl', $urlFactory); + + // Configure base path helper + $basePathFactory = $this->createBasePathHelperFactory($services); + $plugins->setFactory(ViewHelper\BasePath::class, $basePathFactory); + $plugins->setFactory('zendviewhelperbasepath', $basePathFactory); + + // Configure doctype view helper + $doctypeFactory = $this->createDoctypeHelperFactory($services); + $plugins->setFactory(ViewHelper\Doctype::class, $doctypeFactory); + $plugins->setFactory('zendviewhelperdoctype', $doctypeFactory); + + return $plugins; + } + + /** + * Create and return a factory for creating a URL helper. + * + * Retrieves the application and router from the servicemanager, + * and the route match from the MvcEvent composed by the application, + * using them to configure the helper. + * + * @param ContainerInterface $services + * @return callable + */ + private function createUrlHelperFactory(ContainerInterface $services) + { + return function () use ($services) { + $helper = new ViewHelper\Url; + $router = Console::isConsole() ? 'HttpRouter' : 'Router'; + $helper->setRouter($services->get($router)); + + $match = $services->get('Application') + ->getMvcEvent() + ->getRouteMatch() + ; + + if ($match instanceof RouteMatch) { + $helper->setRouteMatch($match); + } + + return $helper; + }; + } + + /** + * Create and return a factory for creating a BasePath helper. + * + * Uses configuration and request services to configure the helper. + * + * @param ContainerInterface $services + * @return callable + */ + private function createBasePathHelperFactory(ContainerInterface $services) + { + return function () use ($services) { + $config = $services->has('config') ? $services->get('config') : []; + $helper = new ViewHelper\BasePath; + + if (Console::isConsole() + && isset($config['view_manager']['base_path_console']) + ) { + $helper->setBasePath($config['view_manager']['base_path_console']); + return $helper; + } + + if (isset($config['view_manager']) && isset($config['view_manager']['base_path'])) { + $helper->setBasePath($config['view_manager']['base_path']); + return $helper; + } + + $request = $services->get('Request'); + + if (is_callable([$request, 'getBasePath'])) { + $helper->setBasePath($request->getBasePath()); + } + + return $helper; + }; + } + + /** + * Create and return a Doctype helper factory. + * + * Other view helpers depend on this to decide which spec to generate their tags + * based on. This is why it must be set early instead of later in the layout phtml. + * + * @param ContainerInterface $services + * @return callable + */ + private function createDoctypeHelperFactory(ContainerInterface $services) + { + return function () use ($services) { + $config = $services->has('config') ? $services->get('config') : []; + $config = isset($config['view_manager']) ? $config['view_manager'] : []; + $helper = new ViewHelper\Doctype; + if (isset($config['doctype']) && $config['doctype']) { + $helper->setDoctype($config['doctype']); + } + return $helper; + }; + } +} diff --git a/vendor/Zend/Mvc/Service/ViewJsonStrategyFactory.php b/vendor/Zend/Mvc/Service/ViewJsonStrategyFactory.php new file mode 100644 index 0000000..7758dc4 --- /dev/null +++ b/vendor/Zend/Mvc/Service/ViewJsonStrategyFactory.php @@ -0,0 +1,51 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Interop\Container\ContainerInterface; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; +use Zend\View\Strategy\JsonStrategy; + +class ViewJsonStrategyFactory implements FactoryInterface +{ + /** + * Create and return the JSON view strategy + * + * Retrieves the ViewJsonRenderer service from the service locator, and + * injects it into the constructor for the JSON strategy. + * + * It then attaches the strategy to the View service, at a priority of 100. + * + * @param ContainerInterface $container + * @param string $name + * @param null|array $options + * @return JsonStrategy + */ + public function __invoke(ContainerInterface $container, $name, array $options = null) + { + $jsonRenderer = $container->get('ViewJsonRenderer'); + $jsonStrategy = new JsonStrategy($jsonRenderer); + return $jsonStrategy; + } + + /** + * Create and return JsonStrategy instance + * + * For use with zend-servicemanager v2; proxies to __invoke(). + * + * @param ServiceLocatorInterface $container + * @return JsonStrategy + */ + public function createService(ServiceLocatorInterface $container) + { + return $this($container, JsonStrategy::class); + } +} diff --git a/vendor/Zend/Mvc/Service/ViewManagerFactory.php b/vendor/Zend/Mvc/Service/ViewManagerFactory.php new file mode 100644 index 0000000..0a5e909 --- /dev/null +++ b/vendor/Zend/Mvc/Service/ViewManagerFactory.php @@ -0,0 +1,51 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Interop\Container\ContainerInterface; +use Zend\Console\Console; +use Zend\Mvc\View\Console\ViewManager as ConsoleViewManager; +use Zend\Mvc\View\Http\ViewManager as HttpViewManager; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; + +class ViewManagerFactory implements FactoryInterface +{ + /** + * Create and return a view manager based on detected environment + * + * @param ContainerInterface $container + * @param string $name + * @param null|array $options + * @return ConsoleViewManager|HttpViewManager + */ + public function __invoke(ContainerInterface $container, $name, array $options = null) + { + if (Console::isConsole()) { + return $container->get('ConsoleViewManager'); + } + + return $container->get('HttpViewManager'); + } + + /** + * Create and return HttpViewManager or ConsoleViewManager instance + * + * For use with zend-servicemanager v2; proxies to __invoke(). + * + * @param ServiceLocatorInterface $container + * @return HttpViewManager|ConsoleViewManager + */ + public function createService(ServiceLocatorInterface $container) + { + $type = Console::isConsole() ? ConsoleViewManager::class : HttpViewManager::class; + return $this($container, $type); + } +} diff --git a/vendor/Zend/Mvc/Service/ViewPhpRendererFactory.php b/vendor/Zend/Mvc/Service/ViewPhpRendererFactory.php new file mode 100644 index 0000000..4c4734d --- /dev/null +++ b/vendor/Zend/Mvc/Service/ViewPhpRendererFactory.php @@ -0,0 +1,46 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Interop\Container\ContainerInterface; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; +use Zend\View\Renderer\PhpRenderer; + +class ViewPhpRendererFactory implements FactoryInterface +{ + /** + * @param ContainerInterface $container + * @param string $name + * @param null|array $options + * @return PhpRenderer + */ + public function __invoke(ContainerInterface $container, $name, array $options = null) + { + $renderer = new PhpRenderer(); + $renderer->setHelperPluginManager($container->get('ViewHelperManager')); + $renderer->setResolver($container->get('ViewResolver')); + + return $renderer; + } + + /** + * Create and return PhpRenderer instance + * + * For use with zend-servicemanager v2; proxies to __invoke(). + * + * @param ServiceLocatorInterface $container + * @return PhpRenderer + */ + public function createService(ServiceLocatorInterface $container) + { + return $this($container, PhpRenderer::class); + } +} diff --git a/vendor/Zend/Mvc/Service/ViewPhpRendererStrategyFactory.php b/vendor/Zend/Mvc/Service/ViewPhpRendererStrategyFactory.php new file mode 100644 index 0000000..ec0699e --- /dev/null +++ b/vendor/Zend/Mvc/Service/ViewPhpRendererStrategyFactory.php @@ -0,0 +1,43 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Interop\Container\ContainerInterface; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; +use Zend\View\Strategy\PhpRendererStrategy; +use Zend\View\Renderer\PhpRenderer; + +class ViewPhpRendererStrategyFactory implements FactoryInterface +{ + /** + * @param ContainerInterface $container + * @param string $name + * @param null|array $options + * @return PhpRendererStrategy + */ + public function __invoke(ContainerInterface $container, $name, array $options = null) + { + return new PhpRendererStrategy($container->get(PhpRenderer::class)); + } + + /** + * Create and return PhpRendererStrategy instance + * + * For use with zend-servicemanager v2; proxies to __invoke(). + * + * @param ServiceLocatorInterface $container + * @return PhpRendererStrategy + */ + public function createService(ServiceLocatorInterface $container) + { + return $this($container, PhpRendererStrategy::class); + } +} diff --git a/vendor/Zend/Mvc/Service/ViewPrefixPathStackResolverFactory.php b/vendor/Zend/Mvc/Service/ViewPrefixPathStackResolverFactory.php new file mode 100644 index 0000000..354406b --- /dev/null +++ b/vendor/Zend/Mvc/Service/ViewPrefixPathStackResolverFactory.php @@ -0,0 +1,54 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Interop\Container\ContainerInterface; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; +use Zend\View\Resolver\PrefixPathStackResolver; + +class ViewPrefixPathStackResolverFactory implements FactoryInterface +{ + /** + * Create the template prefix view resolver + * + * Creates a Zend\View\Resolver\PrefixPathStackResolver and populates it with the + * ['view_manager']['prefix_template_path_stack'] + * + * @param ContainerInterface $container + * @param string $name + * @param null|array $options + * @return PrefixPathStackResolver + */ + public function __invoke(ContainerInterface $container, $name, array $options = null) + { + $config = $container->get('config'); + $prefixes = []; + + if (isset($config['view_manager']['prefix_template_path_stack'])) { + $prefixes = $config['view_manager']['prefix_template_path_stack']; + } + + return new PrefixPathStackResolver($prefixes); + } + + /** + * Create and return PrefixPathStackResolver instance + * + * For use with zend-servicemanager v2; proxies to __invoke(). + * + * @param ServiceLocatorInterface $container + * @return PrefixPathStackResolver + */ + public function createService(ServiceLocatorInterface $container) + { + return $this($container, PrefixPathStackResolver::class); + } +} diff --git a/vendor/Zend/Mvc/Service/ViewResolverFactory.php b/vendor/Zend/Mvc/Service/ViewResolverFactory.php new file mode 100644 index 0000000..8efd286 --- /dev/null +++ b/vendor/Zend/Mvc/Service/ViewResolverFactory.php @@ -0,0 +1,64 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Interop\Container\ContainerInterface; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; +use Zend\View\Resolver as ViewResolver; + +class ViewResolverFactory implements FactoryInterface +{ + /** + * Create the aggregate view resolver + * + * Creates a Zend\View\Resolver\AggregateResolver and attaches the template + * map resolver and path stack resolver + * + * @param ContainerInterface $container + * @param string $name + * @param null|array $options + * @return ViewResolver\AggregateResolver + */ + public function __invoke(ContainerInterface $container, $name, array $options = null) + { + $resolver = new ViewResolver\AggregateResolver(); + + /* @var $mapResolver \Zend\View\Resolver\ResolverInterface */ + $mapResolver = $container->get('ViewTemplateMapResolver'); + /* @var $pathResolver \Zend\View\Resolver\ResolverInterface */ + $pathResolver = $container->get('ViewTemplatePathStack'); + /* @var $prefixPathStackResolver \Zend\View\Resolver\ResolverInterface */ + $prefixPathStackResolver = $container->get('ViewPrefixPathStackResolver'); + + $resolver + ->attach($mapResolver) + ->attach($pathResolver) + ->attach($prefixPathStackResolver) + ->attach(new ViewResolver\RelativeFallbackResolver($mapResolver)) + ->attach(new ViewResolver\RelativeFallbackResolver($pathResolver)) + ->attach(new ViewResolver\RelativeFallbackResolver($prefixPathStackResolver)); + + return $resolver; + } + + /** + * Create and return ViewResolver\AggregateResolver instance + * + * For use with zend-servicemanager v2; proxies to __invoke(). + * + * @param ServiceLocatorInterface $container + * @return ViewResolver\AggregateResolver + */ + public function createService(ServiceLocatorInterface $container) + { + return $this($container, ViewResolver\AggregateResolver::class); + } +} diff --git a/vendor/Zend/Mvc/Service/ViewTemplateMapResolverFactory.php b/vendor/Zend/Mvc/Service/ViewTemplateMapResolverFactory.php new file mode 100644 index 0000000..883be73 --- /dev/null +++ b/vendor/Zend/Mvc/Service/ViewTemplateMapResolverFactory.php @@ -0,0 +1,55 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Interop\Container\ContainerInterface; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; +use Zend\View\Resolver as ViewResolver; + +class ViewTemplateMapResolverFactory implements FactoryInterface +{ + /** + * Create the template map view resolver + * + * Creates a Zend\View\Resolver\AggregateResolver and populates it with the + * ['view_manager']['template_map'] + * + * @param ContainerInterface $container + * @param string $name + * @param null|array $options + * @return ViewResolver\TemplateMapResolver + */ + public function __invoke(ContainerInterface $container, $name, array $options = null) + { + $config = $container->get('config'); + $map = []; + if (is_array($config) && isset($config['view_manager'])) { + $config = $config['view_manager']; + if (is_array($config) && isset($config['template_map'])) { + $map = $config['template_map']; + } + } + return new ViewResolver\TemplateMapResolver($map); + } + + /** + * Create and return ViewResolver\TemplateMapResolver instance + * + * For use with zend-servicemanager v2; proxies to __invoke(). + * + * @param ServiceLocatorInterface $container + * @return ViewResolver\TemplateMapResolver + */ + public function createService(ServiceLocatorInterface $container) + { + return $this($container, ViewResolver\TemplateMapResolver::class); + } +} diff --git a/vendor/Zend/Mvc/Service/ViewTemplatePathStackFactory.php b/vendor/Zend/Mvc/Service/ViewTemplatePathStackFactory.php new file mode 100644 index 0000000..9e25184 --- /dev/null +++ b/vendor/Zend/Mvc/Service/ViewTemplatePathStackFactory.php @@ -0,0 +1,64 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\Service; + +use Interop\Container\ContainerInterface; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; +use Zend\View\Resolver as ViewResolver; + +class ViewTemplatePathStackFactory implements FactoryInterface +{ + /** + * Create the template path stack view resolver + * + * Creates a Zend\View\Resolver\TemplatePathStack and populates it with the + * ['view_manager']['template_path_stack'] and sets the default suffix with the + * ['view_manager']['default_template_suffix'] + * + * @param ContainerInterface $container + * @param string $name + * @param null|array $options + * @return ViewResolver\TemplatePathStack + */ + public function __invoke(ContainerInterface $container, $name, array $options = null) + { + $config = $container->get('config'); + + $templatePathStack = new ViewResolver\TemplatePathStack(); + + if (is_array($config) && isset($config['view_manager'])) { + $config = $config['view_manager']; + if (is_array($config)) { + if (isset($config['template_path_stack'])) { + $templatePathStack->addPaths($config['template_path_stack']); + } + if (isset($config['default_template_suffix'])) { + $templatePathStack->setDefaultSuffix($config['default_template_suffix']); + } + } + } + + return $templatePathStack; + } + + /** + * Create and return ViewResolver\TemplatePathStack instance + * + * For use with zend-servicemanager v2; proxies to __invoke(). + * + * @param ServiceLocatorInterface $container + * @return ViewResolver\TemplatePathStack + */ + public function createService(ServiceLocatorInterface $container) + { + return $this($container, ViewResolver\TemplatePathStack::class); + } +} diff --git a/vendor/Zend/Mvc/View/Console/CreateViewModelListener.php b/vendor/Zend/Mvc/View/Console/CreateViewModelListener.php new file mode 100644 index 0000000..2a8b922 --- /dev/null +++ b/vendor/Zend/Mvc/View/Console/CreateViewModelListener.php @@ -0,0 +1,84 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\View\Console; + +use Zend\EventManager\AbstractListenerAggregate; +use Zend\EventManager\EventManagerInterface as Events; +use Zend\Mvc\MvcEvent; +use Zend\Stdlib\ArrayUtils; +use Zend\View\Model\ConsoleModel; + +class CreateViewModelListener extends AbstractListenerAggregate +{ + /** + * {@inheritDoc} + */ + public function attach(Events $events, $priority = 1) + { + $this->listeners[] = $events->attach(MvcEvent::EVENT_DISPATCH, [$this, 'createViewModelFromString'], -80); + $this->listeners[] = $events->attach(MvcEvent::EVENT_DISPATCH, [$this, 'createViewModelFromArray'], -80); + $this->listeners[] = $events->attach(MvcEvent::EVENT_DISPATCH, [$this, 'createViewModelFromNull'], -80); + } + + /** + * Inspect the result, and cast it to a ViewModel if a string is detected + * + * @param MvcEvent $e + * @return void + */ + public function createViewModelFromString(MvcEvent $e) + { + $result = $e->getResult(); + if (!is_string($result)) { + return; + } + + // create Console model + $model = new ConsoleModel; + + // store the result in a model variable + $model->setVariable(ConsoleModel::RESULT, $result); + $e->setResult($model); + } + + /** + * Inspect the result, and cast it to a ViewModel if an assoc array is detected + * + * @param MvcEvent $e + * @return void + */ + public function createViewModelFromArray(MvcEvent $e) + { + $result = $e->getResult(); + if (!ArrayUtils::hasStringKeys($result, true)) { + return; + } + + $model = new ConsoleModel($result); + $e->setResult($model); + } + + /** + * Inspect the result, and cast it to a ViewModel if null is detected + * + * @param MvcEvent $e + * @return void + */ + public function createViewModelFromNull(MvcEvent $e) + { + $result = $e->getResult(); + if (null !== $result) { + return; + } + + $model = new ConsoleModel; + $e->setResult($model); + } +} diff --git a/vendor/Zend/Mvc/View/Console/DefaultRenderingStrategy.php b/vendor/Zend/Mvc/View/Console/DefaultRenderingStrategy.php new file mode 100644 index 0000000..d8b1a51 --- /dev/null +++ b/vendor/Zend/Mvc/View/Console/DefaultRenderingStrategy.php @@ -0,0 +1,93 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\View\Console; + +use Zend\Console\Response as ConsoleResponse; +use Zend\EventManager\AbstractListenerAggregate; +use Zend\EventManager\EventManagerInterface; +use Zend\Mvc\MvcEvent; +use Zend\Stdlib\ResponseInterface as Response; +use Zend\View\Model\ConsoleModel as ConsoleViewModel; +use Zend\View\Model\ModelInterface; + +class DefaultRenderingStrategy extends AbstractListenerAggregate +{ + /** + * {@inheritDoc} + */ + public function attach(EventManagerInterface $events, $priority = 1) + { + $this->listeners[] = $events->attach(MvcEvent::EVENT_RENDER, [$this, 'render'], -10000); + } + + /** + * Render the view + * + * @param MvcEvent $e + * @return Response + */ + public function render(MvcEvent $e) + { + $result = $e->getResult(); + if ($result instanceof Response) { + return $result; // the result is already rendered ... + } + + // marshal arguments + $response = $e->getResponse(); + + if (!$result instanceof ModelInterface) { + // There is absolutely no result, so there's nothing to display. + // We will return an empty response object + return $response; + } + + // Collect results from child models + $responseText = ''; + if ($result->hasChildren()) { + /* @var ModelInterface $child */ + foreach ($result->getChildren() as $child) { + // Do not use ::getResult() method here as we cannot be sure if + // children are also console models. + $responseText .= $child->getVariable(ConsoleViewModel::RESULT); + } + } + + // Fetch result from primary model + if ($result instanceof ConsoleViewModel) { + $responseText .= $result->getResult(); + } else { + $responseText .= $result->getVariable(ConsoleViewModel::RESULT); + } + + // Fetch service manager + $sm = $e->getApplication()->getServiceManager(); + + // Fetch console + $console = $sm->get('console'); + + // Append console response to response object + $content = $response->getContent() . $responseText; + if (is_callable([$console, 'encodeText'])) { + $content = $console->encodeText($content); + } + $response->setContent($content); + + // Pass on console-specific options + if ($response instanceof ConsoleResponse + && $result instanceof ConsoleViewModel + ) { + $errorLevel = $result->getErrorLevel(); + $response->setErrorLevel($errorLevel); + } + + return $response; + } +} diff --git a/vendor/Zend/Mvc/View/Console/ExceptionStrategy.php b/vendor/Zend/Mvc/View/Console/ExceptionStrategy.php new file mode 100644 index 0000000..9898e3b --- /dev/null +++ b/vendor/Zend/Mvc/View/Console/ExceptionStrategy.php @@ -0,0 +1,273 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\View\Console; + +use Zend\EventManager\AbstractListenerAggregate; +use Zend\EventManager\EventManagerInterface; +use Zend\Mvc\Application; +use Zend\Mvc\MvcEvent; +use Zend\Stdlib\ResponseInterface as Response; +use Zend\View\Model\ConsoleModel; + +class ExceptionStrategy extends AbstractListenerAggregate +{ + /** + * Display exceptions? + * @var bool + */ + protected $displayExceptions = true; + + /** + * A template for message to show in console when an exception has occurred. + * @var string|callable + */ + protected $message = <<<EOT +====================================================================== + The application has thrown an exception! +====================================================================== + :className + :message +---------------------------------------------------------------------- +:file::line +:stack +====================================================================== + Previous Exception(s): +:previous + +EOT; + + /** + * A template for message to show in console when an exception has previous exceptions. + * @var string + */ + protected $previousMessage = <<<EOT +====================================================================== + :className + :message +---------------------------------------------------------------------- +:file::line +:stack + +EOT; + + /** + * {@inheritDoc} + */ + public function attach(EventManagerInterface $events, $priority = 1) + { + $this->listeners[] = $events->attach(MvcEvent::EVENT_DISPATCH_ERROR, [$this, 'prepareExceptionViewModel']); + $this->listeners[] = $events->attach(MvcEvent::EVENT_RENDER_ERROR, [$this, 'prepareExceptionViewModel']); + } + + /** + * Flag: display exceptions in error pages? + * + * @param bool $displayExceptions + * @return ExceptionStrategy + */ + public function setDisplayExceptions($displayExceptions) + { + $this->displayExceptions = (bool) $displayExceptions; + return $this; + } + + /** + * Should we display exceptions in error pages? + * + * @return bool + */ + public function displayExceptions() + { + return $this->displayExceptions; + } + + /** + * Get current template for message that will be shown in Console. + * + * @return string + */ + public function getMessage() + { + return $this->message; + } + + /** + * Set template for message that will be shown in Console. + * The message can be a string (template) or a callable (i.e. a closure). + * + * The closure is expected to return a string and will be called with 2 parameters: + * Exception $exception - the exception being thrown + * boolean $displayExceptions - whether to display exceptions or not + * + * If the message is a string, one can use the following template params: + * + * :className - full class name of exception instance + * :message - exception message + * :code - exception code + * :file - the file where the exception has been thrown + * :line - the line where the exception has been thrown + * :stack - full exception stack + * + * @param string|callable $message + * @return ExceptionStrategy + */ + public function setMessage($message) + { + $this->message = $message; + return $this; + } + + /** + * Sets template for previous message that will be shown in Console. + * + * @param string $previousMessage + * @return ExceptionStrategy + */ + public function setPreviousMessage($previousMessage) + { + $this->previousMessage = $previousMessage; + return $this; + } + + /** + * @return callable|string + */ + public function getPreviousMessage() + { + return $this->previousMessage; + } + + /** + * Create an exception view model, and set the HTTP status code + * + * @todo dispatch.error does not halt dispatch unless a response is + * returned. As such, we likely need to trigger rendering as a low + * priority dispatch.error event (or goto a render event) to ensure + * rendering occurs, and that munging of view models occurs when + * expected. + * @param MvcEvent $e + * @return void + */ + public function prepareExceptionViewModel(MvcEvent $e) + { + // Do nothing if no error in the event + $error = $e->getError(); + if (empty($error)) { + return; + } + + // Do nothing if the result is a response object + $result = $e->getResult(); + if ($result instanceof Response) { + return; + } + + switch ($error) { + case Application::ERROR_CONTROLLER_NOT_FOUND: + case Application::ERROR_CONTROLLER_INVALID: + case Application::ERROR_ROUTER_NO_MATCH: + // Specifically not handling these because they are handled by routeNotFound strategy + return; + + case Application::ERROR_EXCEPTION: + default: + // Prepare error message + $exception = $e->getParam('exception'); + + if (is_callable($this->message)) { + $callback = $this->message; + $message = (string) $callback($exception, $this->displayExceptions); + } elseif ($this->displayExceptions + // @TODO clean up once PHP 7 requirement is enforced + && ($exception instanceof \Exception || $exception instanceof \Throwable) + ) { + $previous = ''; + $previousException = $exception->getPrevious(); + while ($previousException) { + $previous .= str_replace( + [ + ':className', + ':message', + ':code', + ':file', + ':line', + ':stack', + ], + [ + get_class($previousException), + $previousException->getMessage(), + $previousException->getCode(), + $previousException->getFile(), + $previousException->getLine(), + $exception->getTraceAsString(), + ], + $this->previousMessage + ); + $previousException = $previousException->getPrevious(); + } + + /* @var $exception \Exception */ + $message = str_replace( + [ + ':className', + ':message', + ':code', + ':file', + ':line', + ':stack', + ':previous', + ], + [ + get_class($exception), + $exception->getMessage(), + $exception->getCode(), + $exception->getFile(), + $exception->getLine(), + $exception->getTraceAsString(), + $previous + ], + $this->message + ); + } else { + $message = str_replace( + [ + ':className', + ':message', + ':code', + ':file', + ':line', + ':stack', + ':previous', + ], + [ + '', + '', + '', + '', + '', + '', + '', + ], + $this->message + ); + } + + // Prepare view model + $model = new ConsoleModel(); + $model->setResult($message); + $model->setErrorLevel(1); + + // Inject it into MvcEvent + $e->setResult($model); + + break; + } + } +} diff --git a/vendor/Zend/Mvc/View/Console/InjectNamedConsoleParamsListener.php b/vendor/Zend/Mvc/View/Console/InjectNamedConsoleParamsListener.php new file mode 100644 index 0000000..592dc43 --- /dev/null +++ b/vendor/Zend/Mvc/View/Console/InjectNamedConsoleParamsListener.php @@ -0,0 +1,51 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\View\Console; + +use Zend\Console\Request as ConsoleRequest; +use Zend\EventManager\AbstractListenerAggregate; +use Zend\EventManager\EventManagerInterface as Events; +use Zend\Mvc\MvcEvent; + +class InjectNamedConsoleParamsListener extends AbstractListenerAggregate +{ + /** + * {@inheritDoc} + */ + public function attach(Events $events, $priority = 1) + { + $this->listeners[] = $events->attach(MvcEvent::EVENT_DISPATCH, [$this, 'injectNamedParams'], -80); + } + + /** + * Inspect the result, and cast it to a ViewModel if a string is detected + * + * @param MvcEvent $e + * @return void + */ + public function injectNamedParams(MvcEvent $e) + { + if (!$routeMatch = $e->getRouteMatch()) { + return; // cannot work without route match + } + + $request = $e->getRequest(); + if (!$request instanceof ConsoleRequest) { + return; // will not inject non-console requests + } + + // Inject route match params into request + $params = array_merge( + $request->getParams()->toArray(), + $routeMatch->getParams() + ); + $request->getParams()->fromArray($params); + } +} diff --git a/vendor/Zend/Mvc/View/Console/InjectViewModelListener.php b/vendor/Zend/Mvc/View/Console/InjectViewModelListener.php new file mode 100644 index 0000000..30895cb --- /dev/null +++ b/vendor/Zend/Mvc/View/Console/InjectViewModelListener.php @@ -0,0 +1,16 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\View\Console; + +use Zend\Mvc\View\Http\InjectViewModelListener as HttpInjectViewModelListener; + +class InjectViewModelListener extends HttpInjectViewModelListener +{ +} diff --git a/vendor/Zend/Mvc/View/Console/RouteNotFoundStrategy.php b/vendor/Zend/Mvc/View/Console/RouteNotFoundStrategy.php new file mode 100644 index 0000000..952e713 --- /dev/null +++ b/vendor/Zend/Mvc/View/Console/RouteNotFoundStrategy.php @@ -0,0 +1,470 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\View\Console; + +use Zend\Console\Adapter\AdapterInterface as ConsoleAdapter; +use Zend\Console\ColorInterface; +use Zend\Console\Response as ConsoleResponse; +use Zend\Console\Request as ConsoleRequest; +use Zend\EventManager\AbstractListenerAggregate; +use Zend\EventManager\EventManagerInterface; +use Zend\ModuleManager\ModuleManagerInterface; +use Zend\ModuleManager\Feature\ConsoleBannerProviderInterface; +use Zend\ModuleManager\Feature\ConsoleUsageProviderInterface; +use Zend\Mvc\Application; +use Zend\Mvc\Exception\RuntimeException; +use Zend\Mvc\MvcEvent; +use Zend\ServiceManager\Exception\ServiceNotFoundException; +use Zend\Stdlib\ResponseInterface as Response; +use Zend\Stdlib\StringUtils; +use Zend\Text\Table; +use Zend\Version\Version; +use Zend\View\Model\ConsoleModel; + +class RouteNotFoundStrategy extends AbstractListenerAggregate +{ + /** + * Whether or not to display the reason for routing failure + * + * @var bool + */ + protected $displayNotFoundReason = true; + + /** + * The reason for a not-found condition + * + * @var bool|string + */ + protected $reason = false; + + /** + * {@inheritDoc} + */ + public function attach(EventManagerInterface $events, $priority = 1) + { + $this->listeners[] = $events->attach(MvcEvent::EVENT_DISPATCH_ERROR, [$this, 'handleRouteNotFoundError']); + } + + /** + * Set flag indicating whether or not to display the routing failure + * + * @param bool $displayNotFoundReason + * @return RouteNotFoundStrategy + */ + public function setDisplayNotFoundReason($displayNotFoundReason) + { + $this->displayNotFoundReason = (bool) $displayNotFoundReason; + return $this; + } + + /** + * Do we display the routing failure? + * + * @return bool + */ + public function displayNotFoundReason() + { + return $this->displayNotFoundReason; + } + + /** + * Detect if an error is a route not found condition + * + * If a "controller not found" or "invalid controller" error type is + * encountered, sets the response status code to 404. + * + * @param MvcEvent $e + * @throws RuntimeException + * @throws ServiceNotFoundException + * @return void + */ + public function handleRouteNotFoundError(MvcEvent $e) + { + $error = $e->getError(); + if (empty($error)) { + return; + } + + $response = $e->getResponse(); + $request = $e->getRequest(); + + switch ($error) { + case Application::ERROR_CONTROLLER_NOT_FOUND: + case Application::ERROR_CONTROLLER_INVALID: + case Application::ERROR_ROUTER_NO_MATCH: + $this->reason = $error; + if (!$response) { + $response = new ConsoleResponse(); + $e->setResponse($response); + } + $response->setMetadata('error', $error); + break; + default: + return; + } + + $result = $e->getResult(); + if ($result instanceof Response) { + // Already have a response as the result + return; + } + + // Prepare Console View Model + $model = new ConsoleModel(); + $model->setErrorLevel(1); + + // Fetch service manager + $sm = $e->getApplication()->getServiceManager(); + + // Try to fetch module manager + $mm = null; + try { + $mm = $sm->get('ModuleManager'); + } catch (ServiceNotFoundException $exception) { + // The application does not have or use module manager, so we cannot use it + } + + // Try to fetch current console adapter + try { + $console = $sm->get('console'); + if (!$console instanceof ConsoleAdapter) { + throw new ServiceNotFoundException(); + } + } catch (ServiceNotFoundException $exception) { + // The application does not have console adapter + throw new RuntimeException('Cannot access Console adapter - is it defined in ServiceManager?'); + } + + // Retrieve the script's name (entry point) + $scriptName = ''; + if ($request instanceof ConsoleRequest) { + $scriptName = basename($request->getScriptName()); + } + + // Get application banner + $banner = $this->getConsoleBanner($console, $mm); + + // Get application usage information + $usage = $this->getConsoleUsage($console, $scriptName, $mm); + + // Inject the text into view + $result = $banner ? rtrim($banner, "\r\n") : ''; + $result .= $usage ? "\n\n" . trim($usage, "\r\n") : ''; + $result .= "\n"; // to ensure we output a final newline + $result .= $this->reportNotFoundReason($e); + $model->setResult($result); + + // Inject the result into MvcEvent + $e->setResult($model); + } + + /** + * Build Console application banner text by querying currently loaded + * modules. + * + * @param ModuleManagerInterface $moduleManager + * @param ConsoleAdapter $console + * @return string + */ + protected function getConsoleBanner(ConsoleAdapter $console, ModuleManagerInterface $moduleManager = null) + { + /* + * Loop through all loaded modules and collect banners + */ + $banners = []; + if ($moduleManager !== null) { + foreach ($moduleManager->getLoadedModules(false) as $module) { + // Strict-type on ConsoleBannerProviderInterface, or duck-type + // on the method it defines + if (!$module instanceof ConsoleBannerProviderInterface + && !method_exists($module, 'getConsoleBanner') + ) { + continue; // this module does not provide a banner + } + + // Don't render empty completely empty lines + $banner = $module->getConsoleBanner($console); + if ($banner == '') { + continue; + } + + // We colorize each banners in blue for visual emphasis + $banners[] = $console->colorize($banner, ColorInterface::BLUE); + } + } + + /* + * Handle an application with no defined banners + */ + if (!count($banners)) { + return sprintf("Zend Framework %s application\nUsage:\n", Version::VERSION); + } + + /* + * Join the banners by a newline character + */ + return implode("\n", $banners); + } + + /** + * Build Console usage information by querying currently loaded modules. + * + * @param ConsoleAdapter $console + * @param string $scriptName + * @param ModuleManagerInterface $moduleManager + * @return string + * @throws RuntimeException + */ + protected function getConsoleUsage( + ConsoleAdapter $console, + $scriptName, + ModuleManagerInterface $moduleManager = null + ) { + /* + * Loop through all loaded modules and collect usage info + */ + $usageInfo = []; + + if ($moduleManager !== null) { + foreach ($moduleManager->getLoadedModules(false) as $name => $module) { + // Strict-type on ConsoleUsageProviderInterface, or duck-type + // on the method it defines + if (!$module instanceof ConsoleUsageProviderInterface + && !method_exists($module, 'getConsoleUsage') + ) { + continue; // this module does not provide usage info + } + + // We prepend the usage by the module name (printed in red), so that each module is + // clearly visible by the user + $moduleName = sprintf( + "%s\n%s\n%s\n", + str_repeat('-', $console->getWidth()), + $name, + str_repeat('-', $console->getWidth()) + ); + + $moduleName = $console->colorize($moduleName, ColorInterface::RED); + + $usage = $module->getConsoleUsage($console); + + // Normalize what we got from the module or discard + if (is_array($usage) && !empty($usage)) { + array_unshift($usage, $moduleName); + $usageInfo[$name] = $usage; + } elseif (is_string($usage) && ($usage != '')) { + $usageInfo[$name] = [$moduleName, $usage]; + } + } + } + + /* + * Handle an application with no usage information + */ + if (!count($usageInfo)) { + // TODO: implement fetching available console routes from router + return ''; + } + + /* + * Transform arrays in usage info into columns, otherwise join everything together + */ + $result = ''; + $table = false; + $tableCols = 0; + $tableType = 0; + foreach ($usageInfo as $moduleName => $usage) { + if (!is_string($usage) && !is_array($usage)) { + throw new RuntimeException(sprintf( + 'Cannot understand usage info for module "%s"', + $moduleName + )); + } + + if (is_string($usage)) { + // It's a plain string - output as is + $result .= $usage . "\n"; + continue; + } + + // It's an array, analyze it + foreach ($usage as $a => $b) { + /* + * 'invocation method' => 'explanation' + */ + if (is_string($a) && is_string($b)) { + if (($tableCols !== 2 || $tableType != 1) && $table !== false) { + // render last table + $result .= $this->renderTable($table, $tableCols, $console->getWidth()); + $table = false; + + // add extra newline for clarity + $result .= "\n"; + } + + // Colorize the command + $a = $console->colorize($scriptName . ' ' . $a, ColorInterface::GREEN); + + $tableCols = 2; + $tableType = 1; + $table[] = [$a, $b]; + continue; + } + + /* + * array('--param', '--explanation') + */ + if (is_array($b)) { + if ((count($b) != $tableCols || $tableType != 2) && $table !== false) { + // render last table + $result .= $this->renderTable($table, $tableCols, $console->getWidth()); + $table = false; + + // add extra newline for clarity + $result .= "\n"; + } + + $tableCols = count($b); + $tableType = 2; + $table[] = $b; + continue; + } + + /* + * 'A single line of text' + */ + if ($table !== false) { + // render last table + $result .= $this->renderTable($table, $tableCols, $console->getWidth()); + $table = false; + + // add extra newline for clarity + $result .= "\n"; + } + + $tableType = 0; + $result .= $b . "\n"; + } + } + + // Finish last table + if ($table !== false) { + $result .= $this->renderTable($table, $tableCols, $console->getWidth()); + } + + return $result; + } + + /** + * Render a text table containing the data provided, that will fit inside console window's width. + * + * @param $data + * @param $cols + * @param $consoleWidth + * @return string + */ + protected function renderTable($data, $cols, $consoleWidth) + { + $result = ''; + $padding = 2; + + + // If there is only 1 column, just concatenate it + if ($cols == 1) { + foreach ($data as $row) { + if (! isset($row[0])) { + continue; + } + $result .= $row[0] . "\n"; + } + return $result; + } + + // Get the string wrapper supporting UTF-8 character encoding + $strWrapper = StringUtils::getWrapper('UTF-8'); + + // Determine max width for each column + $maxW = []; + for ($x = 1; $x <= $cols; $x += 1) { + $maxW[$x] = 0; + foreach ($data as $row) { + $maxW[$x] = max($maxW[$x], $strWrapper->strlen($row[$x-1]) + $padding * 2); + } + } + + /* + * Check if the sum of x-1 columns fit inside console window width - 10 + * chars. If columns do not fit inside console window, then we'll just + * concatenate them and output as is. + */ + $width = 0; + for ($x = 1; $x < $cols; $x += 1) { + $width += $maxW[$x]; + } + + if ($width >= $consoleWidth - 10) { + foreach ($data as $row) { + $result .= implode(" ", $row) . "\n"; + } + return $result; + } + + /* + * Use Zend\Text\Table to render the table. + * The last column will use the remaining space in console window + * (minus 1 character to prevent double wrapping at the edge of the + * screen). + */ + $maxW[$cols] = $consoleWidth - $width -1; + $table = new Table\Table(); + $table->setColumnWidths($maxW); + $table->setDecorator(new Table\Decorator\Blank()); + $table->setPadding(2); + + foreach ($data as $row) { + $table->appendRow($row); + } + + return $table->render(); + } + + /** + * Report the 404 reason and/or exceptions + * + * @param \Zend\EventManager\EventInterface $e + * @return string + */ + protected function reportNotFoundReason($e) + { + if (!$this->displayNotFoundReason()) { + return ''; + } + $exception = $e->getParam('exception', false); + if (!$exception && !$this->reason) { + return ''; + } + + $reason = (!empty($this->reason)) ? $this->reason : 'unknown'; + $reasons = [ + Application::ERROR_CONTROLLER_NOT_FOUND => 'Could not match to a controller', + Application::ERROR_CONTROLLER_INVALID => 'Invalid controller specified', + Application::ERROR_ROUTER_NO_MATCH => 'Invalid arguments or no arguments provided', + 'unknown' => 'Unknown', + ]; + $report = sprintf("\nReason for failure: %s\n", $reasons[$reason]); + + // @TODO clean up once PHP 7 requirement is enforced + while ($exception instanceof \Exception || $exception instanceof \Throwable) { + $report .= sprintf("Exception: %s\nTrace:\n%s\n", $exception->getMessage(), $exception->getTraceAsString()); + $exception = $exception->getPrevious(); + } + return $report; + } +} diff --git a/vendor/Zend/Mvc/View/Console/ViewManager.php b/vendor/Zend/Mvc/View/Console/ViewManager.php new file mode 100644 index 0000000..bf409ec --- /dev/null +++ b/vendor/Zend/Mvc/View/Console/ViewManager.php @@ -0,0 +1,86 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\View\Console; + +use ArrayAccess; +use Zend\Mvc\MvcEvent; +use Zend\Mvc\View\Http\ViewManager as BaseViewManager; + +/** + * Prepares the view layer for console applications + */ +class ViewManager extends BaseViewManager +{ + /** + * Prepares the view layer + * + * Overriding, as several operations are omitted in the console view + * algorithms, as well as to ensure we pick up the Console variants + * of several listeners and strategies. + * + * @param \Zend\Mvc\MvcEvent $event + * @return void + */ + public function onBootstrap($event) + { + $application = $event->getApplication(); + $services = $application->getServiceManager(); + $events = $application->getEventManager(); + $sharedEvents = $events->getSharedManager(); + $this->config = $this->loadConfig($services->get('config')); + $this->services = $services; + $this->event = $event; + + $routeNotFoundStrategy = $services->get('ConsoleRouteNotFoundStrategy'); + $exceptionStrategy = $services->get('ConsoleExceptionStrategy'); + $mvcRenderingStrategy = $services->get('ConsoleDefaultRenderingStrategy'); + $createViewModelListener = new CreateViewModelListener(); + $injectViewModelListener = new InjectViewModelListener(); + $injectParamsListener = new InjectNamedConsoleParamsListener(); + + $this->registerMvcRenderingStrategies($events); + $this->registerViewStrategies(); + + $routeNotFoundStrategy->attach($events); + $exceptionStrategy->attach($events); + $events->attach(MvcEvent::EVENT_DISPATCH_ERROR, [$injectViewModelListener, 'injectViewModel'], -100); + $events->attach(MvcEvent::EVENT_RENDER_ERROR, [$injectViewModelListener, 'injectViewModel'], -100); + $mvcRenderingStrategy->attach($events); + + $sharedEvents->attach('Zend\Stdlib\DispatchableInterface', MvcEvent::EVENT_DISPATCH, [$injectParamsListener, 'injectNamedParams'], 1000); + $sharedEvents->attach('Zend\Stdlib\DispatchableInterface', MvcEvent::EVENT_DISPATCH, [$createViewModelListener, 'createViewModelFromArray'], -80); + $sharedEvents->attach('Zend\Stdlib\DispatchableInterface', MvcEvent::EVENT_DISPATCH, [$createViewModelListener, 'createViewModelFromString'], -80); + $sharedEvents->attach('Zend\Stdlib\DispatchableInterface', MvcEvent::EVENT_DISPATCH, [$createViewModelListener, 'createViewModelFromNull'], -80); + $sharedEvents->attach('Zend\Stdlib\DispatchableInterface', MvcEvent::EVENT_DISPATCH, [$injectViewModelListener, 'injectViewModel'], -100); + } + + /** + * Extract view manager configuration from the application's configuration + * + * @param array|ArrayAccess $configService + * + * @return array + */ + private function loadConfig($configService) + { + $config = []; + + // override when console config is provided, otherwise use the standard definition + if (isset($configService['console']['view_manager'])) { + $config = $configService['console']['view_manager']; + } elseif (isset($configService['view_manager'])) { + $config = $configService['view_manager']; + } + + return ($config instanceof ArrayAccess || is_array($config)) + ? $config + : []; + } +} diff --git a/vendor/Zend/Mvc/View/Http/CreateViewModelListener.php b/vendor/Zend/Mvc/View/Http/CreateViewModelListener.php new file mode 100644 index 0000000..6f5057c --- /dev/null +++ b/vendor/Zend/Mvc/View/Http/CreateViewModelListener.php @@ -0,0 +1,62 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\View\Http; + +use Zend\EventManager\AbstractListenerAggregate; +use Zend\EventManager\EventManagerInterface as Events; +use Zend\Mvc\MvcEvent; +use Zend\Stdlib\ArrayUtils; +use Zend\View\Model\ViewModel; + +class CreateViewModelListener extends AbstractListenerAggregate +{ + /** + * {@inheritDoc} + */ + public function attach(Events $events, $priority = 1) + { + $this->listeners[] = $events->attach(MvcEvent::EVENT_DISPATCH, [$this, 'createViewModelFromArray'], -80); + $this->listeners[] = $events->attach(MvcEvent::EVENT_DISPATCH, [$this, 'createViewModelFromNull'], -80); + } + + /** + * Inspect the result, and cast it to a ViewModel if an assoc array is detected + * + * @param MvcEvent $e + * @return void + */ + public function createViewModelFromArray(MvcEvent $e) + { + $result = $e->getResult(); + if (!ArrayUtils::hasStringKeys($result, true)) { + return; + } + + $model = new ViewModel($result); + $e->setResult($model); + } + + /** + * Inspect the result, and cast it to a ViewModel if null is detected + * + * @param MvcEvent $e + * @return void + */ + public function createViewModelFromNull(MvcEvent $e) + { + $result = $e->getResult(); + if (null !== $result) { + return; + } + + $model = new ViewModel; + $e->setResult($model); + } +} diff --git a/vendor/Zend/Mvc/View/Http/DefaultRenderingStrategy.php b/vendor/Zend/Mvc/View/Http/DefaultRenderingStrategy.php new file mode 100644 index 0000000..714f2d3 --- /dev/null +++ b/vendor/Zend/Mvc/View/Http/DefaultRenderingStrategy.php @@ -0,0 +1,128 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\View\Http; + +use Zend\EventManager\AbstractListenerAggregate; +use Zend\EventManager\EventManagerInterface; +use Zend\Mvc\Application; +use Zend\Mvc\MvcEvent; +use Zend\Stdlib\ResponseInterface as Response; +use Zend\View\Model\ModelInterface as ViewModel; +use Zend\View\View; + +class DefaultRenderingStrategy extends AbstractListenerAggregate +{ + /** + * Layout template - template used in root ViewModel of MVC event. + * + * @var string + */ + protected $layoutTemplate = 'layout'; + + /** + * @var View + */ + protected $view; + + /** + * Set view + * + * @param View $view + * @return DefaultRenderingStrategy + */ + public function __construct(View $view) + { + $this->view = $view; + } + + /** + * {@inheritDoc} + */ + public function attach(EventManagerInterface $events, $priority = 1) + { + $this->listeners[] = $events->attach(MvcEvent::EVENT_RENDER, [$this, 'render'], -10000); + $this->listeners[] = $events->attach(MvcEvent::EVENT_RENDER_ERROR, [$this, 'render'], -10000); + } + + /** + * Set layout template value + * + * @param string $layoutTemplate + * @return DefaultRenderingStrategy + */ + public function setLayoutTemplate($layoutTemplate) + { + $this->layoutTemplate = (string) $layoutTemplate; + return $this; + } + + /** + * Get layout template value + * + * @return string + */ + public function getLayoutTemplate() + { + return $this->layoutTemplate; + } + + /** + * Render the view + * + * @param MvcEvent $e + * @return Response|null + * @throws \Exception + */ + public function render(MvcEvent $e) + { + $result = $e->getResult(); + if ($result instanceof Response) { + return $result; + } + + // Martial arguments + $request = $e->getRequest(); + $response = $e->getResponse(); + $viewModel = $e->getViewModel(); + if (!$viewModel instanceof ViewModel) { + return; + } + + $view = $this->view; + $view->setRequest($request); + $view->setResponse($response); + + $caughtException = null; + + try { + $view->render($viewModel); + } catch (\Throwable $ex) { + $caughtException = $ex; + } catch (\Exception $ex) { // @TODO clean up once PHP 7 requirement is enforced + $caughtException = $ex; + } + + if ($caughtException !== null) { + if ($e->getName() === MvcEvent::EVENT_RENDER_ERROR) { + throw $caughtException; + } + + $application = $e->getApplication(); + $events = $application->getEventManager(); + + $e->setError(Application::ERROR_EXCEPTION); + $e->setParam('exception', $caughtException); + $e->setName(MvcEvent::EVENT_RENDER_ERROR); + $events->triggerEvent($e); + } + + return $response; + } +} diff --git a/vendor/Zend/Mvc/View/Http/ExceptionStrategy.php b/vendor/Zend/Mvc/View/Http/ExceptionStrategy.php new file mode 100644 index 0000000..a22e5b4 --- /dev/null +++ b/vendor/Zend/Mvc/View/Http/ExceptionStrategy.php @@ -0,0 +1,144 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\View\Http; + +use Zend\EventManager\AbstractListenerAggregate; +use Zend\EventManager\EventManagerInterface; +use Zend\Http\Response as HttpResponse; +use Zend\Mvc\Application; +use Zend\Mvc\MvcEvent; +use Zend\Stdlib\ResponseInterface as Response; +use Zend\View\Model\ViewModel; + +class ExceptionStrategy extends AbstractListenerAggregate +{ + /** + * Display exceptions? + * @var bool + */ + protected $displayExceptions = false; + + /** + * Name of exception template + * @var string + */ + protected $exceptionTemplate = 'error'; + + /** + * {@inheritDoc} + */ + public function attach(EventManagerInterface $events, $priority = 1) + { + $this->listeners[] = $events->attach(MvcEvent::EVENT_DISPATCH_ERROR, [$this, 'prepareExceptionViewModel']); + $this->listeners[] = $events->attach(MvcEvent::EVENT_RENDER_ERROR, [$this, 'prepareExceptionViewModel']); + } + + /** + * Flag: display exceptions in error pages? + * + * @param bool $displayExceptions + * @return ExceptionStrategy + */ + public function setDisplayExceptions($displayExceptions) + { + $this->displayExceptions = (bool) $displayExceptions; + return $this; + } + + /** + * Should we display exceptions in error pages? + * + * @return bool + */ + public function displayExceptions() + { + return $this->displayExceptions; + } + + /** + * Set the exception template + * + * @param string $exceptionTemplate + * @return ExceptionStrategy + */ + public function setExceptionTemplate($exceptionTemplate) + { + $this->exceptionTemplate = (string) $exceptionTemplate; + return $this; + } + + /** + * Retrieve the exception template + * + * @return string + */ + public function getExceptionTemplate() + { + return $this->exceptionTemplate; + } + + /** + * Create an exception view model, and set the HTTP status code + * + * @todo dispatch.error does not halt dispatch unless a response is + * returned. As such, we likely need to trigger rendering as a low + * priority dispatch.error event (or goto a render event) to ensure + * rendering occurs, and that munging of view models occurs when + * expected. + * @param MvcEvent $e + * @return void + */ + public function prepareExceptionViewModel(MvcEvent $e) + { + // Do nothing if no error in the event + $error = $e->getError(); + if (empty($error)) { + return; + } + + // Do nothing if the result is a response object + $result = $e->getResult(); + if ($result instanceof Response) { + return; + } + + switch ($error) { + case Application::ERROR_CONTROLLER_NOT_FOUND: + case Application::ERROR_CONTROLLER_INVALID: + case Application::ERROR_ROUTER_NO_MATCH: + // Specifically not handling these + return; + + case Application::ERROR_EXCEPTION: + default: + $model = new ViewModel([ + 'message' => 'An error occurred during execution; please try again later.', + 'exception' => $e->getParam('exception'), + 'display_exceptions' => $this->displayExceptions(), + ]); + $model->setTemplate($this->getExceptionTemplate()); + $e->setResult($model); + + $response = $e->getResponse(); + if (!$response) { + $response = new HttpResponse(); + $response->setStatusCode(500); + $e->setResponse($response); + } else { + $statusCode = $response->getStatusCode(); + if ($statusCode === 200) { + $response->setStatusCode(500); + } + } + + break; + } + } +} diff --git a/vendor/Zend/Mvc/View/Http/InjectRoutematchParamsListener.php b/vendor/Zend/Mvc/View/Http/InjectRoutematchParamsListener.php new file mode 100644 index 0000000..de1f807 --- /dev/null +++ b/vendor/Zend/Mvc/View/Http/InjectRoutematchParamsListener.php @@ -0,0 +1,86 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\View\Http; + +use Zend\Console\Request as ConsoleRequest; +use Zend\EventManager\AbstractListenerAggregate; +use Zend\EventManager\EventManagerInterface; +use Zend\Http\Request as HttpRequest; +use Zend\Mvc\MvcEvent; + +class InjectRoutematchParamsListener extends AbstractListenerAggregate +{ + /** + * Should request params overwrite existing request params? + * + * @var bool + */ + protected $overwrite = true; + + /** + * {@inheritDoc} + */ + public function attach(EventManagerInterface $events, $priority = 1) + { + $this->listeners[] = $events->attach(MvcEvent::EVENT_DISPATCH, [$this, 'injectParams'], 90); + } + + /** + * Take parameters from RouteMatch and inject them into the request. + * + * @param MvcEvent $e + * @return void + */ + public function injectParams(MvcEvent $e) + { + $routeMatchParams = $e->getRouteMatch()->getParams(); + $request = $e->getRequest(); + + /** @var $params \Zend\Stdlib\Parameters */ + if ($request instanceof ConsoleRequest) { + $params = $request->params(); + } elseif ($request instanceof HttpRequest) { + $params = $request->get(); + } else { + // unsupported request type + return; + } + + if ($this->overwrite) { + foreach ($routeMatchParams as $key => $val) { + $params->$key = $val; + } + } else { + foreach ($routeMatchParams as $key => $val) { + if (!$params->offsetExists($key)) { + $params->$key = $val; + } + } + } + } + + /** + * Should RouteMatch parameters replace existing Request params? + * + * @param bool $overwrite + */ + public function setOverwrite($overwrite) + { + $this->overwrite = $overwrite; + } + + /** + * @return bool + */ + public function getOverwrite() + { + return $this->overwrite; + } +} diff --git a/vendor/Zend/Mvc/View/Http/InjectTemplateListener.php b/vendor/Zend/Mvc/View/Http/InjectTemplateListener.php new file mode 100644 index 0000000..193c249 --- /dev/null +++ b/vendor/Zend/Mvc/View/Http/InjectTemplateListener.php @@ -0,0 +1,261 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\View\Http; + +use Zend\EventManager\AbstractListenerAggregate; +use Zend\EventManager\EventManagerInterface as Events; +use Zend\Filter\Word\CamelCaseToDash as CamelCaseToDashFilter; +use Zend\Mvc\MvcEvent; +use Zend\Mvc\ModuleRouteListener; +use Zend\View\Model\ModelInterface as ViewModel; + +class InjectTemplateListener extends AbstractListenerAggregate +{ + /** + * FilterInterface/inflector used to normalize names for use as template identifiers + * + * @var mixed + */ + protected $inflector; + + /** + * Array of controller namespace -> template mappings + * + * @var array + */ + protected $controllerMap = []; + + /** + * Flag to force the use of the route match controller param + * + * @var boolean + */ + protected $preferRouteMatchController = false; + + /** + * {@inheritDoc} + */ + public function attach(Events $events, $priority = 1) + { + $this->listeners[] = $events->attach(MvcEvent::EVENT_DISPATCH, [$this, 'injectTemplate'], -90); + } + + /** + * Inject a template into the view model, if none present + * + * Template is derived from the controller found in the route match, and, + * optionally, the action, if present. + * + * @param MvcEvent $e + * @return void + */ + public function injectTemplate(MvcEvent $e) + { + $model = $e->getResult(); + if (!$model instanceof ViewModel) { + return; + } + + $template = $model->getTemplate(); + if (!empty($template)) { + return; + } + + $routeMatch = $e->getRouteMatch(); + $controller = $e->getTarget(); + if (is_object($controller)) { + $controller = get_class($controller); + } + + $routeMatchController = $routeMatch->getParam('controller', ''); + if (!$controller || ($this->preferRouteMatchController && $routeMatchController)) { + $controller = $routeMatchController; + } + + $template = $this->mapController($controller); + if (!$template) { + $module = $this->deriveModuleNamespace($controller); + + if ($namespace = $routeMatch->getParam(ModuleRouteListener::MODULE_NAMESPACE)) { + $controllerSubNs = $this->deriveControllerSubNamespace($namespace); + if (!empty($controllerSubNs)) { + if (!empty($module)) { + $module .= '/' . $controllerSubNs; + } else { + $module = $controllerSubNs; + } + } + } + + $controller = $this->deriveControllerClass($controller); + $template = $this->inflectName($module); + + if (!empty($template)) { + $template .= '/'; + } + $template .= $this->inflectName($controller); + } + + $action = $routeMatch->getParam('action'); + if (null !== $action) { + $template .= '/' . $this->inflectName($action); + } + $model->setTemplate($template); + } + + /** + * Set map of controller namespace -> template pairs + * + * @param array $map + * @return self + */ + public function setControllerMap(array $map) + { + krsort($map); + $this->controllerMap = $map; + return $this; + } + + /** + * Maps controller to template if controller namespace is whitelisted or mapped + * + * @param string $controller controller FQCN + * @return string|false template name or false if controller was not matched + */ + public function mapController($controller) + { + if (! is_string($controller)) { + return false; + } + + foreach ($this->controllerMap as $namespace => $replacement) { + if (// Allow disabling rule by setting value to false since config + // merging have no feature to remove entries + false == $replacement + // Match full class or full namespace + || !($controller === $namespace || strpos($controller, $namespace . '\\') === 0) + ) { + continue; + } + + $map = ''; + // Map namespace to $replacement if its value is string + if (is_string($replacement)) { + $map = rtrim($replacement, '/') . '/'; + $controller = substr($controller, strlen($namespace) + 1) ?: ''; + } + + //strip Controller namespace(s) (but not classname) + $parts = explode('\\', $controller); + array_pop($parts); + $parts = array_diff($parts, ['Controller']); + //strip trailing Controller in class name + $parts[] = $this->deriveControllerClass($controller); + $controller = implode('/', $parts); + + $template = trim($map . $controller, '/'); + + //inflect CamelCase to dash + return $this->inflectName($template); + } + return false; + } + + /** + * Inflect a name to a normalized value + * + * @param string $name + * @return string + */ + protected function inflectName($name) + { + if (!$this->inflector) { + $this->inflector = new CamelCaseToDashFilter(); + } + $name = $this->inflector->filter($name); + return strtolower($name); + } + + /** + * Determine the top-level namespace of the controller + * + * @param string $controller + * @return string + */ + protected function deriveModuleNamespace($controller) + { + if (!strstr($controller, '\\')) { + return ''; + } + $module = substr($controller, 0, strpos($controller, '\\')); + return $module; + } + + /** + * @param $namespace + * @return string + */ + protected function deriveControllerSubNamespace($namespace) + { + if (!strstr($namespace, '\\')) { + return ''; + } + $nsArray = explode('\\', $namespace); + + // Remove the first two elements representing the module and controller directory. + $subNsArray = array_slice($nsArray, 2); + if (empty($subNsArray)) { + return ''; + } + return implode('/', $subNsArray); + } + + /** + * Determine the name of the controller + * + * Strip the namespace, and the suffix "Controller" if present. + * + * @param string $controller + * @return string + */ + protected function deriveControllerClass($controller) + { + if (strstr($controller, '\\')) { + $controller = substr($controller, strrpos($controller, '\\') + 1); + } + + if ((10 < strlen($controller)) + && ('Controller' == substr($controller, -10)) + ) { + $controller = substr($controller, 0, -10); + } + + return $controller; + } + + /** + * Sets the flag to instruct the listener to prefer the route match controller param + * over the class name + * + * @param boolean $preferRouteMatchController + */ + public function setPreferRouteMatchController($preferRouteMatchController) + { + $this->preferRouteMatchController = (bool) $preferRouteMatchController; + } + + /** + * @return boolean + */ + public function isPreferRouteMatchController() + { + return $this->preferRouteMatchController; + } +} diff --git a/vendor/Zend/Mvc/View/Http/InjectViewModelListener.php b/vendor/Zend/Mvc/View/Http/InjectViewModelListener.php new file mode 100644 index 0000000..e591f3d --- /dev/null +++ b/vendor/Zend/Mvc/View/Http/InjectViewModelListener.php @@ -0,0 +1,60 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\View\Http; + +use Zend\EventManager\AbstractListenerAggregate; +use Zend\EventManager\EventManagerInterface as Events; +use Zend\Mvc\MvcEvent; +use Zend\View\Model\ClearableModelInterface; +use Zend\View\Model\ModelInterface as ViewModel; + +class InjectViewModelListener extends AbstractListenerAggregate +{ + /** + * {@inheritDoc} + */ + public function attach(Events $events, $priority = 1) + { + $this->listeners[] = $events->attach(MvcEvent::EVENT_DISPATCH, [$this, 'injectViewModel'], -100); + $this->listeners[] = $events->attach(MvcEvent::EVENT_DISPATCH_ERROR, [$this, 'injectViewModel'], -100); + $this->listeners[] = $events->attach(MvcEvent::EVENT_RENDER_ERROR, [$this, 'injectViewModel'], -100); + } + + /** + * Insert the view model into the event + * + * Inspects the MVC result; if it's a view model, it then either (a) adds + * it as a child to the default, composed view model, or (b) replaces it + * if the result is marked as terminable. + * + * @param MvcEvent $e + * @return void + */ + public function injectViewModel(MvcEvent $e) + { + $result = $e->getResult(); + if (!$result instanceof ViewModel) { + return; + } + + $model = $e->getViewModel(); + + if ($result->terminate()) { + $e->setViewModel($result); + return; + } + + if ($e->getError() && $model instanceof ClearableModelInterface) { + $model->clearChildren(); + } + + $model->addChild($result); + } +} diff --git a/vendor/Zend/Mvc/View/Http/RouteNotFoundStrategy.php b/vendor/Zend/Mvc/View/Http/RouteNotFoundStrategy.php new file mode 100644 index 0000000..7346faa --- /dev/null +++ b/vendor/Zend/Mvc/View/Http/RouteNotFoundStrategy.php @@ -0,0 +1,298 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\View\Http; + +use Zend\EventManager\AbstractListenerAggregate; +use Zend\EventManager\EventManagerInterface; +use Zend\Http\Response as HttpResponse; +use Zend\Mvc\Application; +use Zend\Mvc\MvcEvent; +use Zend\Stdlib\ResponseInterface as Response; +use Zend\View\Model\ViewModel; + +class RouteNotFoundStrategy extends AbstractListenerAggregate +{ + /** + * Whether or not to display exceptions related to the 404 condition + * + * @var bool + */ + protected $displayExceptions = false; + + /** + * Whether or not to display the reason for a 404 + * + * @var bool + */ + protected $displayNotFoundReason = false; + + /** + * Template to use to report page not found conditions + * + * @var string + */ + protected $notFoundTemplate = 'error'; + + /** + * The reason for a not-found condition + * + * @var false|string + */ + protected $reason = false; + + /** + * {@inheritDoc} + */ + public function attach(EventManagerInterface $events, $priority = 1) + { + $this->listeners[] = $events->attach(MvcEvent::EVENT_DISPATCH, [$this, 'prepareNotFoundViewModel'], -90); + $this->listeners[] = $events->attach(MvcEvent::EVENT_DISPATCH_ERROR, [$this, 'detectNotFoundError']); + $this->listeners[] = $events->attach(MvcEvent::EVENT_DISPATCH_ERROR, [$this, 'prepareNotFoundViewModel']); + } + + /** + * Set value indicating whether or not to display exceptions related to a not-found condition + * + * @param bool $displayExceptions + * @return RouteNotFoundStrategy + */ + public function setDisplayExceptions($displayExceptions) + { + $this->displayExceptions = (bool) $displayExceptions; + return $this; + } + + /** + * Should we display exceptions related to a not-found condition? + * + * @return bool + */ + public function displayExceptions() + { + return $this->displayExceptions; + } + + /** + * Set value indicating whether or not to display the reason for a not-found condition + * + * @param bool $displayNotFoundReason + * @return RouteNotFoundStrategy + */ + public function setDisplayNotFoundReason($displayNotFoundReason) + { + $this->displayNotFoundReason = (bool) $displayNotFoundReason; + return $this; + } + + /** + * Should we display the reason for a not-found condition? + * + * @return bool + */ + public function displayNotFoundReason() + { + return $this->displayNotFoundReason; + } + + /** + * Get template for not found conditions + * + * @param string $notFoundTemplate + * @return RouteNotFoundStrategy + */ + public function setNotFoundTemplate($notFoundTemplate) + { + $this->notFoundTemplate = (string) $notFoundTemplate; + return $this; + } + + /** + * Get template for not found conditions + * + * @return string + */ + public function getNotFoundTemplate() + { + return $this->notFoundTemplate; + } + + /** + * Detect if an error is a 404 condition + * + * If a "controller not found" or "invalid controller" error type is + * encountered, sets the response status code to 404. + * + * @param MvcEvent $e + * @return void + */ + public function detectNotFoundError(MvcEvent $e) + { + $error = $e->getError(); + if (empty($error)) { + return; + } + + switch ($error) { + case Application::ERROR_CONTROLLER_NOT_FOUND: + case Application::ERROR_CONTROLLER_INVALID: + case Application::ERROR_ROUTER_NO_MATCH: + $this->reason = $error; + $response = $e->getResponse(); + if (!$response) { + $response = new HttpResponse(); + $e->setResponse($response); + } + $response->setStatusCode(404); + break; + default: + return; + } + } + + /** + * Create and return a 404 view model + * + * @param MvcEvent $e + * @return void + */ + public function prepareNotFoundViewModel(MvcEvent $e) + { + $vars = $e->getResult(); + if ($vars instanceof Response) { + // Already have a response as the result + return; + } + + $response = $e->getResponse(); + if ($response->getStatusCode() != 404) { + // Only handle 404 responses + return; + } + + if (!$vars instanceof ViewModel) { + $model = new ViewModel(); + if (is_string($vars)) { + $model->setVariable('message', $vars); + } else { + $model->setVariable('message', 'Page not found.'); + } + } else { + $model = $vars; + if ($model->getVariable('message') === null) { + $model->setVariable('message', 'Page not found.'); + } + } + + $model->setTemplate($this->getNotFoundTemplate()); + + // If displaying reasons, inject the reason + $this->injectNotFoundReason($model); + + // If displaying exceptions, inject + $this->injectException($model, $e); + + // Inject controller if we're displaying either the reason or the exception + $this->injectController($model, $e); + + $e->setResult($model); + } + + /** + * Inject the not-found reason into the model + * + * If $displayNotFoundReason is enabled, checks to see if $reason is set, + * and, if so, injects it into the model. If not, it injects + * Application::ERROR_CONTROLLER_CANNOT_DISPATCH. + * + * @param ViewModel $model + * @return void + */ + protected function injectNotFoundReason(ViewModel $model) + { + if (!$this->displayNotFoundReason()) { + return; + } + + // no route match, controller not found, or controller invalid + if ($this->reason) { + $model->setVariable('reason', $this->reason); + return; + } + + // otherwise, must be a case of the controller not being able to + // dispatch itself. + $model->setVariable('reason', Application::ERROR_CONTROLLER_CANNOT_DISPATCH); + } + + /** + * Inject the exception message into the model + * + * If $displayExceptions is enabled, and an exception is found in the + * event, inject it into the model. + * + * @param ViewModel $model + * @param MvcEvent $e + * @return void + */ + protected function injectException($model, $e) + { + if (!$this->displayExceptions()) { + return; + } + + $model->setVariable('display_exceptions', true); + + $exception = $e->getParam('exception', false); + + // @TODO clean up once PHP 7 requirement is enforced + if (!$exception instanceof \Exception && !$exception instanceof \Throwable) { + return; + } + + $model->setVariable('exception', $exception); + } + + /** + * Inject the controller and controller class into the model + * + * If either $displayExceptions or $displayNotFoundReason are enabled, + * injects the controllerClass from the MvcEvent. It checks to see if a + * controller is present in the MvcEvent, and, if not, grabs it from + * the route match if present; if a controller is found, it injects it into + * the model. + * + * @param ViewModel $model + * @param MvcEvent $e + * @return void + */ + protected function injectController($model, $e) + { + if (!$this->displayExceptions() && !$this->displayNotFoundReason()) { + return; + } + + $controller = $e->getController(); + if (empty($controller)) { + $routeMatch = $e->getRouteMatch(); + if (empty($routeMatch)) { + return; + } + + $controller = $routeMatch->getParam('controller', false); + if (!$controller) { + return; + } + } + + $controllerClass = $e->getControllerClass(); + $model->setVariable('controller', $controller); + $model->setVariable('controller_class', $controllerClass); + } +} diff --git a/vendor/Zend/Mvc/View/Http/ViewManager.php b/vendor/Zend/Mvc/View/Http/ViewManager.php new file mode 100644 index 0000000..436ba39 --- /dev/null +++ b/vendor/Zend/Mvc/View/Http/ViewManager.php @@ -0,0 +1,248 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\View\Http; + +use ArrayAccess; +use Traversable; +use Zend\EventManager\AbstractListenerAggregate; +use Zend\EventManager\EventManagerInterface; +use Zend\EventManager\ListenerAggregateInterface; +use Zend\Mvc\MvcEvent; +use Zend\ServiceManager\ServiceManager; +use Zend\View\HelperPluginManager as ViewHelperManager; +use Zend\View\Resolver as ViewResolver; +use Zend\View\View; + +/** + * Prepares the view layer + * + * Instantiates and configures all classes related to the view layer, including + * the renderer (and its associated resolver(s) and helper manager), the view + * object (and its associated rendering strategies), and the various MVC + * strategies and listeners. + * + * Defines and manages the following services: + * + * - ViewHelperManager (also aliased to Zend\View\HelperPluginManager) + * - ViewTemplateMapResolver (also aliased to Zend\View\Resolver\TemplateMapResolver) + * - ViewTemplatePathStack (also aliased to Zend\View\Resolver\TemplatePathStack) + * - ViewResolver (also aliased to Zend\View\Resolver\AggregateResolver and ResolverInterface) + * - ViewRenderer (also aliased to Zend\View\Renderer\PhpRenderer and RendererInterface) + * - ViewPhpRendererStrategy (also aliased to Zend\View\Strategy\PhpRendererStrategy) + * - View (also aliased to Zend\View\View) + * - DefaultRenderingStrategy (also aliased to Zend\Mvc\View\Http\DefaultRenderingStrategy) + * - ExceptionStrategy (also aliased to Zend\Mvc\View\Http\ExceptionStrategy) + * - RouteNotFoundStrategy (also aliased to Zend\Mvc\View\Http\RouteNotFoundStrategy and 404Strategy) + * - ViewModel + */ +class ViewManager extends AbstractListenerAggregate +{ + /** + * @var object application configuration service + */ + protected $config; + + /** + * @var MvcEvent + */ + protected $event; + + /** + * @var ServiceManager + */ + protected $services; + + /**@+ + * Various properties representing strategies and objects instantiated and + * configured by the view manager + */ + protected $helperManager; + protected $mvcRenderingStrategy; + protected $renderer; + protected $rendererStrategy; + protected $resolver; + protected $view; + protected $viewModel; + /**@-*/ + + /** + * {@inheritDoc} + */ + public function attach(EventManagerInterface $events, $priority = 1) + { + $this->listeners[] = $events->attach(MvcEvent::EVENT_BOOTSTRAP, [$this, 'onBootstrap'], 10000); + } + + /** + * Prepares the view layer + * + * @param $event + * @return void + */ + public function onBootstrap($event) + { + $application = $event->getApplication(); + $services = $application->getServiceManager(); + $config = $services->get('config'); + $events = $application->getEventManager(); + $sharedEvents = $events->getSharedManager(); + + $this->config = isset($config['view_manager']) && (is_array($config['view_manager']) || $config['view_manager'] instanceof ArrayAccess) + ? $config['view_manager'] + : []; + $this->services = $services; + $this->event = $event; + + $routeNotFoundStrategy = $services->get('HttpRouteNotFoundStrategy'); + $exceptionStrategy = $services->get('HttpExceptionStrategy'); + $mvcRenderingStrategy = $services->get('HttpDefaultRenderingStrategy'); + + $this->injectViewModelIntoPlugin(); + + $injectTemplateListener = $services->get('Zend\Mvc\View\Http\InjectTemplateListener'); + $createViewModelListener = new CreateViewModelListener(); + $injectViewModelListener = new InjectViewModelListener(); + + $this->registerMvcRenderingStrategies($events); + $this->registerViewStrategies(); + + $routeNotFoundStrategy->attach($events); + $exceptionStrategy->attach($events); + $events->attach(MvcEvent::EVENT_DISPATCH_ERROR, [$injectViewModelListener, 'injectViewModel'], -100); + $events->attach(MvcEvent::EVENT_RENDER_ERROR, [$injectViewModelListener, 'injectViewModel'], -100); + $mvcRenderingStrategy->attach($events); + + $sharedEvents->attach('Zend\Stdlib\DispatchableInterface', MvcEvent::EVENT_DISPATCH, [$createViewModelListener, 'createViewModelFromArray'], -80); + $sharedEvents->attach('Zend\Stdlib\DispatchableInterface', MvcEvent::EVENT_DISPATCH, [$routeNotFoundStrategy, 'prepareNotFoundViewModel'], -90); + $sharedEvents->attach('Zend\Stdlib\DispatchableInterface', MvcEvent::EVENT_DISPATCH, [$createViewModelListener, 'createViewModelFromNull'], -80); + $sharedEvents->attach('Zend\Stdlib\DispatchableInterface', MvcEvent::EVENT_DISPATCH, [$injectTemplateListener, 'injectTemplate'], -90); + $sharedEvents->attach('Zend\Stdlib\DispatchableInterface', MvcEvent::EVENT_DISPATCH, [$injectViewModelListener, 'injectViewModel'], -100); + } + + /** + * Retrieves the View instance + * + * @return View + */ + public function getView() + { + if ($this->view) { + return $this->view; + } + + $this->view = $this->services->get(View::class); + return $this->view; + } + + /** + * Configures the MvcEvent view model to ensure it has the template injected + * + * @return \Zend\View\Model\ModelInterface + */ + public function getViewModel() + { + if ($this->viewModel) { + return $this->viewModel; + } + + $this->viewModel = $model = $this->event->getViewModel(); + $layoutTemplate = $this->services->get('HttpDefaultRenderingStrategy')->getLayoutTemplate(); + $model->setTemplate($layoutTemplate); + + return $this->viewModel; + } + + /** + * Register additional mvc rendering strategies + * + * If there is a "mvc_strategies" key of the view manager configuration, loop + * through it. Pull each as a service from the service manager, and, if it + * is a ListenerAggregate, attach it to the view, at priority 100. This + * latter allows each to trigger before the default mvc rendering strategy, + * and for them to trigger in the order they are registered. + * + * @param EventManagerInterface $events + * @return void + */ + protected function registerMvcRenderingStrategies(EventManagerInterface $events) + { + if (! isset($this->config['mvc_strategies'])) { + return; + } + $mvcStrategies = $this->config['mvc_strategies']; + if (is_string($mvcStrategies)) { + $mvcStrategies = [$mvcStrategies]; + } + if (! is_array($mvcStrategies) && ! $mvcStrategies instanceof Traversable) { + return; + } + + foreach ($mvcStrategies as $mvcStrategy) { + if (! is_string($mvcStrategy)) { + continue; + } + + $listener = $this->services->get($mvcStrategy); + if ($listener instanceof ListenerAggregateInterface) { + $listener->attach($events, 100); + } + } + } + + /** + * Register additional view strategies + * + * If there is a "strategies" key of the view manager configuration, loop + * through it. Pull each as a service from the service manager, and, if it + * is a ListenerAggregate, attach it to the view, at priority 100. This + * latter allows each to trigger before the default strategy, and for them + * to trigger in the order they are registered. + * + * @return void + */ + protected function registerViewStrategies() + { + if (! isset($this->config['strategies'])) { + return; + } + $strategies = $this->config['strategies']; + if (is_string($strategies)) { + $strategies = [$strategies]; + } + if (! is_array($strategies) && ! $strategies instanceof Traversable) { + return; + } + + $view = $this->getView(); + $events = $view->getEventManager(); + + foreach ($strategies as $strategy) { + if (! is_string($strategy)) { + continue; + } + + $listener = $this->services->get($strategy); + if ($listener instanceof ListenerAggregateInterface) { + $listener->attach($events, 100); + } + } + } + + /** + * Injects the ViewModel view helper with the root view model. + */ + private function injectViewModelIntoPlugin() + { + $model = $this->getViewModel(); + $plugins = $this->services->get('ViewHelperManager'); + $plugin = $plugins->get('viewmodel'); + $plugin->setRoot($model); + } +} diff --git a/vendor/Zend/Mvc/View/SendResponseListener.php b/vendor/Zend/Mvc/View/SendResponseListener.php new file mode 100644 index 0000000..0e1ebb8 --- /dev/null +++ b/vendor/Zend/Mvc/View/SendResponseListener.php @@ -0,0 +1,19 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Mvc\View; + +use Zend\Mvc\SendResponseListener as MvcSendResponseListener; + +/** + * @deprecated + */ +class SendResponseListener extends MvcSendResponseListener +{ +} diff --git a/vendor/Zend/ServiceManager/AbstractFactoryInterface.php b/vendor/Zend/ServiceManager/AbstractFactoryInterface.php new file mode 100644 index 0000000..96bffea --- /dev/null +++ b/vendor/Zend/ServiceManager/AbstractFactoryInterface.php @@ -0,0 +1,33 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\ServiceManager; + +interface AbstractFactoryInterface +{ + /** + * Determine if we can create a service with name + * + * @param ServiceLocatorInterface $serviceLocator + * @param $name + * @param $requestedName + * @return bool + */ + public function canCreateServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName); + + /** + * Create service with name + * + * @param ServiceLocatorInterface $serviceLocator + * @param $name + * @param $requestedName + * @return mixed + */ + public function createServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName); +} diff --git a/vendor/Zend/ServiceManager/AbstractPluginManager.php b/vendor/Zend/ServiceManager/AbstractPluginManager.php new file mode 100644 index 0000000..c6bd9ac --- /dev/null +++ b/vendor/Zend/ServiceManager/AbstractPluginManager.php @@ -0,0 +1,363 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\ServiceManager; + +use Interop\Container\ContainerInterface; +use Exception as BaseException; + +/** + * ServiceManager implementation for managing plugins + * + * Automatically registers an initializer which should be used to verify that + * a plugin instance is of a valid type. Additionally, allows plugins to accept + * an array of options for the constructor, which can be used to configure + * the plugin when retrieved. Finally, enables the allowOverride property by + * default to allow registering factories, aliases, and invokables to take + * the place of those provided by the implementing class. + */ +abstract class AbstractPluginManager extends ServiceManager implements ServiceLocatorAwareInterface +{ + /** + * Allow overriding by default + * + * @var bool + */ + protected $allowOverride = true; + + /** + * Whether or not to auto-add a class as an invokable class if it exists + * + * @var bool + */ + protected $autoAddInvokableClass = true; + + /** + * Options to use when creating an instance + * + * @var mixed + */ + protected $creationOptions = null; + + /** + * The main service locator + * + * @var ServiceLocatorInterface + */ + protected $serviceLocator; + + /** + * Constructor + * + * Add a default initializer to ensure the plugin is valid after instance + * creation. + * + * Additionally, the constructor provides forwards compatibility with v3 by + * overloading the initial argument. v2 usage expects either null or a + * ConfigInterface instance, and will ignore any other arguments. v3 expects + * a ContainerInterface instance, and will use an array of configuration to + * seed the current instance with services. In most cases, you can ignore the + * constructor unless you are writing a specialized factory for your plugin + * manager or overriding it. + * + * @param null|ConfigInterface|ContainerInterface $configOrContainerInstance + * @param array $v3config If $configOrContainerInstance is a container, this + * value will be passed to the parent constructor. + * @throws Exception\InvalidArgumentException if $configOrContainerInstance + * is neither null, nor a ConfigInterface, nor a ContainerInterface. + */ + public function __construct($configOrContainerInstance = null, array $v3config = []) + { + if (null !== $configOrContainerInstance + && ! $configOrContainerInstance instanceof ConfigInterface + && ! $configOrContainerInstance instanceof ContainerInterface + ) { + throw new Exception\InvalidArgumentException(sprintf( + '%s expects a ConfigInterface instance or ContainerInterface instance; received %s', + get_class($this), + (is_object($configOrContainerInstance) + ? get_class($configOrContainerInstance) + : gettype($configOrContainerInstance) + ) + )); + } + + if ($configOrContainerInstance instanceof ContainerInterface) { + if (property_exists($this, 'serviceLocator')) { + if (! empty($v3config)) { + parent::__construct(new Config($v3config)); + } + $this->serviceLocator = $configOrContainerInstance; + } + + if (property_exists($this, 'creationContext')) { + if (! empty($v3config)) { + parent::__construct($v3config); + } + $this->creationContext = $configOrContainerInstance; + } + } + + if ($configOrContainerInstance instanceof ConfigInterface) { + parent::__construct($configOrContainerInstance); + } + + $this->addInitializer(function ($instance) { + if ($instance instanceof ServiceLocatorAwareInterface) { + $instance->setServiceLocator($this); + } + }); + } + + /** + * Validate the plugin + * + * Checks that the filter loaded is either a valid callback or an instance + * of FilterInterface. + * + * @param mixed $plugin + * @return void + * @throws Exception\RuntimeException if invalid + */ + abstract public function validatePlugin($plugin); + + /** + * Retrieve a service from the manager by name + * + * Allows passing an array of options to use when creating the instance. + * createFromInvokable() will use these and pass them to the instance + * constructor if not null and a non-empty array. + * + * @param string $name + * @param array $options + * @param bool $usePeeringServiceManagers + * + * @return object + * + * @throws Exception\ServiceNotFoundException + * @throws Exception\ServiceNotCreatedException + * @throws Exception\RuntimeException + */ + public function get($name, $options = [], $usePeeringServiceManagers = true) + { + $isAutoInvokable = false; + + // Allow specifying a class name directly; registers as an invokable class + if (!$this->has($name) && $this->autoAddInvokableClass && class_exists($name)) { + $isAutoInvokable = true; + + $this->setInvokableClass($name, $name); + } + + $this->creationOptions = $options; + + try { + $instance = parent::get($name, $usePeeringServiceManagers); + } catch (Exception\ServiceNotFoundException $exception) { + $this->tryThrowingServiceLocatorUsageException($name, $isAutoInvokable, $exception); + } catch (Exception\ServiceNotCreatedException $exception) { + $this->tryThrowingServiceLocatorUsageException($name, $isAutoInvokable, $exception); + } + + $this->creationOptions = null; + + try { + $this->validatePlugin($instance); + } catch (Exception\RuntimeException $exception) { + $this->tryThrowingServiceLocatorUsageException($name, $isAutoInvokable, $exception); + } + + return $instance; + } + + /** + * Register a service with the locator. + * + * Validates that the service object via validatePlugin() prior to + * attempting to register it. + * + * @param string $name + * @param mixed $service + * @param bool $shared + * @return AbstractPluginManager + * @throws Exception\InvalidServiceNameException + */ + public function setService($name, $service, $shared = true) + { + if ($service) { + $this->validatePlugin($service); + } + parent::setService($name, $service, $shared); + + return $this; + } + + /** + * Set the main service locator so factories can have access to it to pull deps + * + * @param ServiceLocatorInterface $serviceLocator + * @return AbstractPluginManager + */ + public function setServiceLocator(ServiceLocatorInterface $serviceLocator) + { + $this->serviceLocator = $serviceLocator; + + return $this; + } + + /** + * Get the main plugin manager. Useful for fetching dependencies from within factories. + * + * @return ServiceLocatorInterface + */ + public function getServiceLocator() + { + return $this->serviceLocator; + } + + /** + * Attempt to create an instance via an invokable class + * + * Overrides parent implementation by passing $creationOptions to the + * constructor, if non-null. + * + * @param string $canonicalName + * @param string $requestedName + * @return null|\stdClass + * @throws Exception\ServiceNotCreatedException If resolved class does not exist + */ + protected function createFromInvokable($canonicalName, $requestedName) + { + $invokable = $this->invokableClasses[$canonicalName]; + + if (!class_exists($invokable)) { + throw new Exception\ServiceNotFoundException(sprintf( + '%s: failed retrieving "%s%s" via invokable class "%s"; class does not exist', + get_class($this) . '::' . __FUNCTION__, + $canonicalName, + ($requestedName ? '(alias: ' . $requestedName . ')' : ''), + $invokable + )); + } + + if (null === $this->creationOptions + || (is_array($this->creationOptions) && empty($this->creationOptions)) + ) { + $instance = new $invokable(); + } else { + $instance = new $invokable($this->creationOptions); + } + + return $instance; + } + + /** + * Attempt to create an instance via a factory class + * + * Overrides parent implementation by passing $creationOptions to the + * constructor, if non-null. + * + * @param string $canonicalName + * @param string $requestedName + * @return mixed + * @throws Exception\ServiceNotCreatedException If factory is not callable + */ + protected function createFromFactory($canonicalName, $requestedName) + { + $factory = $this->factories[$canonicalName]; + $hasCreationOptions = !(null === $this->creationOptions || (is_array($this->creationOptions) && empty($this->creationOptions))); + + if (is_string($factory) && class_exists($factory, true)) { + if (!$hasCreationOptions) { + $factory = new $factory(); + } else { + $factory = new $factory($this->creationOptions); + } + + $this->factories[$canonicalName] = $factory; + } + + if ($factory instanceof FactoryInterface) { + $instance = $this->createServiceViaCallback([$factory, 'createService'], $canonicalName, $requestedName); + } elseif (is_callable($factory)) { + $instance = $this->createServiceViaCallback($factory, $canonicalName, $requestedName); + } else { + throw new Exception\ServiceNotCreatedException(sprintf( + 'While attempting to create %s%s an invalid factory was registered for this instance type.', + $canonicalName, + ($requestedName ? '(alias: ' . $requestedName . ')' : '') + )); + } + + return $instance; + } + + /** + * Create service via callback + * + * @param callable $callable + * @param string $cName + * @param string $rName + * @throws Exception\ServiceNotCreatedException + * @throws Exception\ServiceNotFoundException + * @throws Exception\CircularDependencyFoundException + * @return object + */ + protected function createServiceViaCallback($callable, $cName, $rName) + { + if (is_object($callable)) { + $factory = $callable; + } elseif (is_array($callable)) { + // reset both rewinds and returns the value of the first array element + $factory = reset($callable); + } + + // duck-type MutableCreationOptionsInterface for forward compatibility + if (isset($factory) + && method_exists($factory, 'setCreationOptions') + && is_array($this->creationOptions) + && !empty($this->creationOptions) + ) { + $factory->setCreationOptions($this->creationOptions); + } + + return parent::createServiceViaCallback($callable, $cName, $rName); + } + + /** + * @param string $serviceName + * @param bool $isAutoInvokable + * @param BaseException $exception + * + * @throws BaseException + * @throws Exception\ServiceLocatorUsageException + */ + private function tryThrowingServiceLocatorUsageException( + $serviceName, + $isAutoInvokable, + BaseException $exception + ) { + if ($isAutoInvokable) { + $this->unregisterService($this->canonicalizeName($serviceName)); + } + + $serviceLocator = $this->getServiceLocator(); + + if ($serviceLocator && $serviceLocator->has($serviceName)) { + throw Exception\ServiceLocatorUsageException::fromInvalidPluginManagerRequestedServiceName( + $this, + $serviceLocator, + $serviceName, + $exception + ); + } + + throw $exception; + } +} diff --git a/vendor/Zend/ServiceManager/Config.php b/vendor/Zend/ServiceManager/Config.php new file mode 100644 index 0000000..d506f26 --- /dev/null +++ b/vendor/Zend/ServiceManager/Config.php @@ -0,0 +1,166 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\ServiceManager; + +class Config implements ConfigInterface +{ + /** + * @var array + */ + protected $config = []; + + /** + * Constructor + * + * @param array $config + */ + public function __construct($config = []) + { + $this->config = $config; + } + + /** + * Get allow override + * + * @return null|bool + */ + public function getAllowOverride() + { + return (isset($this->config['allow_override'])) ? $this->config['allow_override'] : null; + } + + /** + * Get factories + * + * @return array + */ + public function getFactories() + { + return (isset($this->config['factories'])) ? $this->config['factories'] : []; + } + + /** + * Get abstract factories + * + * @return array + */ + public function getAbstractFactories() + { + return (isset($this->config['abstract_factories'])) ? $this->config['abstract_factories'] : []; + } + + /** + * Get invokables + * + * @return array + */ + public function getInvokables() + { + return (isset($this->config['invokables'])) ? $this->config['invokables'] : []; + } + + /** + * Get services + * + * @return array + */ + public function getServices() + { + return (isset($this->config['services'])) ? $this->config['services'] : []; + } + + /** + * Get aliases + * + * @return array + */ + public function getAliases() + { + return (isset($this->config['aliases'])) ? $this->config['aliases'] : []; + } + + /** + * Get initializers + * + * @return array + */ + public function getInitializers() + { + return (isset($this->config['initializers'])) ? $this->config['initializers'] : []; + } + + /** + * Get shared + * + * @return array + */ + public function getShared() + { + return (isset($this->config['shared'])) ? $this->config['shared'] : []; + } + + /** + * Get the delegator services map, with keys being the services acting as delegates, + * and values being the delegator factories names + * + * @return array + */ + public function getDelegators() + { + return (isset($this->config['delegators'])) ? $this->config['delegators'] : []; + } + + /** + * Configure service manager + * + * @param ServiceManager $serviceManager + * @return void + */ + public function configureServiceManager(ServiceManager $serviceManager) + { + if (($allowOverride = $this->getAllowOverride()) !== null) { + $serviceManager->setAllowOverride($allowOverride); + } + + foreach ($this->getFactories() as $name => $factory) { + $serviceManager->setFactory($name, $factory); + } + + foreach ($this->getAbstractFactories() as $factory) { + $serviceManager->addAbstractFactory($factory); + } + + foreach ($this->getInvokables() as $name => $invokable) { + $serviceManager->setInvokableClass($name, $invokable); + } + + foreach ($this->getServices() as $name => $service) { + $serviceManager->setService($name, $service); + } + + foreach ($this->getAliases() as $alias => $nameOrAlias) { + $serviceManager->setAlias($alias, $nameOrAlias); + } + + foreach ($this->getInitializers() as $initializer) { + $serviceManager->addInitializer($initializer); + } + + foreach ($this->getShared() as $name => $isShared) { + $serviceManager->setShared($name, $isShared); + } + + foreach ($this->getDelegators() as $originalServiceName => $delegators) { + foreach ($delegators as $delegator) { + $serviceManager->addDelegator($originalServiceName, $delegator); + } + } + } +} diff --git a/vendor/Zend/ServiceManager/ConfigInterface.php b/vendor/Zend/ServiceManager/ConfigInterface.php new file mode 100644 index 0000000..d55bc0e --- /dev/null +++ b/vendor/Zend/ServiceManager/ConfigInterface.php @@ -0,0 +1,21 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\ServiceManager; + +interface ConfigInterface +{ + /** + * Configure service manager + * + * @param ServiceManager $serviceManager + * @return void + */ + public function configureServiceManager(ServiceManager $serviceManager); +} diff --git a/vendor/Zend/ServiceManager/DelegatorFactoryInterface.php b/vendor/Zend/ServiceManager/DelegatorFactoryInterface.php new file mode 100644 index 0000000..fc8a47a --- /dev/null +++ b/vendor/Zend/ServiceManager/DelegatorFactoryInterface.php @@ -0,0 +1,28 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\ServiceManager; + +/** + * Interface for factories that can create delegates for services + */ +interface DelegatorFactoryInterface +{ + /** + * A factory that creates delegates of a given service + * + * @param ServiceLocatorInterface $serviceLocator the service locator which requested the service + * @param string $name the normalized service name + * @param string $requestedName the requested service name + * @param callable $callback the callback that is responsible for creating the service + * + * @return mixed + */ + public function createDelegatorWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName, $callback); +} diff --git a/vendor/Zend/ServiceManager/Di/DiAbstractServiceFactory.php b/vendor/Zend/ServiceManager/Di/DiAbstractServiceFactory.php new file mode 100644 index 0000000..199ce42 --- /dev/null +++ b/vendor/Zend/ServiceManager/Di/DiAbstractServiceFactory.php @@ -0,0 +1,68 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\ServiceManager\Di; + +use Zend\Di\Di; +use Zend\ServiceManager\AbstractFactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; + +class DiAbstractServiceFactory extends DiServiceFactory implements AbstractFactoryInterface +{ + /** + * Constructor + * + * @param \Zend\Di\Di $di + * @param null|string|\Zend\Di\InstanceManager $useServiceLocator + */ + public function __construct(Di $di, $useServiceLocator = self::USE_SL_NONE) + { + $this->di = $di; + if (in_array($useServiceLocator, [self::USE_SL_BEFORE_DI, self::USE_SL_AFTER_DI, self::USE_SL_NONE])) { + $this->useServiceLocator = $useServiceLocator; + } + + // since we are using this in a proxy-fashion, localize state + $this->definitions = $this->di->definitions; + $this->instanceManager = $this->di->instanceManager; + } + + /** + * {@inheritDoc} + */ + public function createServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName) + { + $this->serviceLocator = $serviceLocator; + if ($requestedName) { + return $this->get($requestedName, []); + } + + return $this->get($name, []); + } + + /** + * {@inheritDoc} + */ + public function canCreateServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName) + { + if ($this->instanceManager->hasSharedInstance($requestedName) + || $this->instanceManager->hasAlias($requestedName) + || $this->instanceManager->hasConfig($requestedName) + || $this->instanceManager->hasTypePreferences($requestedName) + ) { + return true; + } + + if (! $this->definitions->hasClass($requestedName) || interface_exists($requestedName)) { + return false; + } + + return true; + } +} diff --git a/vendor/Zend/ServiceManager/Di/DiInstanceManagerProxy.php b/vendor/Zend/ServiceManager/Di/DiInstanceManagerProxy.php new file mode 100644 index 0000000..87b10a3 --- /dev/null +++ b/vendor/Zend/ServiceManager/Di/DiInstanceManagerProxy.php @@ -0,0 +1,71 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\ServiceManager\Di; + +use Zend\Di\InstanceManager as DiInstanceManager; +use Zend\ServiceManager\ServiceLocatorInterface; + +class DiInstanceManagerProxy extends DiInstanceManager +{ + /** + * @var DiInstanceManager + */ + protected $diInstanceManager = null; + + /** + * @var ServiceLocatorInterface + */ + protected $serviceLocator = null; + + /** + * Constructor + * + * @param DiInstanceManager $diInstanceManager + * @param ServiceLocatorInterface $serviceLocator + */ + public function __construct(DiInstanceManager $diInstanceManager, ServiceLocatorInterface $serviceLocator) + { + $this->diInstanceManager = $diInstanceManager; + $this->serviceLocator = $serviceLocator; + + // localize state + $this->aliases = &$diInstanceManager->aliases; + $this->sharedInstances = &$diInstanceManager->sharedInstances; + $this->sharedInstancesWithParams = &$diInstanceManager->sharedInstancesWithParams; + $this->configurations = &$diInstanceManager->configurations; + $this->typePreferences = &$diInstanceManager->typePreferences; + } + + /** + * Determine if we have a shared instance by class or alias + * + * @param $classOrAlias + * @return bool + */ + public function hasSharedInstance($classOrAlias) + { + return ($this->serviceLocator->has($classOrAlias) || $this->diInstanceManager->hasSharedInstance($classOrAlias)); + } + + /** + * Get shared instance + * + * @param $classOrAlias + * @return mixed + */ + public function getSharedInstance($classOrAlias) + { + if ($this->serviceLocator->has($classOrAlias)) { + return $this->serviceLocator->get($classOrAlias); + } + + return $this->diInstanceManager->getSharedInstance($classOrAlias); + } +} diff --git a/vendor/Zend/ServiceManager/Di/DiServiceFactory.php b/vendor/Zend/ServiceManager/Di/DiServiceFactory.php new file mode 100644 index 0000000..e1e7393 --- /dev/null +++ b/vendor/Zend/ServiceManager/Di/DiServiceFactory.php @@ -0,0 +1,118 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\ServiceManager\Di; + +use Zend\Di\Di; +use Zend\Di\Exception\ClassNotFoundException as DiClassNotFoundException; +use Zend\ServiceManager\Exception; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; + +class DiServiceFactory extends Di implements FactoryInterface +{ + /**@#+ + * constants + */ + const USE_SL_BEFORE_DI = 'before'; + const USE_SL_AFTER_DI = 'after'; + const USE_SL_NONE = 'none'; + /**@#-*/ + + /** + * @var \Zend\Di\Di + */ + protected $di = null; + + /** + * @var \Zend\Di\InstanceManager + */ + protected $name = null; + + /** + * @var array + */ + protected $parameters = []; + + /** + * @var string + */ + protected $useServiceLocator = self::USE_SL_AFTER_DI; + + /** + * @var ServiceLocatorInterface + */ + protected $serviceLocator = null; + + /** + * Constructor + * + * @param \Zend\Di\Di $di + * @param null|\Zend\Di\InstanceManager $name + * @param array $parameters + * @param string $useServiceLocator + */ + public function __construct(Di $di, $name, array $parameters = [], $useServiceLocator = self::USE_SL_NONE) + { + $this->di = $di; + $this->name = $name; + $this->parameters = $parameters; + if (in_array($useServiceLocator, [self::USE_SL_BEFORE_DI, self::USE_SL_AFTER_DI, self::USE_SL_NONE])) { + $this->useServiceLocator = $useServiceLocator; + } + + // since we are using this in a proxy-fashion, localize state + $this->definitions = $this->di->definitions; + $this->instanceManager = $this->di->instanceManager; + } + + /** + * Create service + * + * @param ServiceLocatorInterface $serviceLocator + * @return object + */ + public function createService(ServiceLocatorInterface $serviceLocator) + { + $this->serviceLocator = $serviceLocator; + return $this->get($this->name, $this->parameters); + } + + /** + * Override, as we want it to use the functionality defined in the proxy + * + * @param string $name + * @param array $params + * @return object + * @throws Exception\ServiceNotFoundException + */ + public function get($name, array $params = []) + { + // allow this di service to get dependencies from the service locator BEFORE trying di + if ($this->useServiceLocator == self::USE_SL_BEFORE_DI && $this->serviceLocator->has($name)) { + return $this->serviceLocator->get($name); + } + + try { + $service = parent::get($name, $params); + return $service; + } catch (DiClassNotFoundException $e) { + // allow this di service to get dependencies from the service locator AFTER trying di + if ($this->useServiceLocator == self::USE_SL_AFTER_DI && $this->serviceLocator->has($name)) { + return $this->serviceLocator->get($name); + } else { + throw new Exception\ServiceNotFoundException( + sprintf('Service %s was not found in this DI instance', $name), + null, + $e + ); + } + } + } +} diff --git a/vendor/Zend/ServiceManager/Di/DiServiceInitializer.php b/vendor/Zend/ServiceManager/Di/DiServiceInitializer.php new file mode 100644 index 0000000..66760f0 --- /dev/null +++ b/vendor/Zend/ServiceManager/Di/DiServiceInitializer.php @@ -0,0 +1,66 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\ServiceManager\Di; + +use Zend\Di\Di; +use Zend\ServiceManager\InitializerInterface; +use Zend\ServiceManager\ServiceLocatorInterface; + +class DiServiceInitializer extends Di implements InitializerInterface +{ + /** + * @var Di + */ + protected $di = null; + + /** + * @var DiInstanceManagerProxy + */ + protected $diInstanceManagerProxy = null; + + /** + * @var ServiceLocatorInterface + */ + protected $serviceLocator = null; + + /** + * Constructor + * + * @param \Zend\Di\Di $di + * @param \Zend\ServiceManager\ServiceLocatorInterface $serviceLocator + * @param null|DiInstanceManagerProxy $diImProxy + */ + public function __construct(Di $di, ServiceLocatorInterface $serviceLocator, DiInstanceManagerProxy $diImProxy = null) + { + $this->di = $di; + $this->serviceLocator = $serviceLocator; + $this->diInstanceManagerProxy = ($diImProxy) ?: new DiInstanceManagerProxy($di->instanceManager(), $serviceLocator); + } + + /** + * Initialize + * + * @param $instance + * @param ServiceLocatorInterface $serviceLocator + * @throws \Exception + */ + public function initialize($instance, ServiceLocatorInterface $serviceLocator) + { + $instanceManager = $this->di->instanceManager; + $this->di->instanceManager = $this->diInstanceManagerProxy; + try { + $this->di->injectDependencies($instance); + $this->di->instanceManager = $instanceManager; + } catch (\Exception $e) { + $this->di->instanceManager = $instanceManager; + throw $e; + } + } +} diff --git a/vendor/Zend/ServiceManager/Exception/CircularDependencyFoundException.php b/vendor/Zend/ServiceManager/Exception/CircularDependencyFoundException.php new file mode 100644 index 0000000..280ff9d --- /dev/null +++ b/vendor/Zend/ServiceManager/Exception/CircularDependencyFoundException.php @@ -0,0 +1,14 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\ServiceManager\Exception; + +class CircularDependencyFoundException extends RuntimeException +{ +} diff --git a/vendor/Zend/ServiceManager/Exception/CircularReferenceException.php b/vendor/Zend/ServiceManager/Exception/CircularReferenceException.php new file mode 100644 index 0000000..0472cdf --- /dev/null +++ b/vendor/Zend/ServiceManager/Exception/CircularReferenceException.php @@ -0,0 +1,14 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\ServiceManager\Exception; + +class CircularReferenceException extends RuntimeException +{ +} diff --git a/vendor/Zend/ServiceManager/Exception/ExceptionInterface.php b/vendor/Zend/ServiceManager/Exception/ExceptionInterface.php new file mode 100644 index 0000000..ef0f374 --- /dev/null +++ b/vendor/Zend/ServiceManager/Exception/ExceptionInterface.php @@ -0,0 +1,16 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\ServiceManager\Exception; + +use Interop\Container\Exception\ContainerException; + +interface ExceptionInterface extends ContainerException +{ +} diff --git a/vendor/Zend/ServiceManager/Exception/InvalidArgumentException.php b/vendor/Zend/ServiceManager/Exception/InvalidArgumentException.php new file mode 100644 index 0000000..174c7eb --- /dev/null +++ b/vendor/Zend/ServiceManager/Exception/InvalidArgumentException.php @@ -0,0 +1,14 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\ServiceManager\Exception; + +class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface +{ +} diff --git a/vendor/Zend/ServiceManager/Exception/InvalidServiceException.php b/vendor/Zend/ServiceManager/Exception/InvalidServiceException.php new file mode 100644 index 0000000..16feb32 --- /dev/null +++ b/vendor/Zend/ServiceManager/Exception/InvalidServiceException.php @@ -0,0 +1,14 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\ServiceManager\Exception; + +class InvalidServiceException extends RuntimeException +{ +} diff --git a/vendor/Zend/ServiceManager/Exception/InvalidServiceNameException.php b/vendor/Zend/ServiceManager/Exception/InvalidServiceNameException.php new file mode 100644 index 0000000..a7065c4 --- /dev/null +++ b/vendor/Zend/ServiceManager/Exception/InvalidServiceNameException.php @@ -0,0 +1,14 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\ServiceManager\Exception; + +class InvalidServiceNameException extends RuntimeException +{ +} diff --git a/vendor/Zend/ServiceManager/Exception/RuntimeException.php b/vendor/Zend/ServiceManager/Exception/RuntimeException.php new file mode 100644 index 0000000..d191653 --- /dev/null +++ b/vendor/Zend/ServiceManager/Exception/RuntimeException.php @@ -0,0 +1,14 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\ServiceManager\Exception; + +class RuntimeException extends \RuntimeException implements ExceptionInterface +{ +} diff --git a/vendor/Zend/ServiceManager/Exception/ServiceLocatorUsageException.php b/vendor/Zend/ServiceManager/Exception/ServiceLocatorUsageException.php new file mode 100644 index 0000000..d248047 --- /dev/null +++ b/vendor/Zend/ServiceManager/Exception/ServiceLocatorUsageException.php @@ -0,0 +1,50 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\ServiceManager\Exception; + +use Exception as BaseException; +use Zend\ServiceManager\AbstractPluginManager; +use Zend\ServiceManager\ServiceLocatorInterface; + +class ServiceLocatorUsageException extends ServiceNotFoundException +{ + /** + * Static constructor + * + * @param AbstractPluginManager $pluginManager + * @param ServiceLocatorInterface $parentLocator + * @param string $serviceName + * @param BaseException $previousException + * + * @return self + */ + public static function fromInvalidPluginManagerRequestedServiceName( + AbstractPluginManager $pluginManager, + ServiceLocatorInterface $parentLocator, + $serviceName, + BaseException $previousException + ) { + return new self( + sprintf( + "Service \"%s\" has been requested to plugin manager of type \"%s\", but couldn't be retrieved.\n" + . "A previous exception of type \"%s\" has been raised in the process.\n" + . "By the way, a service with the name \"%s\" has been found in the parent service locator \"%s\": " + . 'did you forget to use $parentLocator = $serviceLocator->getServiceLocator() in your factory code?', + $serviceName, + get_class($pluginManager), + get_class($previousException), + $serviceName, + get_class($parentLocator) + ), + 0, + $previousException + ); + } +} diff --git a/vendor/Zend/ServiceManager/Exception/ServiceNotCreatedException.php b/vendor/Zend/ServiceManager/Exception/ServiceNotCreatedException.php new file mode 100644 index 0000000..a8b08e0 --- /dev/null +++ b/vendor/Zend/ServiceManager/Exception/ServiceNotCreatedException.php @@ -0,0 +1,14 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\ServiceManager\Exception; + +class ServiceNotCreatedException extends RuntimeException +{ +} diff --git a/vendor/Zend/ServiceManager/Exception/ServiceNotFoundException.php b/vendor/Zend/ServiceManager/Exception/ServiceNotFoundException.php new file mode 100644 index 0000000..a9a237a --- /dev/null +++ b/vendor/Zend/ServiceManager/Exception/ServiceNotFoundException.php @@ -0,0 +1,17 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\ServiceManager\Exception; + +use Interop\Container\Exception\NotFoundException; + +class ServiceNotFoundException extends InvalidArgumentException implements + NotFoundException +{ +} diff --git a/vendor/Zend/ServiceManager/Factory/InvokableFactory.php b/vendor/Zend/ServiceManager/Factory/InvokableFactory.php new file mode 100644 index 0000000..480ea28 --- /dev/null +++ b/vendor/Zend/ServiceManager/Factory/InvokableFactory.php @@ -0,0 +1,114 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\ServiceManager\Factory; + +use Interop\Container\ContainerInterface; +use Zend\ServiceManager\Exception\InvalidServiceException; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; + +/** + * Factory for instantiating classes with no dependencies or which accept a single array. + * + * The InvokableFactory can be used for any class that: + * + * - has no constructor arguments; + * - accepts a single array of arguments via the constructor. + * + * It replaces the "invokables" and "invokable class" functionality of the v2 + * service manager, and can also be used in v2 code for forwards compatibility + * with v3. + */ +final class InvokableFactory implements FactoryInterface +{ + /** + * Options to pass to the constructor (when used in v2), if any. + * + * @param null|array + */ + private $creationOptions; + + /** + * @param null|array|Traversable $creationOptions + * @throws InvalidServiceException if $creationOptions cannot be coerced to + * an array. + */ + public function __construct($creationOptions = null) + { + if (null === $creationOptions) { + return; + } + + $this->setCreationOptions($creationOptions); + } + + /** + * Create an instance of the requested class name. + * + * @param ContainerInterface $container + * @param string $requestedName + * @param null|array $options + * @return object + */ + public function __invoke(ContainerInterface $container, $requestedName, array $options = null) + { + return (null === $options) ? new $requestedName : new $requestedName($options); + } + + /** + * Create an instance of the named service. + * + * First, it checks if `$canonicalName` resolves to a class, and, if so, uses + * that value to proxy to `__invoke()`. + * + * Next, if `$requestedName` is non-empty and resolves to a class, this + * method uses that value to proxy to `__invoke()`. + * + * Finally, if the above each fail, it raises an exception. + * + * The approach above is performed as version 2 has two distinct behaviors + * under which factories are invoked: + * + * - If an alias was used, $canonicalName is the resolved name, and + * $requestedName is the service name requested, in which case $canonicalName + * is likely the qualified class name; + * - Otherwise, $canonicalName is the normalized name, and $requestedName + * is the original service name requested (typically the qualified class name). + * + * @param ServiceLocatorInterface $serviceLocator + * @param null|string $canonicalName + * @param null|string $requestedName + * @return object + * @throws InvalidServiceException + */ + public function createService(ServiceLocatorInterface $serviceLocator, $canonicalName = null, $requestedName = null) + { + if (class_exists($canonicalName)) { + return $this($serviceLocator, $canonicalName, $this->creationOptions); + } + + if (is_string($requestedName) && class_exists($requestedName)) { + return $this($serviceLocator, $requestedName, $this->creationOptions); + } + + throw new InvalidServiceException(sprintf( + '%s requires that the requested name is provided on invocation; please update your tests or consuming container', + __CLASS__ + )); + } + + /** + * {@inheritdoc} + */ + public function setCreationOptions(array $creationOptions) + { + $this->creationOptions = $creationOptions; + } +} diff --git a/vendor/Zend/ServiceManager/FactoryInterface.php b/vendor/Zend/ServiceManager/FactoryInterface.php new file mode 100644 index 0000000..0a65d65 --- /dev/null +++ b/vendor/Zend/ServiceManager/FactoryInterface.php @@ -0,0 +1,21 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\ServiceManager; + +interface FactoryInterface +{ + /** + * Create service + * + * @param ServiceLocatorInterface $serviceLocator + * @return mixed + */ + public function createService(ServiceLocatorInterface $serviceLocator); +} diff --git a/vendor/Zend/ServiceManager/InitializerInterface.php b/vendor/Zend/ServiceManager/InitializerInterface.php new file mode 100644 index 0000000..7e7f793 --- /dev/null +++ b/vendor/Zend/ServiceManager/InitializerInterface.php @@ -0,0 +1,22 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\ServiceManager; + +interface InitializerInterface +{ + /** + * Initialize + * + * @param $instance + * @param ServiceLocatorInterface $serviceLocator + * @return mixed + */ + public function initialize($instance, ServiceLocatorInterface $serviceLocator); +} diff --git a/vendor/Zend/ServiceManager/MutableCreationOptionsInterface.php b/vendor/Zend/ServiceManager/MutableCreationOptionsInterface.php new file mode 100644 index 0000000..3464155 --- /dev/null +++ b/vendor/Zend/ServiceManager/MutableCreationOptionsInterface.php @@ -0,0 +1,21 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\ServiceManager; + +interface MutableCreationOptionsInterface +{ + /** + * Set creation options + * + * @param array $options + * @return void + */ + public function setCreationOptions(array $options); +} diff --git a/vendor/Zend/ServiceManager/MutableCreationOptionsTrait.php b/vendor/Zend/ServiceManager/MutableCreationOptionsTrait.php new file mode 100644 index 0000000..cf4a3d5 --- /dev/null +++ b/vendor/Zend/ServiceManager/MutableCreationOptionsTrait.php @@ -0,0 +1,42 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\ServiceManager; + +/** + * Trait for MutableCreationOptions Factories + */ +trait MutableCreationOptionsTrait +{ + /** + * @var array + */ + protected $creationOptions = []; + + /** + * Set creation options + * + * @param array $creationOptions + * @return void + */ + public function setCreationOptions(array $creationOptions) + { + $this->creationOptions = $creationOptions; + } + + /** + * Get creation options + * + * @return array + */ + public function getCreationOptions() + { + return $this->creationOptions; + } +} diff --git a/vendor/Zend/ServiceManager/Proxy/LazyServiceFactory.php b/vendor/Zend/ServiceManager/Proxy/LazyServiceFactory.php new file mode 100644 index 0000000..806d008 --- /dev/null +++ b/vendor/Zend/ServiceManager/Proxy/LazyServiceFactory.php @@ -0,0 +1,72 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\ServiceManager\Proxy; + +use ProxyManager\Factory\LazyLoadingValueHolderFactory; +use ProxyManager\Proxy\LazyLoadingInterface; +use Zend\ServiceManager\DelegatorFactoryInterface; +use Zend\ServiceManager\Exception; +use Zend\ServiceManager\ServiceLocatorInterface; + +/** + * Delegator factory responsible of instantiating lazy loading value holder proxies of + * given services at runtime + * + * @link https://github.com/Ocramius/ProxyManager/blob/master/docs/lazy-loading-value-holder.md + */ +class LazyServiceFactory implements DelegatorFactoryInterface +{ + /** + * @var \ProxyManager\Factory\LazyLoadingValueHolderFactory + */ + protected $proxyFactory; + + /** + * @var string[] map of service names to class names + */ + protected $servicesMap; + + /** + * @param LazyLoadingValueHolderFactory $proxyFactory + * @param string[] $servicesMap a map of service names to class names of their + * respective classes + */ + public function __construct(LazyLoadingValueHolderFactory $proxyFactory, array $servicesMap) + { + $this->proxyFactory = $proxyFactory; + $this->servicesMap = $servicesMap; + } + + /** + * {@inheritDoc} + * + * @return object|\ProxyManager\Proxy\LazyLoadingInterface|\ProxyManager\Proxy\ValueHolderInterface + */ + public function createDelegatorWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName, $callback) + { + $initializer = function (& $wrappedInstance, LazyLoadingInterface $proxy) use ($callback) { + $proxy->setProxyInitializer(null); + + $wrappedInstance = call_user_func($callback); + + return true; + }; + + if (isset($this->servicesMap[$requestedName])) { + return $this->proxyFactory->createProxy($this->servicesMap[$requestedName], $initializer); + } elseif (isset($this->servicesMap[$name])) { + return $this->proxyFactory->createProxy($this->servicesMap[$name], $initializer); + } + + throw new Exception\InvalidServiceNameException( + sprintf('The requested service "%s" was not found in the provided services map', $requestedName) + ); + } +} diff --git a/vendor/Zend/ServiceManager/Proxy/LazyServiceFactoryFactory.php b/vendor/Zend/ServiceManager/Proxy/LazyServiceFactoryFactory.php new file mode 100644 index 0000000..9c94e75 --- /dev/null +++ b/vendor/Zend/ServiceManager/Proxy/LazyServiceFactoryFactory.php @@ -0,0 +1,62 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\ServiceManager\Proxy; + +use ProxyManager\Configuration; +use ProxyManager\Factory\LazyLoadingValueHolderFactory; +use ProxyManager\GeneratorStrategy\EvaluatingGeneratorStrategy; +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; +use Zend\ServiceManager\Exception; + +/** + * Service factory responsible of instantiating {@see \Zend\ServiceManager\Proxy\LazyServiceFactory} + * and configuring it starting from application configuration + */ +class LazyServiceFactoryFactory implements FactoryInterface +{ + /** + * {@inheritDoc} + * + * @return \Zend\ServiceManager\Proxy\LazyServiceFactory + */ + public function createService(ServiceLocatorInterface $serviceLocator) + { + $config = $serviceLocator->get('Config'); + + if (!isset($config['lazy_services'])) { + throw new Exception\InvalidArgumentException('Missing "lazy_services" config key'); + } + + $lazyServices = $config['lazy_services']; + + if (!isset($lazyServices['class_map'])) { + throw new Exception\InvalidArgumentException('Missing "class_map" config key in "lazy_services"'); + } + + $factoryConfig = new Configuration(); + + if (isset($lazyServices['proxies_namespace'])) { + $factoryConfig->setProxiesNamespace($lazyServices['proxies_namespace']); + } + + if (isset($lazyServices['proxies_target_dir'])) { + $factoryConfig->setProxiesTargetDir($lazyServices['proxies_target_dir']); + } + + if (!isset($lazyServices['write_proxy_files']) || ! $lazyServices['write_proxy_files']) { + $factoryConfig->setGeneratorStrategy(new EvaluatingGeneratorStrategy()); + } + + spl_autoload_register($factoryConfig->getProxyAutoloader()); + + return new LazyServiceFactory(new LazyLoadingValueHolderFactory($factoryConfig), $lazyServices['class_map']); + } +} diff --git a/vendor/Zend/ServiceManager/ServiceLocatorAwareInterface.php b/vendor/Zend/ServiceManager/ServiceLocatorAwareInterface.php new file mode 100644 index 0000000..1058042 --- /dev/null +++ b/vendor/Zend/ServiceManager/ServiceLocatorAwareInterface.php @@ -0,0 +1,27 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\ServiceManager; + +interface ServiceLocatorAwareInterface +{ + /** + * Set service locator + * + * @param ServiceLocatorInterface $serviceLocator + */ + public function setServiceLocator(ServiceLocatorInterface $serviceLocator); + + /** + * Get service locator + * + * @return ServiceLocatorInterface + */ + public function getServiceLocator(); +} diff --git a/vendor/Zend/ServiceManager/ServiceLocatorAwareTrait.php b/vendor/Zend/ServiceManager/ServiceLocatorAwareTrait.php new file mode 100644 index 0000000..94ceb56 --- /dev/null +++ b/vendor/Zend/ServiceManager/ServiceLocatorAwareTrait.php @@ -0,0 +1,41 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\ServiceManager; + +trait ServiceLocatorAwareTrait +{ + /** + * @var ServiceLocatorInterface + */ + protected $serviceLocator = null; + + /** + * Set service locator + * + * @param ServiceLocatorInterface $serviceLocator + * @return mixed + */ + public function setServiceLocator(ServiceLocatorInterface $serviceLocator) + { + $this->serviceLocator = $serviceLocator; + + return $this; + } + + /** + * Get service locator + * + * @return ServiceLocatorInterface + */ + public function getServiceLocator() + { + return $this->serviceLocator; + } +} diff --git a/vendor/Zend/ServiceManager/ServiceLocatorInterface.php b/vendor/Zend/ServiceManager/ServiceLocatorInterface.php new file mode 100644 index 0000000..9f69ae4 --- /dev/null +++ b/vendor/Zend/ServiceManager/ServiceLocatorInterface.php @@ -0,0 +1,35 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\ServiceManager; + +use Interop\Container\ContainerInterface; + +/** + * Service locator interface + */ +interface ServiceLocatorInterface extends ContainerInterface +{ + /** + * Retrieve a registered instance + * + * @param string $name + * @throws Exception\ServiceNotFoundException + * @return object|array + */ + public function get($name); + + /** + * Check for a registered instance + * + * @param string|array $name + * @return bool + */ + public function has($name); +} diff --git a/vendor/Zend/ServiceManager/ServiceManager.php b/vendor/Zend/ServiceManager/ServiceManager.php new file mode 100644 index 0000000..cb1473f --- /dev/null +++ b/vendor/Zend/ServiceManager/ServiceManager.php @@ -0,0 +1,1267 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\ServiceManager; + +class ServiceManager implements ServiceLocatorInterface +{ + /**@#+ + * Constants + */ + const SCOPE_PARENT = 'parent'; + const SCOPE_CHILD = 'child'; + /**@#-*/ + + /** + * Lookup for canonicalized names. + * + * @var array + */ + protected $canonicalNames = []; + + /** + * @var bool + */ + protected $allowOverride = false; + + /** + * @var array + */ + protected $invokableClasses = []; + + /** + * @var string|callable|\Closure|FactoryInterface[] + */ + protected $factories = []; + + /** + * @var AbstractFactoryInterface[] + */ + protected $abstractFactories = []; + + /** + * @var array[] + */ + protected $delegators = []; + + /** + * @var array + */ + protected $pendingAbstractFactoryRequests = []; + + /** + * @var integer + */ + protected $nestedContextCounter = -1; + + /** + * @var array + */ + protected $nestedContext = []; + + /** + * @var array + */ + protected $shared = []; + + /** + * Registered services and cached values + * + * @var array + */ + protected $instances = []; + + /** + * @var array + */ + protected $aliases = []; + + /** + * @var array + */ + protected $initializers = []; + + /** + * @var ServiceManager[] + */ + protected $peeringServiceManagers = []; + + /** + * Whether or not to share by default + * + * @var bool + */ + protected $shareByDefault = true; + + /** + * @var bool + */ + protected $retrieveFromPeeringManagerFirst = false; + + /** + * @var bool Track whether not to throw exceptions during create() + */ + protected $throwExceptionInCreate = true; + + /** + * @var array map of characters to be replaced through strtr + */ + protected $canonicalNamesReplacements = ['-' => '', '_' => '', ' ' => '', '\\' => '', '/' => '']; + + /** + * @var ServiceLocatorInterface + */ + protected $serviceManagerCaller; + + /** + * Constructor + * + * @param ConfigInterface $config + */ + public function __construct(ConfigInterface $config = null) + { + if ($config) { + $config->configureServiceManager($this); + } + } + + /** + * Set allow override + * + * @param $allowOverride + * @return ServiceManager + */ + public function setAllowOverride($allowOverride) + { + $this->allowOverride = (bool) $allowOverride; + return $this; + } + + /** + * Get allow override + * + * @return bool + */ + public function getAllowOverride() + { + return $this->allowOverride; + } + + /** + * Set flag indicating whether services are shared by default + * + * @param bool $shareByDefault + * @return ServiceManager + * @throws Exception\RuntimeException if allowOverride is false + */ + public function setShareByDefault($shareByDefault) + { + if ($this->allowOverride === false) { + throw new Exception\RuntimeException(sprintf( + '%s: cannot alter default shared service setting; container is marked immutable (allow_override is false)', + get_class($this) . '::' . __FUNCTION__ + )); + } + $this->shareByDefault = (bool) $shareByDefault; + return $this; + } + + /** + * Are services shared by default? + * + * @return bool + */ + public function shareByDefault() + { + return $this->shareByDefault; + } + + /** + * Set throw exceptions in create + * + * @param bool $throwExceptionInCreate + * @return ServiceManager + */ + public function setThrowExceptionInCreate($throwExceptionInCreate) + { + $this->throwExceptionInCreate = $throwExceptionInCreate; + return $this; + } + + /** + * Get throw exceptions in create + * + * @return bool + */ + public function getThrowExceptionInCreate() + { + return $this->throwExceptionInCreate; + } + + /** + * Set flag indicating whether to pull from peering manager before attempting creation + * + * @param bool $retrieveFromPeeringManagerFirst + * @return ServiceManager + */ + public function setRetrieveFromPeeringManagerFirst($retrieveFromPeeringManagerFirst = true) + { + $this->retrieveFromPeeringManagerFirst = (bool) $retrieveFromPeeringManagerFirst; + return $this; + } + + /** + * Should we retrieve from the peering manager prior to attempting to create a service? + * + * @return bool + */ + public function retrieveFromPeeringManagerFirst() + { + return $this->retrieveFromPeeringManagerFirst; + } + + /** + * Set invokable class + * + * @param string $name + * @param string $invokableClass + * @param bool $shared + * @return ServiceManager + * @throws Exception\InvalidServiceNameException + */ + public function setInvokableClass($name, $invokableClass, $shared = null) + { + $cName = $this->canonicalizeName($name); + + if ($this->has([$cName, $name], false)) { + if ($this->allowOverride === false) { + throw new Exception\InvalidServiceNameException(sprintf( + 'A service by the name or alias "%s" already exists and cannot be overridden; please use an alternate name', + $name + )); + } + $this->unregisterService($cName); + } + + if ($shared === null) { + $shared = $this->shareByDefault; + } + + $this->invokableClasses[$cName] = $invokableClass; + $this->shared[$cName] = (bool) $shared; + + return $this; + } + + /** + * Set factory + * + * @param string $name + * @param string|FactoryInterface|callable $factory + * @param bool $shared + * @return ServiceManager + * @throws Exception\InvalidArgumentException + * @throws Exception\InvalidServiceNameException + */ + public function setFactory($name, $factory, $shared = null) + { + $cName = $this->canonicalizeName($name); + + if (!($factory instanceof FactoryInterface || is_string($factory) || is_callable($factory))) { + throw new Exception\InvalidArgumentException(sprintf( + 'Provided factory must be the class name of a factory, callable or an instance of "%s".', + FactoryInterface::class + )); + } + + if ($this->has([$cName, $name], false)) { + if ($this->allowOverride === false) { + throw new Exception\InvalidServiceNameException(sprintf( + 'A service by the name or alias "%s" already exists and cannot be overridden, please use an alternate name', + $name + )); + } + $this->unregisterService($cName); + } + + if ($shared === null) { + $shared = $this->shareByDefault; + } + + $this->factories[$cName] = $factory; + $this->shared[$cName] = (bool) $shared; + + return $this; + } + + /** + * Add abstract factory + * + * @param AbstractFactoryInterface|string $factory + * @param bool $topOfStack + * @return ServiceManager + * @throws Exception\InvalidArgumentException if the abstract factory is invalid + */ + public function addAbstractFactory($factory, $topOfStack = true) + { + if (!$factory instanceof AbstractFactoryInterface && is_string($factory)) { + $factory = new $factory(); + } + + if (!$factory instanceof AbstractFactoryInterface) { + throw new Exception\InvalidArgumentException( + 'Provided abstract factory must be the class name of an abstract' + . ' factory or an instance of an AbstractFactoryInterface.' + ); + } + + if ($topOfStack) { + array_unshift($this->abstractFactories, $factory); + } else { + array_push($this->abstractFactories, $factory); + } + return $this; + } + + /** + * Sets the given service name as to be handled by a delegator factory + * + * @param string $serviceName name of the service being the delegate + * @param string $delegatorFactoryName name of the service being the delegator factory + * + * @return ServiceManager + */ + public function addDelegator($serviceName, $delegatorFactoryName) + { + $cName = $this->canonicalizeName($serviceName); + + if (!isset($this->delegators[$cName])) { + $this->delegators[$cName] = []; + } + + $this->delegators[$cName][] = $delegatorFactoryName; + + return $this; + } + + /** + * Add initializer + * + * @param callable|InitializerInterface $initializer + * @param bool $topOfStack + * @return ServiceManager + * @throws Exception\InvalidArgumentException + */ + public function addInitializer($initializer, $topOfStack = true) + { + if (!($initializer instanceof InitializerInterface || is_callable($initializer))) { + if (is_string($initializer)) { + $initializer = new $initializer; + } + + if (!($initializer instanceof InitializerInterface || is_callable($initializer))) { + throw new Exception\InvalidArgumentException('$initializer should be callable.'); + } + } + + if ($topOfStack) { + array_unshift($this->initializers, $initializer); + } else { + array_push($this->initializers, $initializer); + } + return $this; + } + + /** + * Register a service with the locator + * + * @param string $name + * @param mixed $service + * @return ServiceManager + * @throws Exception\InvalidServiceNameException + */ + public function setService($name, $service) + { + $cName = $this->canonicalizeName($name); + + if ($this->has($cName, false)) { + if ($this->allowOverride === false) { + throw new Exception\InvalidServiceNameException(sprintf( + '%s: A service by the name "%s" or alias already exists and cannot be overridden, please use an alternate name.', + get_class($this) . '::' . __FUNCTION__, + $name + )); + } + $this->unregisterService($cName); + } + + $this->instances[$cName] = $service; + + return $this; + } + + /** + * @param string $name + * @param bool $isShared + * @return ServiceManager + * @throws Exception\ServiceNotFoundException + */ + public function setShared($name, $isShared) + { + $cName = $this->canonicalizeName($name); + + if (!isset($this->invokableClasses[$cName]) + && !isset($this->factories[$cName]) + && !$this->canCreateFromAbstractFactory($cName, $name) + ) { + throw new Exception\ServiceNotFoundException(sprintf( + '%s: A service by the name "%s" was not found and could not be marked as shared', + get_class($this) . '::' . __FUNCTION__, + $name + )); + } + + $this->shared[$cName] = (bool) $isShared; + return $this; + } + + /** + * @param string $name + * @return bool + * @throws Exception\ServiceNotFoundException + */ + public function isShared($name) + { + $cName = $this->canonicalizeName($name); + + if (!$this->has($name)) { + throw new Exception\ServiceNotFoundException(sprintf( + '%s: A service by the name "%s" was not found', + get_class($this) . '::' . __FUNCTION__, + $name + )); + } + + if (!isset($this->shared[$cName])) { + return $this->shareByDefault(); + } + + return $this->shared[$cName]; + } + + /** + * Resolve the alias for the given canonical name + * + * @param string $cName The canonical name to resolve + * @return string The resolved canonical name + */ + protected function resolveAlias($cName) + { + $stack = []; + + while ($this->hasAlias($cName)) { + if (isset($stack[$cName])) { + throw new Exception\CircularReferenceException(sprintf( + 'Circular alias reference: %s -> %s', + implode(' -> ', $stack), + $cName + )); + } + + $stack[$cName] = $cName; + $cName = $this->aliases[$this->canonicalizeName($cName)]; + } + + return $cName; + } + + /** + * Retrieve a registered instance + * + * @param string $name + * @param bool $usePeeringServiceManagers + * @throws Exception\ServiceNotFoundException + * @return object|array + */ + public function get($name, $usePeeringServiceManagers = true) + { + // inlined code from ServiceManager::canonicalizeName for performance + if (isset($this->canonicalNames[$name])) { + $cName = $this->canonicalNames[$name]; + } else { + $cName = $this->canonicalizeName($name); + } + + $isAlias = false; + + if ($this->hasAlias($cName)) { + $isAlias = true; + $name = $this->resolveAlias($cName); + $cName = $this->canonicalizeName($name); + } + + $instance = null; + + if ($usePeeringServiceManagers && $this->retrieveFromPeeringManagerFirst) { + $instance = $this->retrieveFromPeeringManager($name); + + if (null !== $instance) { + return $instance; + } + } + + if (isset($this->instances[$cName])) { + return $this->instances[$cName]; + } + + if (!$instance) { + $this->checkNestedContextStart($cName); + if (isset($this->invokableClasses[$cName]) + || isset($this->factories[$cName]) + || isset($this->aliases[$cName]) + || $this->canCreateFromAbstractFactory($cName, $name) + ) { + $instance = $this->create([$cName, $name]); + } elseif ($isAlias && $this->canCreateFromAbstractFactory($name, $cName)) { + /* + * case of an alias leading to an abstract factory : + * 'my-alias' => 'my-abstract-defined-service' + * $name = 'my-alias' + * $cName = 'my-abstract-defined-service' + */ + $instance = $this->create([$name, $cName]); + } elseif ($usePeeringServiceManagers && !$this->retrieveFromPeeringManagerFirst) { + $instance = $this->retrieveFromPeeringManager($name); + } + $this->checkNestedContextStop(); + } + + // Still no instance? raise an exception + if ($instance === null) { + $this->checkNestedContextStop(true); + if ($isAlias) { + throw new Exception\ServiceNotFoundException(sprintf( + 'An alias "%s" was requested but no service could be found.', + $name + )); + } + + throw new Exception\ServiceNotFoundException(sprintf( + '%s was unable to fetch or create an instance for %s', + get_class($this) . '::' . __FUNCTION__, + $name + )); + } + + if (($this->shareByDefault && !isset($this->shared[$cName])) + || (isset($this->shared[$cName]) && $this->shared[$cName] === true) + ) { + $this->instances[$cName] = $instance; + } + + return $instance; + } + + /** + * Create an instance of the requested service + * + * @param string|array $name + * + * @return bool|object + */ + public function create($name) + { + if (is_array($name)) { + list($cName, $rName) = $name; + } else { + $rName = $name; + + // inlined code from ServiceManager::canonicalizeName for performance + if (isset($this->canonicalNames[$rName])) { + $cName = $this->canonicalNames[$name]; + } else { + $cName = $this->canonicalizeName($name); + } + } + + if (isset($this->delegators[$cName])) { + return $this->createDelegatorFromFactory($cName, $rName); + } + + return $this->doCreate($rName, $cName); + } + + /** + * Creates a callback that uses a delegator to create a service + * + * @param DelegatorFactoryInterface|callable $delegatorFactory the delegator factory + * @param string $rName requested service name + * @param string $cName canonical service name + * @param callable $creationCallback callback for instantiating the real service + * + * @return callable + */ + private function createDelegatorCallback($delegatorFactory, $rName, $cName, $creationCallback) + { + return function () use ($delegatorFactory, $rName, $cName, $creationCallback) { + return $delegatorFactory instanceof DelegatorFactoryInterface + ? $delegatorFactory->createDelegatorWithName($this, $cName, $rName, $creationCallback) + : $delegatorFactory($this, $cName, $rName, $creationCallback); + }; + } + + /** + * Actually creates the service + * + * @param string $rName real service name + * @param string $cName canonicalized service name + * + * @return bool|mixed|null|object + * @throws Exception\ServiceNotFoundException + * + */ + protected function doCreate($rName, $cName) + { + $instance = null; + + if (isset($this->factories[$cName])) { + $instance = $this->createFromFactory($cName, $rName); + } + + if ($instance === null && isset($this->invokableClasses[$cName])) { + $instance = $this->createFromInvokable($cName, $rName); + } + $this->checkNestedContextStart($cName); + if ($instance === null && $this->canCreateFromAbstractFactory($cName, $rName)) { + $instance = $this->createFromAbstractFactory($cName, $rName); + } + $this->checkNestedContextStop(); + + if ($instance === null && $this->throwExceptionInCreate) { + $this->checkNestedContextStop(true); + throw new Exception\ServiceNotFoundException(sprintf( + 'No valid instance was found for %s%s', + $cName, + ($rName ? '(alias: ' . $rName . ')' : '') + )); + } + + // Do not call initializers if we do not have an instance + if ($instance === null) { + return $instance; + } + + foreach ($this->initializers as $initializer) { + if ($initializer instanceof InitializerInterface) { + $initializer->initialize($instance, $this); + } else { + call_user_func($initializer, $instance, $this); + } + } + + return $instance; + } + + /** + * Determine if we can create an instance. + * Proxies to has() + * + * @param string|array $name + * @param bool $checkAbstractFactories + * @return bool + * @deprecated this method is being deprecated as of zendframework 2.3, and may be removed in future major versions + */ + public function canCreate($name, $checkAbstractFactories = true) + { + trigger_error(sprintf('%s is deprecated; please use %s::has', __METHOD__, __CLASS__), E_USER_DEPRECATED); + return $this->has($name, $checkAbstractFactories, false); + } + + /** + * Determine if an instance exists. + * + * @param string|array $name An array argument accepts exactly two values. + * Example: array('canonicalName', 'requestName') + * @param bool $checkAbstractFactories + * @param bool $usePeeringServiceManagers + * @return bool + */ + public function has($name, $checkAbstractFactories = true, $usePeeringServiceManagers = true) + { + if (is_string($name)) { + $rName = $name; + + // inlined code from ServiceManager::canonicalizeName for performance + if (isset($this->canonicalNames[$rName])) { + $cName = $this->canonicalNames[$rName]; + } else { + $cName = $this->canonicalizeName($name); + } + } elseif (is_array($name) && count($name) >= 2) { + list($cName, $rName) = $name; + } else { + return false; + } + + if (isset($this->invokableClasses[$cName]) + || isset($this->factories[$cName]) + || isset($this->aliases[$cName]) + || isset($this->instances[$cName]) + || ($checkAbstractFactories && $this->canCreateFromAbstractFactory($cName, $rName)) + ) { + return true; + } + + if ($usePeeringServiceManagers) { + $caller = $this->serviceManagerCaller; + foreach ($this->peeringServiceManagers as $peeringServiceManager) { + // ignore peering service manager if they are the same instance + if ($caller === $peeringServiceManager) { + continue; + } + + $peeringServiceManager->serviceManagerCaller = $this; + + if ($peeringServiceManager->has($name)) { + $peeringServiceManager->serviceManagerCaller = null; + return true; + } + + $peeringServiceManager->serviceManagerCaller = null; + } + } + + return false; + } + + /** + * Determine if we can create an instance from an abstract factory. + * + * @param string $cName + * @param string $rName + * @return bool + */ + public function canCreateFromAbstractFactory($cName, $rName) + { + if (array_key_exists($cName, $this->nestedContext)) { + $context = $this->nestedContext[$cName]; + if ($context === false) { + return false; + } elseif (is_object($context)) { + return !isset($this->pendingAbstractFactoryRequests[get_class($context).$cName]); + } + } + $this->checkNestedContextStart($cName); + // check abstract factories + $result = false; + $this->nestedContext[$cName] = false; + foreach ($this->abstractFactories as $abstractFactory) { + $pendingKey = get_class($abstractFactory).$cName; + if (isset($this->pendingAbstractFactoryRequests[$pendingKey])) { + $result = false; + break; + } + + if ($abstractFactory->canCreateServiceWithName($this, $cName, $rName)) { + $this->nestedContext[$cName] = $abstractFactory; + $result = true; + break; + } + } + $this->checkNestedContextStop(); + return $result; + } + + /** + * Ensure the alias definition will not result in a circular reference + * + * @param string $alias + * @param string $nameOrAlias + * @throws Exception\CircularReferenceException + * @return self + */ + protected function checkForCircularAliasReference($alias, $nameOrAlias) + { + $aliases = $this->aliases; + $aliases[$alias] = $this->canonicalizeName($nameOrAlias); + $stack = []; + + while (isset($aliases[$alias])) { + if (isset($stack[$alias])) { + throw new Exception\CircularReferenceException(sprintf( + 'The alias definition "%s" : "%s" results in a circular reference: "%s" -> "%s"', + $alias, + $nameOrAlias, + implode('" -> "', $stack), + $alias + )); + } + + $stack[$alias] = $alias; + $alias = $this->canonicalizeName($aliases[$alias]); + } + + return $this; + } + + /** + * @param string $alias + * @param string $nameOrAlias + * @return ServiceManager + * @throws Exception\ServiceNotFoundException + * @throws Exception\InvalidServiceNameException + */ + public function setAlias($alias, $nameOrAlias) + { + if (!is_string($alias) || !is_string($nameOrAlias)) { + throw new Exception\InvalidServiceNameException('Service or alias names must be strings.'); + } + + $cAlias = $this->canonicalizeName($alias); + + if ($alias == '' || $nameOrAlias == '') { + throw new Exception\InvalidServiceNameException('Invalid service name alias'); + } + + if ($this->allowOverride === false && $this->has([$cAlias, $alias], false)) { + throw new Exception\InvalidServiceNameException(sprintf( + 'An alias by the name "%s" or "%s" already exists', + $cAlias, + $alias + )); + } + + if ($this->hasAlias($alias)) { + $this->checkForCircularAliasReference($cAlias, $nameOrAlias); + } + + $this->aliases[$cAlias] = $nameOrAlias; + return $this; + } + + /** + * Determine if we have an alias + * + * @param string $alias + * @return bool + */ + public function hasAlias($alias) + { + return isset($this->aliases[$this->canonicalizeName($alias)]); + } + + /** + * Create scoped service manager + * + * @param string $peering + * @return ServiceManager + */ + public function createScopedServiceManager($peering = self::SCOPE_PARENT) + { + $scopedServiceManager = new ServiceManager(); + if ($peering == self::SCOPE_PARENT) { + $scopedServiceManager->peeringServiceManagers[] = $this; + } + if ($peering == self::SCOPE_CHILD) { + $this->peeringServiceManagers[] = $scopedServiceManager; + } + return $scopedServiceManager; + } + + /** + * Add a peering relationship + * + * @param ServiceManager $manager + * @param string $peering + * @return ServiceManager + */ + public function addPeeringServiceManager(ServiceManager $manager, $peering = self::SCOPE_PARENT) + { + if ($peering == self::SCOPE_PARENT) { + $this->peeringServiceManagers[] = $manager; + } + if ($peering == self::SCOPE_CHILD) { + $manager->peeringServiceManagers[] = $this; + } + return $this; + } + + /** + * Canonicalize name + * + * @param string $name + * @return string + */ + protected function canonicalizeName($name) + { + if (isset($this->canonicalNames[$name])) { + return $this->canonicalNames[$name]; + } + + // this is just for performance instead of using str_replace + return $this->canonicalNames[$name] = strtolower(strtr($name, $this->canonicalNamesReplacements)); + } + + /** + * Create service via callback + * + * @param callable $callable + * @param string $cName + * @param string $rName + * @throws Exception\ServiceNotCreatedException + * @throws Exception\ServiceNotFoundException + * @throws Exception\CircularDependencyFoundException + * @return object + */ + protected function createServiceViaCallback($callable, $cName, $rName) + { + static $circularDependencyResolver = []; + $depKey = spl_object_hash($this) . '-' . $cName; + + if (isset($circularDependencyResolver[$depKey])) { + $circularDependencyResolver = []; + throw new Exception\CircularDependencyFoundException('Circular dependency for LazyServiceLoader was found for instance ' . $rName); + } + + try { + $circularDependencyResolver[$depKey] = true; + $instance = call_user_func($callable, $this, $cName, $rName); + unset($circularDependencyResolver[$depKey]); + } catch (Exception\ServiceNotFoundException $e) { + unset($circularDependencyResolver[$depKey]); + throw $e; + } catch (\Exception $e) { + unset($circularDependencyResolver[$depKey]); + throw new Exception\ServiceNotCreatedException( + sprintf('An exception was raised while creating "%s"; no instance returned', $rName), + $e->getCode(), + $e + ); + } + if ($instance === null) { + throw new Exception\ServiceNotCreatedException('The factory was called but did not return an instance.'); + } + + return $instance; + } + + /** + * Retrieve a keyed list of all registered services. Handy for debugging! + * + * @return array + */ + public function getRegisteredServices() + { + return [ + 'invokableClasses' => array_keys($this->invokableClasses), + 'factories' => array_keys($this->factories), + 'aliases' => array_keys($this->aliases), + 'instances' => array_keys($this->instances), + ]; + } + + /** + * Retrieve a keyed list of all canonical names. Handy for debugging! + * + * @return array + */ + public function getCanonicalNames() + { + return $this->canonicalNames; + } + + /** + * Allows to override the canonical names lookup map with predefined + * values. + * + * @param array $canonicalNames + * @return ServiceManager + */ + public function setCanonicalNames($canonicalNames) + { + $this->canonicalNames = $canonicalNames; + + return $this; + } + + /** + * Attempt to retrieve an instance via a peering manager + * + * @param string $name + * @return mixed + */ + protected function retrieveFromPeeringManager($name) + { + if (null !== ($service = $this->loopPeeringServiceManagers($name))) { + return $service; + } + + $name = $this->canonicalizeName($name); + + if ($this->hasAlias($name)) { + do { + $name = $this->aliases[$name]; + } while ($this->hasAlias($name)); + } + + if (null !== ($service = $this->loopPeeringServiceManagers($name))) { + return $service; + } + + return; + } + + /** + * Loop over peering service managers. + * + * @param string $name + * @return mixed + */ + protected function loopPeeringServiceManagers($name) + { + $caller = $this->serviceManagerCaller; + + foreach ($this->peeringServiceManagers as $peeringServiceManager) { + // ignore peering service manager if they are the same instance + if ($caller === $peeringServiceManager) { + continue; + } + + // pass this instance to peering service manager + $peeringServiceManager->serviceManagerCaller = $this; + + if ($peeringServiceManager->has($name)) { + $this->shared[$name] = $peeringServiceManager->isShared($name); + $instance = $peeringServiceManager->get($name); + $peeringServiceManager->serviceManagerCaller = null; + return $instance; + } + + $peeringServiceManager->serviceManagerCaller = null; + } + + return; + } + + /** + * Attempt to create an instance via an invokable class + * + * @param string $canonicalName + * @param string $requestedName + * @return null|\stdClass + * @throws Exception\ServiceNotFoundException If resolved class does not exist + */ + protected function createFromInvokable($canonicalName, $requestedName) + { + $invokable = $this->invokableClasses[$canonicalName]; + if (!class_exists($invokable)) { + throw new Exception\ServiceNotFoundException(sprintf( + '%s: failed retrieving "%s%s" via invokable class "%s"; class does not exist', + get_class($this) . '::' . __FUNCTION__, + $canonicalName, + ($requestedName ? '(alias: ' . $requestedName . ')' : ''), + $invokable + )); + } + $instance = new $invokable; + return $instance; + } + + /** + * Attempt to create an instance via a factory + * + * @param string $canonicalName + * @param string $requestedName + * @return mixed + * @throws Exception\ServiceNotCreatedException If factory is not callable + */ + protected function createFromFactory($canonicalName, $requestedName) + { + $factory = $this->factories[$canonicalName]; + if (is_string($factory) && class_exists($factory, true)) { + $factory = new $factory; + $this->factories[$canonicalName] = $factory; + } + if ($factory instanceof FactoryInterface) { + $instance = $this->createServiceViaCallback([$factory, 'createService'], $canonicalName, $requestedName); + } elseif (is_callable($factory)) { + $instance = $this->createServiceViaCallback($factory, $canonicalName, $requestedName); + } else { + throw new Exception\ServiceNotCreatedException(sprintf( + 'While attempting to create %s%s an invalid factory was registered for this instance type.', + $canonicalName, + ($requestedName ? '(alias: ' . $requestedName . ')' : '') + )); + } + return $instance; + } + + /** + * Attempt to create an instance via an abstract factory + * + * @param string $canonicalName + * @param string $requestedName + * @return object|null + * @throws Exception\ServiceNotCreatedException If abstract factory is not callable + */ + protected function createFromAbstractFactory($canonicalName, $requestedName) + { + if (isset($this->nestedContext[$canonicalName])) { + $abstractFactory = $this->nestedContext[$canonicalName]; + $pendingKey = get_class($abstractFactory).$canonicalName; + try { + $this->pendingAbstractFactoryRequests[$pendingKey] = true; + $instance = $this->createServiceViaCallback( + [$abstractFactory, 'createServiceWithName'], + $canonicalName, + $requestedName + ); + unset($this->pendingAbstractFactoryRequests[$pendingKey]); + return $instance; + } catch (\Exception $e) { + unset($this->pendingAbstractFactoryRequests[$pendingKey]); + $this->checkNestedContextStop(true); + throw new Exception\ServiceNotCreatedException( + sprintf( + 'An abstract factory could not create an instance of %s%s.', + $canonicalName, + ($requestedName ? '(alias: ' . $requestedName . ')' : '') + ), + $e->getCode(), + $e + ); + } + } + return; + } + + /** + * + * @param string $cName + * @return self + */ + protected function checkNestedContextStart($cName) + { + if ($this->nestedContextCounter === -1 || !isset($this->nestedContext[$cName])) { + $this->nestedContext[$cName] = null; + } + $this->nestedContextCounter++; + return $this; + } + + /** + * + * @param bool $force + * @return self + */ + protected function checkNestedContextStop($force = false) + { + if ($force) { + $this->nestedContextCounter = -1; + $this->nestedContext = []; + return $this; + } + + $this->nestedContextCounter--; + if ($this->nestedContextCounter === -1) { + $this->nestedContext = []; + } + return $this; + } + + /** + * @param $canonicalName + * @param $requestedName + * @return mixed + * @throws Exception\ServiceNotCreatedException + */ + protected function createDelegatorFromFactory($canonicalName, $requestedName) + { + $delegatorsCount = count($this->delegators[$canonicalName]); + $creationCallback = function () use ($requestedName, $canonicalName) { + return $this->doCreate($requestedName, $canonicalName); + }; + + for ($i = 0; $i < $delegatorsCount; $i += 1) { + $delegatorFactory = $this->delegators[$canonicalName][$i]; + + if (is_string($delegatorFactory)) { + $delegatorFactory = !$this->has($delegatorFactory) && class_exists($delegatorFactory, true) ? + new $delegatorFactory + : $this->get($delegatorFactory); + $this->delegators[$canonicalName][$i] = $delegatorFactory; + } + + if (!$delegatorFactory instanceof DelegatorFactoryInterface && !is_callable($delegatorFactory)) { + throw new Exception\ServiceNotCreatedException(sprintf( + 'While attempting to create %s%s an invalid factory was registered for this instance type.', + $canonicalName, + ($requestedName ? '(alias: ' . $requestedName . ')' : '') + )); + } + + $creationCallback = $this->createDelegatorCallback( + $delegatorFactory, + $requestedName, + $canonicalName, + $creationCallback + ); + } + + return $creationCallback($this, $canonicalName, $requestedName, $creationCallback); + } + + /** + * Checks if the object has this class as one of its parents + * + * @see https://bugs.php.net/bug.php?id=53727 + * @see https://github.com/zendframework/zf2/pull/1807 + * + * @deprecated since zf 2.3 requires PHP >= 5.3.23 + * + * @param string $className + * @param string $type + * @return bool + * + * @deprecated this method is being deprecated as of zendframework 2.2, and may be removed in future major versions + */ + protected static function isSubclassOf($className, $type) + { + return is_subclass_of($className, $type); + } + + /** + * Unregister a service + * + * Called when $allowOverride is true and we detect that a service being + * added to the instance already exists. This will remove the duplicate + * entry, and also any shared flags previously registered. + * + * @param string $canonical + * @return void + */ + protected function unregisterService($canonical) + { + $types = ['invokableClasses', 'factories', 'aliases']; + foreach ($types as $type) { + if (isset($this->{$type}[$canonical])) { + unset($this->{$type}[$canonical]); + break; + } + } + + if (isset($this->instances[$canonical])) { + unset($this->instances[$canonical]); + } + + if (isset($this->shared[$canonical])) { + unset($this->shared[$canonical]); + } + } +} diff --git a/vendor/Zend/ServiceManager/ServiceManagerAwareInterface.php b/vendor/Zend/ServiceManager/ServiceManagerAwareInterface.php new file mode 100644 index 0000000..2519bba --- /dev/null +++ b/vendor/Zend/ServiceManager/ServiceManagerAwareInterface.php @@ -0,0 +1,20 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\ServiceManager; + +interface ServiceManagerAwareInterface +{ + /** + * Set service manager + * + * @param ServiceManager $serviceManager + */ + public function setServiceManager(ServiceManager $serviceManager); +} diff --git a/vendor/Zend/ServiceManager/Test/CommonPluginManagerTrait.php b/vendor/Zend/ServiceManager/Test/CommonPluginManagerTrait.php new file mode 100644 index 0000000..4ce3849 --- /dev/null +++ b/vendor/Zend/ServiceManager/Test/CommonPluginManagerTrait.php @@ -0,0 +1,116 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2016 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\ServiceManager\Test; + +use ReflectionClass; +use ReflectionProperty; +use Zend\ServiceManager\Exception\InvalidServiceException; + +/** + * Trait for testing plugin managers for v2-v3 compatibility + * + * To use this trait: + * * implement the `getPluginManager()` method to return your plugin manager + * * implement the `getV2InvalidPluginException()` method to return the class `validatePlugin()` throws under v2 + */ +trait CommonPluginManagerTrait +{ + public function testInstanceOfMatches() + { + $manager = $this->getPluginManager(); + $reflection = new ReflectionProperty($manager, 'instanceOf'); + $reflection->setAccessible(true); + $this->assertEquals($this->getInstanceOf(), $reflection->getValue($manager), 'instanceOf does not match'); + } + + public function testShareByDefaultAndSharedByDefault() + { + $manager = $this->getPluginManager(); + $reflection = new ReflectionClass($manager); + $shareByDefault = $sharedByDefault = true; + + foreach ($reflection->getProperties() as $prop) { + if ($prop->getName() == 'shareByDefault') { + $prop->setAccessible(true); + $shareByDefault = $prop->getValue($manager); + } + if ($prop->getName() == 'sharedByDefault') { + $prop->setAccessible(true); + $sharedByDefault = $prop->getValue($manager); + } + } + + $this->assertTrue( + $shareByDefault == $sharedByDefault, + 'Values of shareByDefault and sharedByDefault do not match' + ); + } + + public function testRegisteringInvalidElementRaisesException() + { + $this->setExpectedException($this->getServiceNotFoundException()); + $this->getPluginManager()->setService('test', $this); + } + + public function testLoadingInvalidElementRaisesException() + { + $manager = $this->getPluginManager(); + $manager->setInvokableClass('test', get_class($this)); + $this->setExpectedException($this->getServiceNotFoundException()); + $manager->get('test'); + } + + /** + * @dataProvider aliasProvider + */ + public function testPluginAliasesResolve($alias, $expected) + { + $this->assertInstanceOf($expected, $this->getPluginManager()->get($alias), "Alias '$alias' does not resolve'"); + } + + public function aliasProvider() + { + $manager = $this->getPluginManager(); + $reflection = new ReflectionProperty($manager, 'aliases'); + $reflection->setAccessible(true); + $data = []; + foreach ($reflection->getValue($manager) as $alias => $expected) { + $data[] = [$alias, $expected]; + } + return $data; + } + + protected function getServiceNotFoundException() + { + $manager = $this->getPluginManager(); + if (method_exists($manager, 'configure')) { + return InvalidServiceException::class; + } + return $this->getV2InvalidPluginException(); + } + + /** + * Returns the plugin manager to test + * @return \Zend\ServiceManager\AbstractPluginManager + */ + abstract protected function getPluginManager(); + + /** + * Returns the FQCN of the exception thrown under v2 by `validatePlugin()` + * @return mixed + */ + abstract protected function getV2InvalidPluginException(); + + /** + * Returns the value the instanceOf property has been set to + * @return string + */ + abstract protected function getInstanceOf(); +} diff --git a/vendor/Zend/Stdlib/AbstractOptions.php b/vendor/Zend/Stdlib/AbstractOptions.php new file mode 100644 index 0000000..812e1ca --- /dev/null +++ b/vendor/Zend/Stdlib/AbstractOptions.php @@ -0,0 +1,176 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib; + +use Traversable; + +abstract class AbstractOptions implements ParameterObjectInterface +{ + /** + * We use the __ prefix to avoid collisions with properties in + * user-implementations. + * + * @var bool + */ + protected $__strictMode__ = true; + + /** + * Constructor + * + * @param array|Traversable|null $options + */ + public function __construct($options = null) + { + if (null !== $options) { + $this->setFromArray($options); + } + } + + /** + * Set one or more configuration properties + * + * @param array|Traversable|AbstractOptions $options + * @throws Exception\InvalidArgumentException + * @return AbstractOptions Provides fluent interface + */ + public function setFromArray($options) + { + if ($options instanceof self) { + $options = $options->toArray(); + } + + if (!is_array($options) && !$options instanceof Traversable) { + throw new Exception\InvalidArgumentException( + sprintf( + 'Parameter provided to %s must be an %s, %s or %s', + __METHOD__, + 'array', + 'Traversable', + 'Zend\Stdlib\AbstractOptions' + ) + ); + } + + foreach ($options as $key => $value) { + $this->__set($key, $value); + } + + return $this; + } + + /** + * Cast to array + * + * @return array + */ + public function toArray() + { + $array = []; + $transform = function ($letters) { + $letter = array_shift($letters); + return '_' . strtolower($letter); + }; + foreach ($this as $key => $value) { + if ($key === '__strictMode__') { + continue; + } + $normalizedKey = preg_replace_callback('/([A-Z])/', $transform, $key); + $array[$normalizedKey] = $value; + } + return $array; + } + + /** + * Set a configuration property + * + * @see ParameterObject::__set() + * @param string $key + * @param mixed $value + * @throws Exception\BadMethodCallException + * @return void + */ + public function __set($key, $value) + { + $setter = 'set' . str_replace('_', '', $key); + + if (is_callable([$this, $setter])) { + $this->{$setter}($value); + + return; + } + + if ($this->__strictMode__) { + throw new Exception\BadMethodCallException(sprintf( + 'The option "%s" does not have a callable "%s" ("%s") setter method which must be defined', + $key, + 'set' . str_replace(' ', '', ucwords(str_replace('_', ' ', $key))), + $setter + )); + } + } + + /** + * Get a configuration property + * + * @see ParameterObject::__get() + * @param string $key + * @throws Exception\BadMethodCallException + * @return mixed + */ + public function __get($key) + { + $getter = 'get' . str_replace('_', '', $key); + + if (is_callable([$this, $getter])) { + return $this->{$getter}(); + } + + throw new Exception\BadMethodCallException(sprintf( + 'The option "%s" does not have a callable "%s" getter method which must be defined', + $key, + 'get' . str_replace(' ', '', ucwords(str_replace('_', ' ', $key))) + )); + } + + /** + * Test if a configuration property is null + * @see ParameterObject::__isset() + * @param string $key + * @return bool + */ + public function __isset($key) + { + $getter = 'get' . str_replace('_', '', $key); + + return method_exists($this, $getter) && null !== $this->__get($key); + } + + /** + * Set a configuration property to NULL + * + * @see ParameterObject::__unset() + * @param string $key + * @throws Exception\InvalidArgumentException + * @return void + */ + public function __unset($key) + { + try { + $this->__set($key, null); + } catch (Exception\BadMethodCallException $e) { + throw new Exception\InvalidArgumentException( + 'The class property $' . $key . ' cannot be unset as' + . ' NULL is an invalid value for it', + 0, + $e + ); + } + } +} diff --git a/vendor/Zend/Stdlib/ArrayObject.php b/vendor/Zend/Stdlib/ArrayObject.php new file mode 100644 index 0000000..e890084 --- /dev/null +++ b/vendor/Zend/Stdlib/ArrayObject.php @@ -0,0 +1,432 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib; + +use ArrayAccess; +use Countable; +use IteratorAggregate; +use Serializable; + +/** + * Custom framework ArrayObject implementation + * + * Extends version-specific "abstract" implementation. + */ +class ArrayObject implements IteratorAggregate, ArrayAccess, Serializable, Countable +{ + /** + * Properties of the object have their normal functionality + * when accessed as list (var_dump, foreach, etc.). + */ + const STD_PROP_LIST = 1; + + /** + * Entries can be accessed as properties (read and write). + */ + const ARRAY_AS_PROPS = 2; + + /** + * @var array + */ + protected $storage; + + /** + * @var int + */ + protected $flag; + + /** + * @var string + */ + protected $iteratorClass; + + /** + * @var array + */ + protected $protectedProperties; + + /** + * Constructor + * + * @param array $input + * @param int $flags + * @param string $iteratorClass + */ + public function __construct($input = [], $flags = self::STD_PROP_LIST, $iteratorClass = 'ArrayIterator') + { + $this->setFlags($flags); + $this->storage = $input; + $this->setIteratorClass($iteratorClass); + $this->protectedProperties = array_keys(get_object_vars($this)); + } + + /** + * Returns whether the requested key exists + * + * @param mixed $key + * @return bool + */ + public function __isset($key) + { + if ($this->flag == self::ARRAY_AS_PROPS) { + return $this->offsetExists($key); + } + if (in_array($key, $this->protectedProperties)) { + throw new Exception\InvalidArgumentException('$key is a protected property, use a different key'); + } + + return isset($this->$key); + } + + /** + * Sets the value at the specified key to value + * + * @param mixed $key + * @param mixed $value + * @return void + */ + public function __set($key, $value) + { + if ($this->flag == self::ARRAY_AS_PROPS) { + return $this->offsetSet($key, $value); + } + if (in_array($key, $this->protectedProperties)) { + throw new Exception\InvalidArgumentException('$key is a protected property, use a different key'); + } + $this->$key = $value; + } + + /** + * Unsets the value at the specified key + * + * @param mixed $key + * @return void + */ + public function __unset($key) + { + if ($this->flag == self::ARRAY_AS_PROPS) { + return $this->offsetUnset($key); + } + if (in_array($key, $this->protectedProperties)) { + throw new Exception\InvalidArgumentException('$key is a protected property, use a different key'); + } + unset($this->$key); + } + + /** + * Returns the value at the specified key by reference + * + * @param mixed $key + * @return mixed + */ + public function &__get($key) + { + $ret = null; + if ($this->flag == self::ARRAY_AS_PROPS) { + $ret =& $this->offsetGet($key); + + return $ret; + } + if (in_array($key, $this->protectedProperties)) { + throw new Exception\InvalidArgumentException('$key is a protected property, use a different key'); + } + + return $this->$key; + } + + /** + * Appends the value + * + * @param mixed $value + * @return void + */ + public function append($value) + { + $this->storage[] = $value; + } + + /** + * Sort the entries by value + * + * @return void + */ + public function asort() + { + asort($this->storage); + } + + /** + * Get the number of public properties in the ArrayObject + * + * @return int + */ + public function count() + { + return count($this->storage); + } + + /** + * Exchange the array for another one. + * + * @param array|ArrayObject $data + * @return array + */ + public function exchangeArray($data) + { + if (!is_array($data) && !is_object($data)) { + throw new Exception\InvalidArgumentException('Passed variable is not an array or object, using empty array instead'); + } + + if (is_object($data) && ($data instanceof self || $data instanceof \ArrayObject)) { + $data = $data->getArrayCopy(); + } + if (!is_array($data)) { + $data = (array) $data; + } + + $storage = $this->storage; + + $this->storage = $data; + + return $storage; + } + + /** + * Creates a copy of the ArrayObject. + * + * @return array + */ + public function getArrayCopy() + { + return $this->storage; + } + + /** + * Gets the behavior flags. + * + * @return int + */ + public function getFlags() + { + return $this->flag; + } + + /** + * Create a new iterator from an ArrayObject instance + * + * @return \Iterator + */ + public function getIterator() + { + $class = $this->iteratorClass; + + return new $class($this->storage); + } + + /** + * Gets the iterator classname for the ArrayObject. + * + * @return string + */ + public function getIteratorClass() + { + return $this->iteratorClass; + } + + /** + * Sort the entries by key + * + * @return void + */ + public function ksort() + { + ksort($this->storage); + } + + /** + * Sort an array using a case insensitive "natural order" algorithm + * + * @return void + */ + public function natcasesort() + { + natcasesort($this->storage); + } + + /** + * Sort entries using a "natural order" algorithm + * + * @return void + */ + public function natsort() + { + natsort($this->storage); + } + + /** + * Returns whether the requested key exists + * + * @param mixed $key + * @return bool + */ + public function offsetExists($key) + { + return isset($this->storage[$key]); + } + + /** + * Returns the value at the specified key + * + * @param mixed $key + * @return mixed + */ + public function &offsetGet($key) + { + $ret = null; + if (!$this->offsetExists($key)) { + return $ret; + } + $ret =& $this->storage[$key]; + + return $ret; + } + + /** + * Sets the value at the specified key to value + * + * @param mixed $key + * @param mixed $value + * @return void + */ + public function offsetSet($key, $value) + { + $this->storage[$key] = $value; + } + + /** + * Unsets the value at the specified key + * + * @param mixed $key + * @return void + */ + public function offsetUnset($key) + { + if ($this->offsetExists($key)) { + unset($this->storage[$key]); + } + } + + /** + * Serialize an ArrayObject + * + * @return string + */ + public function serialize() + { + return serialize(get_object_vars($this)); + } + + /** + * Sets the behavior flags + * + * @param int $flags + * @return void + */ + public function setFlags($flags) + { + $this->flag = $flags; + } + + /** + * Sets the iterator classname for the ArrayObject + * + * @param string $class + * @return void + */ + public function setIteratorClass($class) + { + if (class_exists($class)) { + $this->iteratorClass = $class; + + return ; + } + + if (strpos($class, '\\') === 0) { + $class = '\\' . $class; + if (class_exists($class)) { + $this->iteratorClass = $class; + + return ; + } + } + + throw new Exception\InvalidArgumentException('The iterator class does not exist'); + } + + /** + * Sort the entries with a user-defined comparison function and maintain key association + * + * @param callable $function + * @return void + */ + public function uasort($function) + { + if (is_callable($function)) { + uasort($this->storage, $function); + } + } + + /** + * Sort the entries by keys using a user-defined comparison function + * + * @param callable $function + * @return void + */ + public function uksort($function) + { + if (is_callable($function)) { + uksort($this->storage, $function); + } + } + + /** + * Unserialize an ArrayObject + * + * @param string $data + * @return void + */ + public function unserialize($data) + { + $ar = unserialize($data); + $this->protectedProperties = array_keys(get_object_vars($this)); + + $this->setFlags($ar['flag']); + $this->exchangeArray($ar['storage']); + $this->setIteratorClass($ar['iteratorClass']); + + foreach ($ar as $k => $v) { + switch ($k) { + case 'flag': + $this->setFlags($v); + break; + case 'storage': + $this->exchangeArray($v); + break; + case 'iteratorClass': + $this->setIteratorClass($v); + break; + case 'protectedProperties': + continue; + default: + $this->__set($k, $v); + } + } + } +} diff --git a/vendor/Zend/Stdlib/ArraySerializableInterface.php b/vendor/Zend/Stdlib/ArraySerializableInterface.php new file mode 100644 index 0000000..dcf8471 --- /dev/null +++ b/vendor/Zend/Stdlib/ArraySerializableInterface.php @@ -0,0 +1,28 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib; + +interface ArraySerializableInterface +{ + /** + * Exchange internal values from provided array + * + * @param array $array + * @return void + */ + public function exchangeArray(array $array); + + /** + * Return an array representation of the object + * + * @return array + */ + public function getArrayCopy(); +} diff --git a/vendor/Zend/Stdlib/ArrayStack.php b/vendor/Zend/Stdlib/ArrayStack.php new file mode 100644 index 0000000..39d02aa --- /dev/null +++ b/vendor/Zend/Stdlib/ArrayStack.php @@ -0,0 +1,33 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib; + +use ArrayIterator; +use ArrayObject as PhpArrayObject; + +/** + * ArrayObject that acts as a stack with regards to iteration + */ +class ArrayStack extends PhpArrayObject +{ + /** + * Retrieve iterator + * + * Retrieve an array copy of the object, reverse its order, and return an + * ArrayIterator with that reversed array. + * + * @return ArrayIterator + */ + public function getIterator() + { + $array = $this->getArrayCopy(); + return new ArrayIterator(array_reverse($array)); + } +} diff --git a/vendor/Zend/Stdlib/ArrayUtils.php b/vendor/Zend/Stdlib/ArrayUtils.php new file mode 100644 index 0000000..17e3ae3 --- /dev/null +++ b/vendor/Zend/Stdlib/ArrayUtils.php @@ -0,0 +1,335 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib; + +use Traversable; +use Zend\Stdlib\ArrayUtils\MergeRemoveKey; +use Zend\Stdlib\ArrayUtils\MergeReplaceKeyInterface; + +/** + * Utility class for testing and manipulation of PHP arrays. + * + * Declared abstract, as we have no need for instantiation. + */ +abstract class ArrayUtils +{ + /** + * Compatibility Flag for ArrayUtils::filter + */ + const ARRAY_FILTER_USE_BOTH = 1; + + /** + * Compatibility Flag for ArrayUtils::filter + */ + const ARRAY_FILTER_USE_KEY = 2; + + /** + * Test whether an array contains one or more string keys + * + * @param mixed $value + * @param bool $allowEmpty Should an empty array() return true + * @return bool + */ + public static function hasStringKeys($value, $allowEmpty = false) + { + if (!is_array($value)) { + return false; + } + + if (!$value) { + return $allowEmpty; + } + + return count(array_filter(array_keys($value), 'is_string')) > 0; + } + + /** + * Test whether an array contains one or more integer keys + * + * @param mixed $value + * @param bool $allowEmpty Should an empty array() return true + * @return bool + */ + public static function hasIntegerKeys($value, $allowEmpty = false) + { + if (!is_array($value)) { + return false; + } + + if (!$value) { + return $allowEmpty; + } + + return count(array_filter(array_keys($value), 'is_int')) > 0; + } + + /** + * Test whether an array contains one or more numeric keys. + * + * A numeric key can be one of the following: + * - an integer 1, + * - a string with a number '20' + * - a string with negative number: '-1000' + * - a float: 2.2120, -78.150999 + * - a string with float: '4000.99999', '-10.10' + * + * @param mixed $value + * @param bool $allowEmpty Should an empty array() return true + * @return bool + */ + public static function hasNumericKeys($value, $allowEmpty = false) + { + if (!is_array($value)) { + return false; + } + + if (!$value) { + return $allowEmpty; + } + + return count(array_filter(array_keys($value), 'is_numeric')) > 0; + } + + /** + * Test whether an array is a list + * + * A list is a collection of values assigned to continuous integer keys + * starting at 0 and ending at count() - 1. + * + * For example: + * <code> + * $list = array('a', 'b', 'c', 'd'); + * $list = array( + * 0 => 'foo', + * 1 => 'bar', + * 2 => array('foo' => 'baz'), + * ); + * </code> + * + * @param mixed $value + * @param bool $allowEmpty Is an empty list a valid list? + * @return bool + */ + public static function isList($value, $allowEmpty = false) + { + if (!is_array($value)) { + return false; + } + + if (!$value) { + return $allowEmpty; + } + + return (array_values($value) === $value); + } + + /** + * Test whether an array is a hash table. + * + * An array is a hash table if: + * + * 1. Contains one or more non-integer keys, or + * 2. Integer keys are non-continuous or misaligned (not starting with 0) + * + * For example: + * <code> + * $hash = array( + * 'foo' => 15, + * 'bar' => false, + * ); + * $hash = array( + * 1995 => 'Birth of PHP', + * 2009 => 'PHP 5.3.0', + * 2012 => 'PHP 5.4.0', + * ); + * $hash = array( + * 'formElement, + * 'options' => array( 'debug' => true ), + * ); + * </code> + * + * @param mixed $value + * @param bool $allowEmpty Is an empty array() a valid hash table? + * @return bool + */ + public static function isHashTable($value, $allowEmpty = false) + { + if (!is_array($value)) { + return false; + } + + if (!$value) { + return $allowEmpty; + } + + return (array_values($value) !== $value); + } + + /** + * Checks if a value exists in an array. + * + * Due to "foo" == 0 === TRUE with in_array when strict = false, an option + * has been added to prevent this. When $strict = 0/false, the most secure + * non-strict check is implemented. if $strict = -1, the default in_array + * non-strict behaviour is used. + * + * @param mixed $needle + * @param array $haystack + * @param int|bool $strict + * @return bool + */ + public static function inArray($needle, array $haystack, $strict = false) + { + if (!$strict) { + if (is_int($needle) || is_float($needle)) { + $needle = (string) $needle; + } + if (is_string($needle)) { + foreach ($haystack as &$h) { + if (is_int($h) || is_float($h)) { + $h = (string) $h; + } + } + } + } + return in_array($needle, $haystack, $strict); + } + + /** + * Convert an iterator to an array. + * + * Converts an iterator to an array. The $recursive flag, on by default, + * hints whether or not you want to do so recursively. + * + * @param array|Traversable $iterator The array or Traversable object to convert + * @param bool $recursive Recursively check all nested structures + * @throws Exception\InvalidArgumentException if $iterator is not an array or a Traversable object + * @return array + */ + public static function iteratorToArray($iterator, $recursive = true) + { + if (!is_array($iterator) && !$iterator instanceof Traversable) { + throw new Exception\InvalidArgumentException(__METHOD__ . ' expects an array or Traversable object'); + } + + if (!$recursive) { + if (is_array($iterator)) { + return $iterator; + } + + return iterator_to_array($iterator); + } + + if (method_exists($iterator, 'toArray')) { + return $iterator->toArray(); + } + + $array = []; + foreach ($iterator as $key => $value) { + if (is_scalar($value)) { + $array[$key] = $value; + continue; + } + + if ($value instanceof Traversable) { + $array[$key] = static::iteratorToArray($value, $recursive); + continue; + } + + if (is_array($value)) { + $array[$key] = static::iteratorToArray($value, $recursive); + continue; + } + + $array[$key] = $value; + } + + return $array; + } + + /** + * Merge two arrays together. + * + * If an integer key exists in both arrays and preserveNumericKeys is false, the value + * from the second array will be appended to the first array. If both values are arrays, they + * are merged together, else the value of the second array overwrites the one of the first array. + * + * @param array $a + * @param array $b + * @param bool $preserveNumericKeys + * @return array + */ + public static function merge(array $a, array $b, $preserveNumericKeys = false) + { + foreach ($b as $key => $value) { + if ($value instanceof MergeReplaceKeyInterface) { + $a[$key] = $value->getData(); + } elseif (isset($a[$key]) || array_key_exists($key, $a)) { + if ($value instanceof MergeRemoveKey) { + unset($a[$key]); + } elseif (!$preserveNumericKeys && is_int($key)) { + $a[] = $value; + } elseif (is_array($value) && is_array($a[$key])) { + $a[$key] = static::merge($a[$key], $value, $preserveNumericKeys); + } else { + $a[$key] = $value; + } + } else { + if (!$value instanceof MergeRemoveKey) { + $a[$key] = $value; + } + } + } + + return $a; + } + + /** + * Compatibility Method for array_filter on <5.6 systems + * + * @param array $data + * @param callable $callback + * @param null|int $flag + * @return array + */ + public static function filter(array $data, $callback, $flag = null) + { + if (! is_callable($callback)) { + throw new Exception\InvalidArgumentException(sprintf( + 'Second parameter of %s must be callable', + __METHOD__ + )); + } + + if (version_compare(PHP_VERSION, '5.6.0') >= 0) { + return array_filter($data, $callback, $flag); + } + + $output = []; + foreach ($data as $key => $value) { + $params = [$value]; + + if ($flag === static::ARRAY_FILTER_USE_BOTH) { + $params[] = $key; + } + + if ($flag === static::ARRAY_FILTER_USE_KEY) { + $params = [$key]; + } + + $response = call_user_func_array($callback, $params); + if ($response) { + $output[$key] = $value; + } + } + + return $output; + } +} diff --git a/vendor/Zend/Stdlib/ArrayUtils/MergeRemoveKey.php b/vendor/Zend/Stdlib/ArrayUtils/MergeRemoveKey.php new file mode 100644 index 0000000..7c4d097 --- /dev/null +++ b/vendor/Zend/Stdlib/ArrayUtils/MergeRemoveKey.php @@ -0,0 +1,14 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\ArrayUtils; + +final class MergeRemoveKey +{ +} diff --git a/vendor/Zend/Stdlib/ArrayUtils/MergeReplaceKey.php b/vendor/Zend/Stdlib/ArrayUtils/MergeReplaceKey.php new file mode 100644 index 0000000..24c1df4 --- /dev/null +++ b/vendor/Zend/Stdlib/ArrayUtils/MergeReplaceKey.php @@ -0,0 +1,34 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\ArrayUtils; + +final class MergeReplaceKey implements MergeReplaceKeyInterface +{ + /** + * @var mixed + */ + protected $data; + + /** + * @param mixed $data + */ + public function __construct($data) + { + $this->data = $data; + } + + /** + * {@inheritDoc} + */ + public function getData() + { + return $this->data; + } +} diff --git a/vendor/Zend/Stdlib/ArrayUtils/MergeReplaceKeyInterface.php b/vendor/Zend/Stdlib/ArrayUtils/MergeReplaceKeyInterface.php new file mode 100644 index 0000000..725cf11 --- /dev/null +++ b/vendor/Zend/Stdlib/ArrayUtils/MergeReplaceKeyInterface.php @@ -0,0 +1,21 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\ArrayUtils; + +/** + * Marker interface: can be used to replace keys completely in {@see ArrayUtils::merge()} operations + */ +interface MergeReplaceKeyInterface +{ + /** + * @return mixed + */ + public function getData(); +} diff --git a/vendor/Zend/Stdlib/CallbackHandler.php b/vendor/Zend/Stdlib/CallbackHandler.php new file mode 100644 index 0000000..dc9bfd5 --- /dev/null +++ b/vendor/Zend/Stdlib/CallbackHandler.php @@ -0,0 +1,197 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib; + +use ReflectionClass; + +/** + * CallbackHandler + * + * A handler for an event, event, filterchain, etc. Abstracts PHP callbacks, + * primarily to allow for lazy-loading and ensuring availability of default + * arguments (currying). + * + * This was primarily used in zend-eventmanager for managing listeners; as that + * component removes its usage of this class for v3, it is deprecated. + * + * @deprecated as of v2.7.4. + */ +class CallbackHandler +{ + /** + * @var string|array|callable PHP callback to invoke + */ + protected $callback; + + /** + * Callback metadata, if any + * @var array + */ + protected $metadata; + + /** + * Constructor + * + * @param string|array|object|callable $callback PHP callback + * @param array $metadata Callback metadata + */ + public function __construct($callback, array $metadata = []) + { + $this->metadata = $metadata; + $this->registerCallback($callback); + } + + /** + * Registers the callback provided in the constructor + * + * @param callable $callback + * @throws Exception\InvalidCallbackException + * @return void + */ + protected function registerCallback($callback) + { + if (!is_callable($callback)) { + throw new Exception\InvalidCallbackException('Invalid callback provided; not callable'); + } + + $this->callback = $callback; + } + + /** + * Retrieve registered callback + * + * @return callable + */ + public function getCallback() + { + return $this->callback; + } + + /** + * Invoke handler + * + * @param array $args Arguments to pass to callback + * @return mixed + */ + public function call(array $args = []) + { + $callback = $this->getCallback(); + $argCount = count($args); + + if (is_string($callback)) { + $result = $this->validateStringCallbackFor54($callback); + + if ($result !== true && $argCount <= 3) { + $callback = $result; + // Minor performance tweak, if the callback gets called more + // than once + $this->callback = $result; + } + } + + // Minor performance tweak; use call_user_func() until > 3 arguments + // reached + switch ($argCount) { + case 0: + return $callback(); + case 1: + return $callback(array_shift($args)); + case 2: + $arg1 = array_shift($args); + $arg2 = array_shift($args); + return $callback($arg1, $arg2); + case 3: + $arg1 = array_shift($args); + $arg2 = array_shift($args); + $arg3 = array_shift($args); + return $callback($arg1, $arg2, $arg3); + default: + return call_user_func_array($callback, $args); + } + } + + /** + * Invoke as functor + * + * @return mixed + */ + public function __invoke() + { + return $this->call(func_get_args()); + } + + /** + * Get all callback metadata + * + * @return array + */ + public function getMetadata() + { + return $this->metadata; + } + + /** + * Retrieve a single metadatum + * + * @param string $name + * @return mixed + */ + public function getMetadatum($name) + { + if (array_key_exists($name, $this->metadata)) { + return $this->metadata[$name]; + } + return; + } + + /** + * Validate a static method call + * + * + * @param string $callback + * @return true|array + * @throws Exception\InvalidCallbackException if invalid + */ + protected function validateStringCallbackFor54($callback) + { + if (!strstr($callback, '::')) { + return true; + } + + list($class, $method) = explode('::', $callback, 2); + + if (!class_exists($class)) { + throw new Exception\InvalidCallbackException(sprintf( + 'Static method call "%s" refers to a class that does not exist', + $callback + )); + } + + $r = new ReflectionClass($class); + if (!$r->hasMethod($method)) { + throw new Exception\InvalidCallbackException(sprintf( + 'Static method call "%s" refers to a method that does not exist', + $callback + )); + } + $m = $r->getMethod($method); + if (!$m->isStatic()) { + throw new Exception\InvalidCallbackException(sprintf( + 'Static method call "%s" refers to a method that is not static', + $callback + )); + } + + // returning a non boolean value may not be nice for a validate method, + // but that allows the usage of a static string callback without using + // the call_user_func function. + return [$class, $method]; + } +} diff --git a/vendor/Zend/Stdlib/DateTime.php b/vendor/Zend/Stdlib/DateTime.php new file mode 100644 index 0000000..cdab67d --- /dev/null +++ b/vendor/Zend/Stdlib/DateTime.php @@ -0,0 +1,47 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib; + +use DateTimeZone; + +trigger_error('DateTime extension deprecated as of ZF 2.1.4; use the \DateTime constructor to parse extended ISO8601 dates instead', E_USER_DEPRECATED); + +/** + * DateTime + * + * An extension of the \DateTime object. + * + * @deprecated + */ +class DateTime extends \DateTime +{ + /** + * The DateTime::ISO8601 constant used by php's native DateTime object does + * not allow for fractions of a second. This function better handles ISO8601 + * formatted date strings. + * + * @param string $time + * @param DateTimeZone $timezone + * @return mixed + */ + public static function createFromISO8601($time, DateTimeZone $timezone = null) + { + $format = self::ISO8601; + if (isset($time[19]) && $time[19] === '.') { + $format = 'Y-m-d\TH:i:s.uO'; + } + + if ($timezone !== null) { + return self::createFromFormat($format, $time, $timezone); + } + + return self::createFromFormat($format, $time); + } +} diff --git a/vendor/Zend/Stdlib/DispatchableInterface.php b/vendor/Zend/Stdlib/DispatchableInterface.php new file mode 100644 index 0000000..4f74d1e --- /dev/null +++ b/vendor/Zend/Stdlib/DispatchableInterface.php @@ -0,0 +1,22 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib; + +interface DispatchableInterface +{ + /** + * Dispatch a request + * + * @param RequestInterface $request + * @param null|ResponseInterface $response + * @return Response|mixed + */ + public function dispatch(RequestInterface $request, ResponseInterface $response = null); +} diff --git a/vendor/Zend/Stdlib/ErrorHandler.php b/vendor/Zend/Stdlib/ErrorHandler.php new file mode 100644 index 0000000..a849620 --- /dev/null +++ b/vendor/Zend/Stdlib/ErrorHandler.php @@ -0,0 +1,115 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib; + +use ErrorException; + +/** + * ErrorHandler that can be used to catch internal PHP errors + * and convert to an ErrorException instance. + */ +abstract class ErrorHandler +{ + /** + * Active stack + * + * @var array + */ + protected static $stack = []; + + /** + * Check if this error handler is active + * + * @return bool + */ + public static function started() + { + return (bool) static::getNestedLevel(); + } + + /** + * Get the current nested level + * + * @return int + */ + public static function getNestedLevel() + { + return count(static::$stack); + } + + /** + * Starting the error handler + * + * @param int $errorLevel + */ + public static function start($errorLevel = \E_WARNING) + { + if (!static::$stack) { + set_error_handler([get_called_class(), 'addError'], $errorLevel); + } + + static::$stack[] = null; + } + + /** + * Stopping the error handler + * + * @param bool $throw Throw the ErrorException if any + * @return null|ErrorException + * @throws ErrorException If an error has been catched and $throw is true + */ + public static function stop($throw = false) + { + $errorException = null; + + if (static::$stack) { + $errorException = array_pop(static::$stack); + + if (!static::$stack) { + restore_error_handler(); + } + + if ($errorException && $throw) { + throw $errorException; + } + } + + return $errorException; + } + + /** + * Stop all active handler + * + * @return void + */ + public static function clean() + { + if (static::$stack) { + restore_error_handler(); + } + + static::$stack = []; + } + + /** + * Add an error to the stack + * + * @param int $errno + * @param string $errstr + * @param string $errfile + * @param int $errline + * @return void + */ + public static function addError($errno, $errstr = '', $errfile = '', $errline = 0) + { + $stack = & static::$stack[count(static::$stack) - 1]; + $stack = new ErrorException($errstr, 0, $errno, $errfile, $errline, $stack); + } +} diff --git a/vendor/Zend/Stdlib/Exception/BadMethodCallException.php b/vendor/Zend/Stdlib/Exception/BadMethodCallException.php new file mode 100644 index 0000000..0254e45 --- /dev/null +++ b/vendor/Zend/Stdlib/Exception/BadMethodCallException.php @@ -0,0 +1,17 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Exception; + +/** + * Bad method call exception + */ +class BadMethodCallException extends \BadMethodCallException implements ExceptionInterface +{ +} diff --git a/vendor/Zend/Stdlib/Exception/DomainException.php b/vendor/Zend/Stdlib/Exception/DomainException.php new file mode 100644 index 0000000..6d2ac71 --- /dev/null +++ b/vendor/Zend/Stdlib/Exception/DomainException.php @@ -0,0 +1,17 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Exception; + +/** + * Domain exception + */ +class DomainException extends \DomainException implements ExceptionInterface +{ +} diff --git a/vendor/Zend/Stdlib/Exception/ExceptionInterface.php b/vendor/Zend/Stdlib/Exception/ExceptionInterface.php new file mode 100644 index 0000000..60b795f --- /dev/null +++ b/vendor/Zend/Stdlib/Exception/ExceptionInterface.php @@ -0,0 +1,17 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Exception; + +/** + * Exception marker interface + */ +interface ExceptionInterface +{ +} diff --git a/vendor/Zend/Stdlib/Exception/ExtensionNotLoadedException.php b/vendor/Zend/Stdlib/Exception/ExtensionNotLoadedException.php new file mode 100644 index 0000000..4b51475 --- /dev/null +++ b/vendor/Zend/Stdlib/Exception/ExtensionNotLoadedException.php @@ -0,0 +1,17 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Exception; + +/** + * Extension not loaded exception + */ +class ExtensionNotLoadedException extends RuntimeException +{ +} diff --git a/vendor/Zend/Stdlib/Exception/InvalidArgumentException.php b/vendor/Zend/Stdlib/Exception/InvalidArgumentException.php new file mode 100644 index 0000000..8028c47 --- /dev/null +++ b/vendor/Zend/Stdlib/Exception/InvalidArgumentException.php @@ -0,0 +1,17 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Exception; + +/** + * Invalid Argument Exception + */ +class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface +{ +} diff --git a/vendor/Zend/Stdlib/Exception/InvalidCallbackException.php b/vendor/Zend/Stdlib/Exception/InvalidCallbackException.php new file mode 100644 index 0000000..aa36f98 --- /dev/null +++ b/vendor/Zend/Stdlib/Exception/InvalidCallbackException.php @@ -0,0 +1,17 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Exception; + +/** + * Invalid callback exception + */ +class InvalidCallbackException extends DomainException implements ExceptionInterface +{ +} diff --git a/vendor/Zend/Stdlib/Exception/LogicException.php b/vendor/Zend/Stdlib/Exception/LogicException.php new file mode 100644 index 0000000..087ac0e --- /dev/null +++ b/vendor/Zend/Stdlib/Exception/LogicException.php @@ -0,0 +1,17 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Exception; + +/** + * Logic exception + */ +class LogicException extends \LogicException implements ExceptionInterface +{ +} diff --git a/vendor/Zend/Stdlib/Exception/RuntimeException.php b/vendor/Zend/Stdlib/Exception/RuntimeException.php new file mode 100644 index 0000000..f3891d6 --- /dev/null +++ b/vendor/Zend/Stdlib/Exception/RuntimeException.php @@ -0,0 +1,17 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Exception; + +/** + * Runtime exception + */ +class RuntimeException extends \RuntimeException implements ExceptionInterface +{ +} diff --git a/vendor/Zend/Stdlib/Extractor/ExtractionInterface.php b/vendor/Zend/Stdlib/Extractor/ExtractionInterface.php new file mode 100644 index 0000000..6c84720 --- /dev/null +++ b/vendor/Zend/Stdlib/Extractor/ExtractionInterface.php @@ -0,0 +1,19 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Extractor; + +use Zend\Hydrator\ExtractionInterface as BaseExtractionInterface; + +/** + * @deprecated Use Zend\Hydrator\ExtractionInterface from zendframework/zend-hydrator instead. + */ +interface ExtractionInterface extends BaseExtractionInterface +{ +} diff --git a/vendor/Zend/Stdlib/FastPriorityQueue.php b/vendor/Zend/Stdlib/FastPriorityQueue.php new file mode 100644 index 0000000..16d2bcc --- /dev/null +++ b/vendor/Zend/Stdlib/FastPriorityQueue.php @@ -0,0 +1,343 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib; + +use Iterator; +use Countable; +use Serializable; +use SplPriorityQueue as PhpSplPriorityQueue; + +/** + * This is an efficient implementation of an integer priority queue in PHP + * + * This class acts like a queue with insert() and extract(), removing the + * elements from the queue and it also acts like an Iterator without removing + * the elements. This behaviour can be used in mixed scenarios with high + * performance boost. + */ +class FastPriorityQueue implements Iterator, Countable, Serializable +{ + const EXTR_DATA = PhpSplPriorityQueue::EXTR_DATA; + const EXTR_PRIORITY = PhpSplPriorityQueue::EXTR_PRIORITY; + const EXTR_BOTH = PhpSplPriorityQueue::EXTR_BOTH; + + /** + * @var integer + */ + protected $extractFlag = self::EXTR_DATA; + + /** + * Elements of the queue, divided by priorities + * + * @var array + */ + protected $values = []; + + /** + * Array of priorities + * + * @var array + */ + protected $priorities = []; + + /** + * Array of priorities used for the iteration + * + * @var array + */ + protected $subPriorities = []; + + /** + * Max priority + * + * @var integer + */ + protected $maxPriority = 0; + + /** + * Total number of elements in the queue + * + * @var integer + */ + protected $count = 0; + + /** + * Index of the current element in the queue + * + * @var integer + */ + protected $index = 0; + + /** + * Sub index of the current element in the same priority level + * + * @var integer + */ + protected $subIndex = 0; + + /** + * Insert an element in the queue with a specified priority + * + * @param mixed $value + * @param integer $priority a positive integer + */ + public function insert($value, $priority) + { + if (! is_int($priority)) { + throw new Exception\InvalidArgumentException('The priority must be an integer'); + } + $this->values[$priority][] = $value; + if (! isset($this->priorities[$priority])) { + $this->priorities[$priority] = $priority; + $this->maxPriority = max($priority, $this->maxPriority); + } + ++$this->count; + } + + /** + * Extract an element in the queue according to the priority and the + * order of insertion + * + * @return mixed + */ + public function extract() + { + if (! $this->valid()) { + return false; + } + $value = $this->current(); + $this->nextAndRemove(); + return $value; + } + + /** + * Remove an item from the queue + * + * This is different than {@link extract()}; its purpose is to dequeue an + * item. + * + * Note: this removes the first item matching the provided item found. If + * the same item has been added multiple times, it will not remove other + * instances. + * + * @param mixed $datum + * @return bool False if the item was not found, true otherwise. + */ + public function remove($datum) + { + $this->rewind(); + while ($this->valid()) { + if (current($this->values[$this->maxPriority]) === $datum) { + $index = key($this->values[$this->maxPriority]); + unset($this->values[$this->maxPriority][$index]); + --$this->count; + return true; + } + $this->next(); + } + return false; + } + + /** + * Get the total number of elements in the queue + * + * @return integer + */ + public function count() + { + return $this->count; + } + + /** + * Get the current element in the queue + * + * @return mixed + */ + public function current() + { + switch ($this->extractFlag) { + case self::EXTR_DATA: + return current($this->values[$this->maxPriority]); + case self::EXTR_PRIORITY: + return $this->maxPriority; + case self::EXTR_BOTH: + return [ + 'data' => current($this->values[$this->maxPriority]), + 'priority' => $this->maxPriority + ]; + } + } + + /** + * Get the index of the current element in the queue + * + * @return integer + */ + public function key() + { + return $this->index; + } + + /** + * Set the iterator pointer to the next element in the queue + * removing the previous element + */ + protected function nextAndRemove() + { + if (false === next($this->values[$this->maxPriority])) { + unset($this->priorities[$this->maxPriority]); + unset($this->values[$this->maxPriority]); + $this->maxPriority = empty($this->priorities) ? 0 : max($this->priorities); + $this->subIndex = -1; + } + ++$this->index; + ++$this->subIndex; + --$this->count; + } + + /** + * Set the iterator pointer to the next element in the queue + * without removing the previous element + */ + public function next() + { + if (false === next($this->values[$this->maxPriority])) { + unset($this->subPriorities[$this->maxPriority]); + reset($this->values[$this->maxPriority]); + $this->maxPriority = empty($this->subPriorities) ? 0 : max($this->subPriorities); + $this->subIndex = -1; + } + ++$this->index; + ++$this->subIndex; + } + + /** + * Check if the current iterator is valid + * + * @return boolean + */ + public function valid() + { + return isset($this->values[$this->maxPriority]); + } + + /** + * Rewind the current iterator + */ + public function rewind() + { + $this->subPriorities = $this->priorities; + $this->maxPriority = empty($this->priorities) ? 0 : max($this->priorities); + $this->index = 0; + $this->subIndex = 0; + } + + /** + * Serialize to an array + * + * Array will be priority => data pairs + * + * @return array + */ + public function toArray() + { + $array = []; + foreach (clone $this as $item) { + $array[] = $item; + } + return $array; + } + + /** + * Serialize + * + * @return string + */ + public function serialize() + { + $clone = clone $this; + $clone->setExtractFlags(self::EXTR_BOTH); + + $data = []; + foreach ($clone as $item) { + $data[] = $item; + } + + return serialize($data); + } + + /** + * Deserialize + * + * @param string $data + * @return void + */ + public function unserialize($data) + { + foreach (unserialize($data) as $item) { + $this->insert($item['data'], $item['priority']); + } + } + + /** + * Set the extract flag + * + * @param integer $flag + */ + public function setExtractFlags($flag) + { + switch ($flag) { + case self::EXTR_DATA: + case self::EXTR_PRIORITY: + case self::EXTR_BOTH: + $this->extractFlag = $flag; + break; + default: + throw new Exception\InvalidArgumentException("The extract flag specified is not valid"); + } + } + + /** + * Check if the queue is empty + * + * @return boolean + */ + public function isEmpty() + { + return empty($this->values); + } + + /** + * Does the queue contain the given datum? + * + * @param mixed $datum + * @return bool + */ + public function contains($datum) + { + foreach ($this->values as $values) { + if (in_array($datum, $values)) { + return true; + } + } + return false; + } + + /** + * Does the queue have an item with the given priority? + * + * @param int $priority + * @return bool + */ + public function hasPriority($priority) + { + return isset($this->values[$priority]); + } +} diff --git a/vendor/Zend/Stdlib/Glob.php b/vendor/Zend/Stdlib/Glob.php new file mode 100644 index 0000000..dc37562 --- /dev/null +++ b/vendor/Zend/Stdlib/Glob.php @@ -0,0 +1,202 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib; + +/** + * Wrapper for glob with fallback if GLOB_BRACE is not available. + */ +abstract class Glob +{ + /**#@+ + * Glob constants. + */ + const GLOB_MARK = 0x01; + const GLOB_NOSORT = 0x02; + const GLOB_NOCHECK = 0x04; + const GLOB_NOESCAPE = 0x08; + const GLOB_BRACE = 0x10; + const GLOB_ONLYDIR = 0x20; + const GLOB_ERR = 0x40; + /**#@-*/ + + /** + * Find pathnames matching a pattern. + * + * @see http://docs.php.net/glob + * @param string $pattern + * @param int $flags + * @param bool $forceFallback + * @return array + * @throws Exception\RuntimeException + */ + public static function glob($pattern, $flags = 0, $forceFallback = false) + { + if (!defined('GLOB_BRACE') || $forceFallback) { + return static::fallbackGlob($pattern, $flags); + } + + return static::systemGlob($pattern, $flags); + } + + /** + * Use the glob function provided by the system. + * + * @param string $pattern + * @param int $flags + * @return array + * @throws Exception\RuntimeException + */ + protected static function systemGlob($pattern, $flags) + { + if ($flags) { + $flagMap = [ + self::GLOB_MARK => GLOB_MARK, + self::GLOB_NOSORT => GLOB_NOSORT, + self::GLOB_NOCHECK => GLOB_NOCHECK, + self::GLOB_NOESCAPE => GLOB_NOESCAPE, + self::GLOB_BRACE => defined('GLOB_BRACE') ? GLOB_BRACE : 0, + self::GLOB_ONLYDIR => GLOB_ONLYDIR, + self::GLOB_ERR => GLOB_ERR, + ]; + + $globFlags = 0; + + foreach ($flagMap as $internalFlag => $globFlag) { + if ($flags & $internalFlag) { + $globFlags |= $globFlag; + } + } + } else { + $globFlags = 0; + } + + ErrorHandler::start(); + $res = glob($pattern, $globFlags); + $err = ErrorHandler::stop(); + if ($res === false) { + throw new Exception\RuntimeException("glob('{$pattern}', {$globFlags}) failed", 0, $err); + } + return $res; + } + + /** + * Expand braces manually, then use the system glob. + * + * @param string $pattern + * @param int $flags + * @return array + * @throws Exception\RuntimeException + */ + protected static function fallbackGlob($pattern, $flags) + { + if (!$flags & self::GLOB_BRACE) { + return static::systemGlob($pattern, $flags); + } + + $flags &= ~self::GLOB_BRACE; + $length = strlen($pattern); + $paths = []; + + if ($flags & self::GLOB_NOESCAPE) { + $begin = strpos($pattern, '{'); + } else { + $begin = 0; + + while (true) { + if ($begin === $length) { + $begin = false; + break; + } elseif ($pattern[$begin] === '\\' && ($begin + 1) < $length) { + $begin++; + } elseif ($pattern[$begin] === '{') { + break; + } + + $begin++; + } + } + + if ($begin === false) { + return static::systemGlob($pattern, $flags); + } + + $next = static::nextBraceSub($pattern, $begin + 1, $flags); + + if ($next === null) { + return static::systemGlob($pattern, $flags); + } + + $rest = $next; + + while ($pattern[$rest] !== '}') { + $rest = static::nextBraceSub($pattern, $rest + 1, $flags); + + if ($rest === null) { + return static::systemGlob($pattern, $flags); + } + } + + $p = $begin + 1; + + while (true) { + $subPattern = substr($pattern, 0, $begin) + . substr($pattern, $p, $next - $p) + . substr($pattern, $rest + 1); + + $result = static::fallbackGlob($subPattern, $flags | self::GLOB_BRACE); + + if ($result) { + $paths = array_merge($paths, $result); + } + + if ($pattern[$next] === '}') { + break; + } + + $p = $next + 1; + $next = static::nextBraceSub($pattern, $p, $flags); + } + + return array_unique($paths); + } + + /** + * Find the end of the sub-pattern in a brace expression. + * + * @param string $pattern + * @param int $begin + * @param int $flags + * @return int|null + */ + protected static function nextBraceSub($pattern, $begin, $flags) + { + $length = strlen($pattern); + $depth = 0; + $current = $begin; + + while ($current < $length) { + if (!$flags & self::GLOB_NOESCAPE && $pattern[$current] === '\\') { + if (++$current === $length) { + break; + } + + $current++; + } else { + if (($pattern[$current] === '}' && $depth-- === 0) || ($pattern[$current] === ',' && $depth === 0)) { + break; + } elseif ($pattern[$current++] === '{') { + $depth++; + } + } + } + + return ($current < $length ? $current : null); + } +} diff --git a/vendor/Zend/Stdlib/Guard/AllGuardsTrait.php b/vendor/Zend/Stdlib/Guard/AllGuardsTrait.php new file mode 100644 index 0000000..95bc516 --- /dev/null +++ b/vendor/Zend/Stdlib/Guard/AllGuardsTrait.php @@ -0,0 +1,20 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Guard; + +/** + * An aggregate for all guard traits + */ +trait AllGuardsTrait +{ + use ArrayOrTraversableGuardTrait; + use EmptyGuardTrait; + use NullGuardTrait; +} diff --git a/vendor/Zend/Stdlib/Guard/ArrayOrTraversableGuardTrait.php b/vendor/Zend/Stdlib/Guard/ArrayOrTraversableGuardTrait.php new file mode 100644 index 0000000..e6959a5 --- /dev/null +++ b/vendor/Zend/Stdlib/Guard/ArrayOrTraversableGuardTrait.php @@ -0,0 +1,41 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Guard; + +use Traversable; + +/** + * Provide a guard method for array or Traversable data + */ +trait ArrayOrTraversableGuardTrait +{ + /** + * Verifies that the data is an array or Traversable + * + * @param mixed $data the data to verify + * @param string $dataName the data name + * @param string $exceptionClass FQCN for the exception + * @throws \Exception + */ + protected function guardForArrayOrTraversable( + $data, + $dataName = 'Argument', + $exceptionClass = 'Zend\Stdlib\Exception\InvalidArgumentException' + ) { + if (!is_array($data) && !($data instanceof Traversable)) { + $message = sprintf( + "%s must be an array or Traversable, [%s] given", + $dataName, + is_object($data) ? get_class($data) : gettype($data) + ); + throw new $exceptionClass($message); + } + } +} diff --git a/vendor/Zend/Stdlib/Guard/EmptyGuardTrait.php b/vendor/Zend/Stdlib/Guard/EmptyGuardTrait.php new file mode 100644 index 0000000..c6751cc --- /dev/null +++ b/vendor/Zend/Stdlib/Guard/EmptyGuardTrait.php @@ -0,0 +1,35 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Guard; + +/** + * Provide a guard method against empty data + */ +trait EmptyGuardTrait +{ + /** + * Verify that the data is not empty + * + * @param mixed $data the data to verify + * @param string $dataName the data name + * @param string $exceptionClass FQCN for the exception + * @throws \Exception + */ + protected function guardAgainstEmpty( + $data, + $dataName = 'Argument', + $exceptionClass = 'Zend\Stdlib\Exception\InvalidArgumentException' + ) { + if (empty($data)) { + $message = sprintf('%s cannot be empty', $dataName); + throw new $exceptionClass($message); + } + } +} diff --git a/vendor/Zend/Stdlib/Guard/GuardUtils.php b/vendor/Zend/Stdlib/Guard/GuardUtils.php new file mode 100644 index 0000000..4fe4cca --- /dev/null +++ b/vendor/Zend/Stdlib/Guard/GuardUtils.php @@ -0,0 +1,85 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Guard; + +use Traversable; + +/** + * Static guard helper class + * + * Bridges the gap for allowing refactoring until traits can be used by default. + * + * @deprecated + */ +abstract class GuardUtils +{ + const DEFAULT_EXCEPTION_CLASS = 'Zend\Stdlib\Exception\InvalidArgumentException'; + + /** + * Verifies that the data is an array or Traversable + * + * @param mixed $data the data to verify + * @param string $dataName the data name + * @param string $exceptionClass FQCN for the exception + * @throws \Exception + */ + public static function guardForArrayOrTraversable( + $data, + $dataName = 'Argument', + $exceptionClass = self::DEFAULT_EXCEPTION_CLASS + ) { + if (!is_array($data) && !($data instanceof Traversable)) { + $message = sprintf( + '%s must be an array or Traversable, [%s] given', + $dataName, + is_object($data) ? get_class($data) : gettype($data) + ); + throw new $exceptionClass($message); + } + } + + /** + * Verify that the data is not empty + * + * @param mixed $data the data to verify + * @param string $dataName the data name + * @param string $exceptionClass FQCN for the exception + * @throws \Exception + */ + public static function guardAgainstEmpty( + $data, + $dataName = 'Argument', + $exceptionClass = self::DEFAULT_EXCEPTION_CLASS + ) { + if (empty($data)) { + $message = sprintf('%s cannot be empty', $dataName); + throw new $exceptionClass($message); + } + } + + /** + * Verify that the data is not null + * + * @param mixed $data the data to verify + * @param string $dataName the data name + * @param string $exceptionClass FQCN for the exception + * @throws \Exception + */ + public static function guardAgainstNull( + $data, + $dataName = 'Argument', + $exceptionClass = self::DEFAULT_EXCEPTION_CLASS + ) { + if (null === $data) { + $message = sprintf('%s cannot be null', $dataName); + throw new $exceptionClass($message); + } + } +} diff --git a/vendor/Zend/Stdlib/Guard/NullGuardTrait.php b/vendor/Zend/Stdlib/Guard/NullGuardTrait.php new file mode 100644 index 0000000..eac7162 --- /dev/null +++ b/vendor/Zend/Stdlib/Guard/NullGuardTrait.php @@ -0,0 +1,35 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Guard; + +/** + * Provide a guard method against null data + */ +trait NullGuardTrait +{ + /** + * Verify that the data is not null + * + * @param mixed $data the data to verify + * @param string $dataName the data name + * @param string $exceptionClass FQCN for the exception + * @throws \Exception + */ + protected function guardAgainstNull( + $data, + $dataName = 'Argument', + $exceptionClass = 'Zend\Stdlib\Exception\InvalidArgumentException' + ) { + if (null === $data) { + $message = sprintf('%s cannot be null', $dataName); + throw new $exceptionClass($message); + } + } +} diff --git a/vendor/Zend/Stdlib/Hydrator/AbstractHydrator.php b/vendor/Zend/Stdlib/Hydrator/AbstractHydrator.php new file mode 100644 index 0000000..a4cf08a --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/AbstractHydrator.php @@ -0,0 +1,19 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Hydrator; + +use Zend\Hydrator\AbstractHydrator as BaseAbstractHydrator; + +/** + * @deprecated Use Zend\Hydrator\AbstractHydrator from zendframework/zend-hydrator instead. + */ +abstract class AbstractHydrator extends BaseAbstractHydrator implements HydratorInterface +{ +} diff --git a/vendor/Zend/Stdlib/Hydrator/Aggregate/AggregateHydrator.php b/vendor/Zend/Stdlib/Hydrator/Aggregate/AggregateHydrator.php new file mode 100644 index 0000000..52e2ba7 --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/Aggregate/AggregateHydrator.php @@ -0,0 +1,45 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Hydrator\Aggregate; + +use Zend\Hydrator\Aggregate\AggregateHydrator as BaseAggregateHydrator; +use Zend\Stdlib\Hydrator\HydratorInterface; + +/** + * Aggregate hydrator that composes multiple hydrators via events + * + * @deprecated Use Zend\Hydrator\Aggregate\AggregateHydrator from zendframework/zend-hydrator instead. + */ +class AggregateHydrator extends BaseAggregateHydrator implements HydratorInterface +{ + /** + * {@inheritDoc} + */ + public function extract($object) + { + $event = new ExtractEvent($this, $object); + + $this->getEventManager()->triggerEvent($event); + + return $event->getExtractedData(); + } + + /** + * {@inheritDoc} + */ + public function hydrate(array $data, $object) + { + $event = new HydrateEvent($this, $object, $data); + + $this->getEventManager()->triggerEvent($event); + + return $event->getHydratedObject(); + } +} diff --git a/vendor/Zend/Stdlib/Hydrator/Aggregate/ExtractEvent.php b/vendor/Zend/Stdlib/Hydrator/Aggregate/ExtractEvent.php new file mode 100644 index 0000000..9563efb --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/Aggregate/ExtractEvent.php @@ -0,0 +1,22 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Hydrator\Aggregate; + +use Zend\Hydrator\Aggregate\ExtractEvent as BaseExtractEvent; + +/** + * Event triggered when the {@see \Zend\Stdlib\Hydrator\Aggregate\AggregateHydrator} extracts + * data from an object + * + * @deprecated Use Zend\Hydrator\Aggregate\ExtractEvent from zendframework/zend-hydrator instead. + */ +class ExtractEvent extends BaseExtractEvent +{ +} diff --git a/vendor/Zend/Stdlib/Hydrator/Aggregate/HydrateEvent.php b/vendor/Zend/Stdlib/Hydrator/Aggregate/HydrateEvent.php new file mode 100644 index 0000000..29c9fd6 --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/Aggregate/HydrateEvent.php @@ -0,0 +1,22 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Hydrator\Aggregate; + +use Zend\Hydrator\Aggregate\HydrateEvent as BaseHydrateEvent; + +/** + * Event triggered when the {@see \Zend\Stdlib\Hydrator\Aggregate\AggregateHydrator} hydrates + * data into an object + * + * @deprecated Use Zend\Hydrator\Aggregate\HydrateEvent from zendframework/zend-hydrator instead. + */ +class HydrateEvent extends BaseHydrateEvent +{ +} diff --git a/vendor/Zend/Stdlib/Hydrator/Aggregate/HydratorListener.php b/vendor/Zend/Stdlib/Hydrator/Aggregate/HydratorListener.php new file mode 100644 index 0000000..e15cae4 --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/Aggregate/HydratorListener.php @@ -0,0 +1,23 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Hydrator\Aggregate; + +use Zend\Hydrator\Aggregate\HydratorListener as BaseHydratorListener; + +/** + * Aggregate listener wrapping around a hydrator. Listens + * to {@see \Zend\Stdlib\Hydrator\Aggregate::EVENT_HYDRATE} and + * {@see \Zend\Stdlib\Hydrator\Aggregate::EVENT_EXTRACT} + * + * @deprecated Use Zend\Hydrator\Aggregate\HydratorListener from zendframework/zend-hydrator instead. + */ +class HydratorListener extends BaseHydratorListener +{ +} diff --git a/vendor/Zend/Stdlib/Hydrator/ArraySerializable.php b/vendor/Zend/Stdlib/Hydrator/ArraySerializable.php new file mode 100644 index 0000000..415a44d --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/ArraySerializable.php @@ -0,0 +1,19 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Hydrator; + +use Zend\Hydrator\ArraySerializable as BaseArraySerializable; + +/** + * @deprecated Use Zend\Hydrator\ArraySerializable from zendframework/zend-hydrator instead. + */ +class ArraySerializable extends BaseArraySerializable implements HydratorInterface +{ +} diff --git a/vendor/Zend/Stdlib/Hydrator/ClassMethods.php b/vendor/Zend/Stdlib/Hydrator/ClassMethods.php new file mode 100644 index 0000000..ee6bdad --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/ClassMethods.php @@ -0,0 +1,19 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Hydrator; + +use Zend\Hydrator\ClassMethods as BaseClassMethods; + +/** + * @deprecated Use Zend\Hydrator\ClassMethods from zendframework/zend-hydrator instead. + */ +class ClassMethods extends BaseClassMethods implements HydratorInterface, HydratorOptionsInterface +{ +} diff --git a/vendor/Zend/Stdlib/Hydrator/DelegatingHydrator.php b/vendor/Zend/Stdlib/Hydrator/DelegatingHydrator.php new file mode 100644 index 0000000..eb65d95 --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/DelegatingHydrator.php @@ -0,0 +1,19 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Hydrator; + +use Zend\Hydrator\DelegatingHydrator as BaseDelegatingHydrator; + +/** + * @deprecated Use Zend\Hydrator\DelegatingHydrator from zendframework/zend-hydrator instead. + */ +class DelegatingHydrator extends BaseDelegatingHydrator implements HydratorInterface +{ +} diff --git a/vendor/Zend/Stdlib/Hydrator/DelegatingHydratorFactory.php b/vendor/Zend/Stdlib/Hydrator/DelegatingHydratorFactory.php new file mode 100644 index 0000000..73e9143 --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/DelegatingHydratorFactory.php @@ -0,0 +1,26 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Hydrator; + +use Zend\ServiceManager\FactoryInterface; +use Zend\ServiceManager\ServiceLocatorInterface; + +/** + * @deprecated Use Zend\Hydrator\DelegatingHydratorFactory from zendframework/zend-hydrator instead. + */ +class DelegatingHydratorFactory implements FactoryInterface +{ + public function createService(ServiceLocatorInterface $serviceLocator) + { + // Assume that this factory is registered with the HydratorManager, + // and just pass it directly on. + return new DelegatingHydrator($serviceLocator); + } +} diff --git a/vendor/Zend/Stdlib/Hydrator/Filter/FilterComposite.php b/vendor/Zend/Stdlib/Hydrator/Filter/FilterComposite.php new file mode 100644 index 0000000..b230c97 --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/Filter/FilterComposite.php @@ -0,0 +1,18 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ +namespace Zend\Stdlib\Hydrator\Filter; + +use Zend\Hydrator\Filter\FilterComposite as BaseFilterComposite; + +/** + * @deprecated Use Zend\Hydrator\Filter\FilterComposite from zendframework/zend-hydrator instead. + */ +class FilterComposite extends BaseFilterComposite implements FilterInterface +{ +} diff --git a/vendor/Zend/Stdlib/Hydrator/Filter/FilterInterface.php b/vendor/Zend/Stdlib/Hydrator/Filter/FilterInterface.php new file mode 100644 index 0000000..95c4e24 --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/Filter/FilterInterface.php @@ -0,0 +1,18 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ +namespace Zend\Stdlib\Hydrator\Filter; + +use Zend\Hydrator\Filter\FilterInterface as BaseFilterInterface; + +/** + * @deprecated Use Zend\Hydrator\Filter\FilterInterface from zendframework/zend-hydrator instead. + */ +interface FilterInterface extends BaseFilterInterface +{ +} diff --git a/vendor/Zend/Stdlib/Hydrator/Filter/FilterProviderInterface.php b/vendor/Zend/Stdlib/Hydrator/Filter/FilterProviderInterface.php new file mode 100644 index 0000000..142ddf1 --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/Filter/FilterProviderInterface.php @@ -0,0 +1,18 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ +namespace Zend\Stdlib\Hydrator\Filter; + +use Zend\Hydrator\Filter\FilterProviderInterface as BaseFilterProviderInterface; + +/** + * @deprecated Use Zend\Hydrator\Filter\FilterProviderInterface from zendframework/zend-hydrator instead. + */ +interface FilterProviderInterface extends BaseFilterProviderInterface +{ +} diff --git a/vendor/Zend/Stdlib/Hydrator/Filter/GetFilter.php b/vendor/Zend/Stdlib/Hydrator/Filter/GetFilter.php new file mode 100644 index 0000000..ca7dd3c --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/Filter/GetFilter.php @@ -0,0 +1,18 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ +namespace Zend\Stdlib\Hydrator\Filter; + +use Zend\Hydrator\Filter\GetFilter as BaseGetFilter; + +/** + * @deprecated Use Zend\Hydrator\Filter\GetFilter from zendframework/zend-hydrator instead. + */ +class GetFilter extends BaseGetFilter implements FilterInterface +{ +} diff --git a/vendor/Zend/Stdlib/Hydrator/Filter/HasFilter.php b/vendor/Zend/Stdlib/Hydrator/Filter/HasFilter.php new file mode 100644 index 0000000..af00600 --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/Filter/HasFilter.php @@ -0,0 +1,18 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ +namespace Zend\Stdlib\Hydrator\Filter; + +use Zend\Hydrator\Filter\HasFilter as BaseHasFilter; + +/** + * @deprecated Use Zend\Hydrator\Filter\HasFilter from zendframework/zend-hydrator instead. + */ +class HasFilter extends BaseHasFilter implements FilterInterface +{ +} diff --git a/vendor/Zend/Stdlib/Hydrator/Filter/IsFilter.php b/vendor/Zend/Stdlib/Hydrator/Filter/IsFilter.php new file mode 100644 index 0000000..9e51643 --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/Filter/IsFilter.php @@ -0,0 +1,18 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ +namespace Zend\Stdlib\Hydrator\Filter; + +use Zend\Hydrator\Filter\IsFilter as BaseIsFilter; + +/** + * @deprecated Use Zend\Hydrator\Filter\IsFilter from zendframework/zend-hydrator instead. + */ +class IsFilter extends BaseIsFilter implements FilterInterface +{ +} diff --git a/vendor/Zend/Stdlib/Hydrator/Filter/MethodMatchFilter.php b/vendor/Zend/Stdlib/Hydrator/Filter/MethodMatchFilter.php new file mode 100644 index 0000000..471849c --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/Filter/MethodMatchFilter.php @@ -0,0 +1,18 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ +namespace Zend\Stdlib\Hydrator\Filter; + +use Zend\Hydrator\Filter\MethodMatchFilter as BaseMethodMatchFilter; + +/** + * @deprecated Use Zend\Hydrator\Filter\MethodMatchFilter from zendframework/zend-hydrator instead. + */ +class MethodMatchFilter extends BaseMethodMatchFilter implements FilterInterface +{ +} diff --git a/vendor/Zend/Stdlib/Hydrator/Filter/NumberOfParameterFilter.php b/vendor/Zend/Stdlib/Hydrator/Filter/NumberOfParameterFilter.php new file mode 100644 index 0000000..95309b1 --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/Filter/NumberOfParameterFilter.php @@ -0,0 +1,19 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Hydrator\Filter; + +use Zend\Hydrator\Filter\NumberOfParameterFilter as BaseNumberOfParameterFilter; + +/** + * @deprecated Use Zend\Hydrator\Filter\NumberOfParameterFilter from zendframework/zend-hydrator instead. + */ +class NumberOfParameterFilter extends BaseNumberOfParameterFilter implements FilterInterface +{ +} diff --git a/vendor/Zend/Stdlib/Hydrator/Filter/OptionalParametersFilter.php b/vendor/Zend/Stdlib/Hydrator/Filter/OptionalParametersFilter.php new file mode 100644 index 0000000..07c8dfd --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/Filter/OptionalParametersFilter.php @@ -0,0 +1,20 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ +namespace Zend\Stdlib\Hydrator\Filter; + +use Zend\Hydrator\Filter\OptionalParametersFilter as BaseOptionalParametersFilter; + +/** + * Filter that includes methods which have no parameters or only optional parameters + * + * @deprecated Use Zend\Hydrator\Filter\OptionalParametersFilter from zendframework/zend-hydrator instead. + */ +class OptionalParametersFilter extends BaseOptionalParametersFilter implements FilterInterface +{ +} diff --git a/vendor/Zend/Stdlib/Hydrator/FilterEnabledInterface.php b/vendor/Zend/Stdlib/Hydrator/FilterEnabledInterface.php new file mode 100644 index 0000000..9643f14 --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/FilterEnabledInterface.php @@ -0,0 +1,19 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Hydrator; + +use Zend\Hydrator\FilterEnabledInterface as BaseFilterEnabledInterface; + +/** + * @deprecated Use Zend\Hydrator\FilterEnabledInterface from zendframework/zend-hydrator instead. + */ +interface FilterEnabledInterface extends BaseFilterEnabledInterface +{ +} diff --git a/vendor/Zend/Stdlib/Hydrator/HydrationInterface.php b/vendor/Zend/Stdlib/Hydrator/HydrationInterface.php new file mode 100644 index 0000000..8395169 --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/HydrationInterface.php @@ -0,0 +1,19 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Hydrator; + +use Zend\Hydrator\HydrationInterface as BaseHydrationInterface; + +/** + * @deprecated Use Zend\Hydrator\HydrationInterface from zendframework/zend-hydrator instead. + */ +interface HydrationInterface extends BaseHydrationInterface +{ +} diff --git a/vendor/Zend/Stdlib/Hydrator/HydratorAwareInterface.php b/vendor/Zend/Stdlib/Hydrator/HydratorAwareInterface.php new file mode 100644 index 0000000..625a609 --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/HydratorAwareInterface.php @@ -0,0 +1,19 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Hydrator; + +use Zend\Hydrator\HydratorAwareInterface as BaseHydratorAwareInterface; + +/** + * @deprecated Use Zend\Hydrator\HydratorAwareInterface from zendframework/zend-hydrator instead. + */ +interface HydratorAwareInterface extends BaseHydratorAwareInterface +{ +} diff --git a/vendor/Zend/Stdlib/Hydrator/HydratorAwareTrait.php b/vendor/Zend/Stdlib/Hydrator/HydratorAwareTrait.php new file mode 100644 index 0000000..e7d6082 --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/HydratorAwareTrait.php @@ -0,0 +1,20 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Hydrator; + +use Zend\Hydrator\HydratorAwareTrait as BaseHydratorAwareTrait; + +/** + * @deprecated Use Zend\Hydrator\HydratorAwareTrait from zendframework/zend-hydrator instead. + */ +trait HydratorAwareTrait +{ + use BaseHydratorAwareTrait; +} diff --git a/vendor/Zend/Stdlib/Hydrator/HydratorInterface.php b/vendor/Zend/Stdlib/Hydrator/HydratorInterface.php new file mode 100644 index 0000000..14f143a --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/HydratorInterface.php @@ -0,0 +1,20 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Hydrator; + +use Zend\Stdlib\Extractor\ExtractionInterface; +use Zend\Hydrator\HydratorInterface as BaseHydratorInterface; + +/** + * @deprecated Use Zend\Hydrator\HydratorInterface from zendframework/zend-hydrator instead. + */ +interface HydratorInterface extends BaseHydratorInterface, HydrationInterface, ExtractionInterface +{ +} diff --git a/vendor/Zend/Stdlib/Hydrator/HydratorOptionsInterface.php b/vendor/Zend/Stdlib/Hydrator/HydratorOptionsInterface.php new file mode 100644 index 0000000..dfda925 --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/HydratorOptionsInterface.php @@ -0,0 +1,19 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Hydrator; + +use Zend\Hydrator\HydratorOptionsInterface as BaseHydratorOptionsInterface; + +/** + * @deprecated Use Zend\Hydrator\HydratorOptionsInterface from zendframework/zend-hydrator instead. + */ +interface HydratorOptionsInterface extends BaseHydratorOptionsInterface +{ +} diff --git a/vendor/Zend/Stdlib/Hydrator/HydratorPluginManager.php b/vendor/Zend/Stdlib/Hydrator/HydratorPluginManager.php new file mode 100644 index 0000000..aff14b5 --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/HydratorPluginManager.php @@ -0,0 +1,53 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Hydrator; + +use Zend\Hydrator\HydratorPluginManager as BaseHydratorPluginManager; + +/** + * Plugin manager implementation for hydrators. + * + * Enforces that adapters retrieved are instances of HydratorInterface + * + * @deprecated Use Zend\Hydrator\HydratorPluginManager from zendframework/zend-hydrator instead. + */ +class HydratorPluginManager extends BaseHydratorPluginManager +{ + /** + * Default aliases + * + * @var array + */ + protected $aliases = [ + 'delegatinghydrator' => 'Zend\Stdlib\Hydrator\DelegatingHydrator', + ]; + + /** + * Default set of adapters + * + * @var array + */ + protected $invokableClasses = [ + 'arrayserializable' => 'Zend\Stdlib\Hydrator\ArraySerializable', + 'classmethods' => 'Zend\Stdlib\Hydrator\ClassMethods', + 'objectproperty' => 'Zend\Stdlib\Hydrator\ObjectProperty', + 'reflection' => 'Zend\Stdlib\Hydrator\Reflection' + ]; + + /** + * Default factory-based adapters + * + * @var array + */ + protected $factories = [ + 'Zend\Stdlib\Hydrator\DelegatingHydrator' => 'Zend\Stdlib\Hydrator\DelegatingHydratorFactory', + 'zendstdlibhydratordelegatinghydrator' => 'Zend\Stdlib\Hydrator\DelegatingHydratorFactory', + ]; +} diff --git a/vendor/Zend/Stdlib/Hydrator/Iterator/HydratingArrayIterator.php b/vendor/Zend/Stdlib/Hydrator/Iterator/HydratingArrayIterator.php new file mode 100644 index 0000000..f51befe --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/Iterator/HydratingArrayIterator.php @@ -0,0 +1,19 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Hydrator\Iterator; + +use Zend\Hydrator\Iterator\HydratingArrayIterator as BaseHydratingArrayIterator; + +/** + * @deprecated Use Zend\Hydrator\Iterator\HydratingArrayIterator from zendframework/zend-hydrator instead. + */ +class HydratingArrayIterator extends BaseHydratingArrayIterator implements HydratingIteratorInterface +{ +} diff --git a/vendor/Zend/Stdlib/Hydrator/Iterator/HydratingIteratorInterface.php b/vendor/Zend/Stdlib/Hydrator/Iterator/HydratingIteratorInterface.php new file mode 100644 index 0000000..81a9999 --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/Iterator/HydratingIteratorInterface.php @@ -0,0 +1,19 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Hydrator\Iterator; + +use Zend\Hydrator\Iterator\HydratingIteratorInterface as BaseHydratingIteratorInterface; + +/** + * @deprecated Use Zend\Hydrator\Iterator\HydratingIteratorInterface from zendframework/zend-hydrator instead. + */ +interface HydratingIteratorInterface extends BaseHydratingIteratorInterface +{ +} diff --git a/vendor/Zend/Stdlib/Hydrator/Iterator/HydratingIteratorIterator.php b/vendor/Zend/Stdlib/Hydrator/Iterator/HydratingIteratorIterator.php new file mode 100644 index 0000000..1d2ac7a --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/Iterator/HydratingIteratorIterator.php @@ -0,0 +1,19 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Hydrator\Iterator; + +use Zend\Hydrator\Iterator\HydratingIteratorIterator as BaseHydratingIteratorIterator; + +/** + * @deprecated Use Zend\Hydrator\Iterator\HydratingIteratorIterator from zendframework/zend-hydrator instead. + */ +class HydratingIteratorIterator extends BaseHydratingIteratorIterator implements HydratingIteratorInterface +{ +} diff --git a/vendor/Zend/Stdlib/Hydrator/NamingStrategy/ArrayMapNamingStrategy.php b/vendor/Zend/Stdlib/Hydrator/NamingStrategy/ArrayMapNamingStrategy.php new file mode 100644 index 0000000..d440c53 --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/NamingStrategy/ArrayMapNamingStrategy.php @@ -0,0 +1,19 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Hydrator\NamingStrategy; + +use Zend\Hydrator\NamingStrategy\ArrayMapNamingStrategy as BaseArrayMapNamingStrategy; + +/** + * @deprecated Use Zend\Hydrator\NamingStrategy\ArrayMapNamingStrategy from zendframework/zend-hydrator instead. + */ +class ArrayMapNamingStrategy extends BaseArrayMapNamingStrategy implements NamingStrategyInterface +{ +} diff --git a/vendor/Zend/Stdlib/Hydrator/NamingStrategy/CompositeNamingStrategy.php b/vendor/Zend/Stdlib/Hydrator/NamingStrategy/CompositeNamingStrategy.php new file mode 100644 index 0000000..d529a8b --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/NamingStrategy/CompositeNamingStrategy.php @@ -0,0 +1,19 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Hydrator\NamingStrategy; + +use Zend\Hydrator\NamingStrategy\CompositeNamingStrategy as BaseCompositeNamingStrategy; + +/** + * @deprecated Use Zend\Hydrator\NamingStrategy\CompositeNamingStrategy from zendframework/zend-hydrator instead. + */ +class CompositeNamingStrategy extends BaseCompositeNamingStrategy implements NamingStrategyInterface +{ +} diff --git a/vendor/Zend/Stdlib/Hydrator/NamingStrategy/IdentityNamingStrategy.php b/vendor/Zend/Stdlib/Hydrator/NamingStrategy/IdentityNamingStrategy.php new file mode 100644 index 0000000..be57839 --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/NamingStrategy/IdentityNamingStrategy.php @@ -0,0 +1,19 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Hydrator\NamingStrategy; + +use Zend\Hydrator\NamingStrategy\IdentityNamingStrategy as BaseIdentityNamingStrategy; + +/** + * @deprecated Use Zend\Hydrator\NamingStrategy\IdentityNamingStrategy from zendframework/zend-hydrator instead. + */ +class IdentityNamingStrategy extends BaseIdentityNamingStrategy implements NamingStrategyInterface +{ +} diff --git a/vendor/Zend/Stdlib/Hydrator/NamingStrategy/MapNamingStrategy.php b/vendor/Zend/Stdlib/Hydrator/NamingStrategy/MapNamingStrategy.php new file mode 100644 index 0000000..59e3f7f --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/NamingStrategy/MapNamingStrategy.php @@ -0,0 +1,19 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Hydrator\NamingStrategy; + +use Zend\Hydrator\NamingStrategy\MapNamingStrategy as BaseMapNamingStrategy; + +/** + * @deprecated Use Zend\Hydrator\NamingStrategy\MapNamingStrategy from zendframework/zend-hydrator instead. + */ +class MapNamingStrategy extends BaseMapNamingStrategy implements NamingStrategyInterface +{ +} diff --git a/vendor/Zend/Stdlib/Hydrator/NamingStrategy/NamingStrategyInterface.php b/vendor/Zend/Stdlib/Hydrator/NamingStrategy/NamingStrategyInterface.php new file mode 100644 index 0000000..4d82ee1 --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/NamingStrategy/NamingStrategyInterface.php @@ -0,0 +1,21 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Hydrator\NamingStrategy; + +use Zend\Hydrator\NamingStrategy\NamingStrategyInterface as BaseNamingStrategyInterface; + +/** + * Allow property extraction / hydration for hydrator + * + * @deprecated Use Zend\Hydrator\NamingStrategy\NamingStrategyInterface from zendframework/zend-hydrator instead. + */ +interface NamingStrategyInterface extends BaseNamingStrategyInterface +{ +} diff --git a/vendor/Zend/Stdlib/Hydrator/NamingStrategy/UnderscoreNamingStrategy.php b/vendor/Zend/Stdlib/Hydrator/NamingStrategy/UnderscoreNamingStrategy.php new file mode 100644 index 0000000..2b9d6ef --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/NamingStrategy/UnderscoreNamingStrategy.php @@ -0,0 +1,19 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Hydrator\NamingStrategy; + +use Zend\Hydrator\NamingStrategy\UnderscoreNamingStrategy as BaseUnderscoreNamingStrategy; + +/** + * @deprecated Use Zend\Hydrator\NamingStrategy\UnderscoreNamingStrategy from zendframework/zend-hydrator instead. + */ +class UnderscoreNamingStrategy extends BaseUnderscoreNamingStrategy implements NamingStrategyInterface +{ +} diff --git a/vendor/Zend/Stdlib/Hydrator/NamingStrategyEnabledInterface.php b/vendor/Zend/Stdlib/Hydrator/NamingStrategyEnabledInterface.php new file mode 100644 index 0000000..8f8acab --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/NamingStrategyEnabledInterface.php @@ -0,0 +1,19 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Hydrator; + +use Zend\Hydrator\NamingStrategyEnabledInterface as BaseNamingStrategyEnabledInterface; + +/** + * @deprecated Use Zend\Hydrator\NamingStrategy\NamingStrategyEnabledInterface from zendframework/zend-hydrator instead. + */ +interface NamingStrategyEnabledInterface extends BaseNamingStrategyEnabledInterface +{ +} diff --git a/vendor/Zend/Stdlib/Hydrator/ObjectProperty.php b/vendor/Zend/Stdlib/Hydrator/ObjectProperty.php new file mode 100644 index 0000000..c846fe5 --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/ObjectProperty.php @@ -0,0 +1,19 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Hydrator; + +use Zend\Hydrator\ObjectProperty as BaseObjectProperty; + +/** + * @deprecated Use Zend\Hydrator\ObjectProperty from zendframework/zend-hydrator instead. + */ +class ObjectProperty extends BaseObjectProperty implements HydratorInterface +{ +} diff --git a/vendor/Zend/Stdlib/Hydrator/Reflection.php b/vendor/Zend/Stdlib/Hydrator/Reflection.php new file mode 100644 index 0000000..22d8cdf --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/Reflection.php @@ -0,0 +1,19 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Hydrator; + +use Zend\Hydrator\Reflection as BaseReflection; + +/** + * @deprecated Use Zend\Hydrator\Reflection from zendframework/zend-hydrator instead. + */ +class Reflection extends BaseReflection implements HydratorInterface +{ +} diff --git a/vendor/Zend/Stdlib/Hydrator/Strategy/BooleanStrategy.php b/vendor/Zend/Stdlib/Hydrator/Strategy/BooleanStrategy.php new file mode 100644 index 0000000..d89f507 --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/Strategy/BooleanStrategy.php @@ -0,0 +1,21 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Hydrator\Strategy; + +use Zend\Hydrator\Strategy\BooleanStrategy as BaseBooleanStrategy; + +/** + * This Strategy extracts and hydrates int and string values to Boolean values + * + * @deprecated Use Zend\Hydrator\Strategy\BooleanStrategy from zendframework/zend-hydrator instead. + */ +class BooleanStrategy extends BaseBooleanStrategy implements StrategyInterface +{ +} diff --git a/vendor/Zend/Stdlib/Hydrator/Strategy/ClosureStrategy.php b/vendor/Zend/Stdlib/Hydrator/Strategy/ClosureStrategy.php new file mode 100644 index 0000000..3257222 --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/Strategy/ClosureStrategy.php @@ -0,0 +1,19 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Hydrator\Strategy; + +use Zend\Hydrator\Strategy\ClosureStrategy as BaseClosureStrategy; + +/** + * @deprecated Use Zend\Hydrator\Strategy\ClosureStrategy from zendframework/zend-hydrator instead. + */ +class ClosureStrategy extends BaseClosureStrategy implements StrategyInterface +{ +} diff --git a/vendor/Zend/Stdlib/Hydrator/Strategy/DateTimeFormatterStrategy.php b/vendor/Zend/Stdlib/Hydrator/Strategy/DateTimeFormatterStrategy.php new file mode 100644 index 0000000..8e633f3 --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/Strategy/DateTimeFormatterStrategy.php @@ -0,0 +1,19 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Hydrator\Strategy; + +use Zend\Hydrator\Strategy\DateTimeFormatterStrategy as BaseDateTimeFormatterStrategy; + +/** + * @deprecated Use Zend\Hydrator\Strategy\DateTimeFormatterStrategy from zendframework/zend-hydrator instead. + */ +class DateTimeFormatterStrategy extends BaseDateTimeFormatterStrategy implements StrategyInterface +{ +} diff --git a/vendor/Zend/Stdlib/Hydrator/Strategy/DefaultStrategy.php b/vendor/Zend/Stdlib/Hydrator/Strategy/DefaultStrategy.php new file mode 100644 index 0000000..155c82f --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/Strategy/DefaultStrategy.php @@ -0,0 +1,19 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Hydrator\Strategy; + +use Zend\Hydrator\Strategy\DefaultStrategy as BaseDefaultStrategy; + +/** + * @deprecated Use Zend\Hydrator\Strategy\DefaultStrategy from zendframework/zend-hydrator instead. + */ +class DefaultStrategy extends BaseDefaultStrategy implements StrategyInterface +{ +} diff --git a/vendor/Zend/Stdlib/Hydrator/Strategy/Exception/ExceptionInterface.php b/vendor/Zend/Stdlib/Hydrator/Strategy/Exception/ExceptionInterface.php new file mode 100644 index 0000000..16a921b --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/Strategy/Exception/ExceptionInterface.php @@ -0,0 +1,19 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Hydrator\Strategy\Exception; + +use Zend\Hydrator\Strategy\Exception; + +/** + * @deprecated Use Zend\Hydrator\Strategy\Exception\ExceptionInterface from zendframework/zend-hydrator instead. + */ +interface ExceptionInterface extends Exception\ExceptionInterface +{ +} diff --git a/vendor/Zend/Stdlib/Hydrator/Strategy/Exception/InvalidArgumentException.php b/vendor/Zend/Stdlib/Hydrator/Strategy/Exception/InvalidArgumentException.php new file mode 100644 index 0000000..10f69a2 --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/Strategy/Exception/InvalidArgumentException.php @@ -0,0 +1,19 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Hydrator\Strategy\Exception; + +use Zend\Hydrator\Strategy\Exception\InvalidArgumentException as BaseInvalidArgumentException; + +/** + * @deprecated Use Zend\Hydrator\Strategy\Exception\InvalidArgumentException from zendframework/zend-hydrator instead. + */ +class InvalidArgumentException extends BaseInvalidArgumentException implements ExceptionInterface +{ +} diff --git a/vendor/Zend/Stdlib/Hydrator/Strategy/ExplodeStrategy.php b/vendor/Zend/Stdlib/Hydrator/Strategy/ExplodeStrategy.php new file mode 100644 index 0000000..ca7e585 --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/Strategy/ExplodeStrategy.php @@ -0,0 +1,19 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Hydrator\Strategy; + +use Zend\Hydrator\Strategy\ExplodeStrategy as BaseExplodeStrategy; + +/** + * @deprecated Use Zend\Hydrator\Strategy\ExplodeStrategy from zendframework/zend-hydrator instead. + */ +class ExplodeStrategy extends BaseExplodeStrategy implements StrategyInterface +{ +} diff --git a/vendor/Zend/Stdlib/Hydrator/Strategy/SerializableStrategy.php b/vendor/Zend/Stdlib/Hydrator/Strategy/SerializableStrategy.php new file mode 100644 index 0000000..0452792 --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/Strategy/SerializableStrategy.php @@ -0,0 +1,19 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Hydrator\Strategy; + +use Zend\Hydrator\Strategy\SerializableStrategy as BaseSerializableStrategy; + +/** + * @deprecated Use Zend\Hydrator\Strategy\SerializableStrategy from zendframework/zend-hydrator instead. + */ +class SerializableStrategy extends BaseSerializableStrategy implements StrategyInterface +{ +} diff --git a/vendor/Zend/Stdlib/Hydrator/Strategy/StrategyChain.php b/vendor/Zend/Stdlib/Hydrator/Strategy/StrategyChain.php new file mode 100644 index 0000000..33d2bc1 --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/Strategy/StrategyChain.php @@ -0,0 +1,19 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Hydrator\Strategy; + +use Zend\Hydrator\Strategy\StrategyChain as BaseStrategyChain; + +/** + * @deprecated Use Zend\Hydrator\Strategy\StrategyChain from zendframework/zend-hydrator instead. + */ +class StrategyChain extends BaseStrategyChain implements StrategyInterface +{ +} diff --git a/vendor/Zend/Stdlib/Hydrator/Strategy/StrategyInterface.php b/vendor/Zend/Stdlib/Hydrator/Strategy/StrategyInterface.php new file mode 100644 index 0000000..a1eb8e9 --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/Strategy/StrategyInterface.php @@ -0,0 +1,19 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Hydrator\Strategy; + +use Zend\Hydrator\Strategy\StrategyInterface as BaseStrategyInterface; + +/** + * @deprecated Use Zend\Hydrator\Strategy\StrategyInterface from zendframework/zend-hydrator instead. + */ +interface StrategyInterface extends BaseStrategyInterface +{ +} diff --git a/vendor/Zend/Stdlib/Hydrator/StrategyEnabledInterface.php b/vendor/Zend/Stdlib/Hydrator/StrategyEnabledInterface.php new file mode 100644 index 0000000..9c058a7 --- /dev/null +++ b/vendor/Zend/Stdlib/Hydrator/StrategyEnabledInterface.php @@ -0,0 +1,19 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\Hydrator; + +use Zend\Hydrator\StrategyEnabledInterface as BaseStrategyEnabledInterface; + +/** + * @deprecated Use Zend\Hydrator\Strategy\StrategyEnabledInterface from zendframework/zend-hydrator instead. + */ +interface StrategyEnabledInterface extends BaseStrategyEnabledInterface +{ +} diff --git a/vendor/Zend/Stdlib/InitializableInterface.php b/vendor/Zend/Stdlib/InitializableInterface.php new file mode 100644 index 0000000..f78bede --- /dev/null +++ b/vendor/Zend/Stdlib/InitializableInterface.php @@ -0,0 +1,23 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib; + +/** + * Interface to allow objects to have initialization logic + */ +interface InitializableInterface +{ + /** + * Init an object + * + * @return void + */ + public function init(); +} diff --git a/vendor/Zend/Stdlib/JsonSerializable.php b/vendor/Zend/Stdlib/JsonSerializable.php new file mode 100644 index 0000000..16cc244 --- /dev/null +++ b/vendor/Zend/Stdlib/JsonSerializable.php @@ -0,0 +1,14 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib; + +interface JsonSerializable extends \JsonSerializable +{ +} diff --git a/vendor/Zend/Stdlib/Message.php b/vendor/Zend/Stdlib/Message.php new file mode 100644 index 0000000..12d5bb3 --- /dev/null +++ b/vendor/Zend/Stdlib/Message.php @@ -0,0 +1,118 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib; + +use Traversable; + +class Message implements MessageInterface +{ + /** + * @var array + */ + protected $metadata = []; + + /** + * @var string + */ + protected $content = ''; + + /** + * Set message metadata + * + * Non-destructive setting of message metadata; always adds to the metadata, never overwrites + * the entire metadata container. + * + * @param string|int|array|Traversable $spec + * @param mixed $value + * @throws Exception\InvalidArgumentException + * @return Message + */ + public function setMetadata($spec, $value = null) + { + if (is_scalar($spec)) { + $this->metadata[$spec] = $value; + return $this; + } + if (!is_array($spec) && !$spec instanceof Traversable) { + throw new Exception\InvalidArgumentException(sprintf( + 'Expected a string, array, or Traversable argument in first position; received "%s"', + (is_object($spec) ? get_class($spec) : gettype($spec)) + )); + } + foreach ($spec as $key => $value) { + $this->metadata[$key] = $value; + } + return $this; + } + + /** + * Retrieve all metadata or a single metadatum as specified by key + * + * @param null|string|int $key + * @param null|mixed $default + * @throws Exception\InvalidArgumentException + * @return mixed + */ + public function getMetadata($key = null, $default = null) + { + if (null === $key) { + return $this->metadata; + } + + if (!is_scalar($key)) { + throw new Exception\InvalidArgumentException('Non-scalar argument provided for key'); + } + + if (array_key_exists($key, $this->metadata)) { + return $this->metadata[$key]; + } + + return $default; + } + + /** + * Set message content + * + * @param mixed $value + * @return Message + */ + public function setContent($value) + { + $this->content = $value; + return $this; + } + + /** + * Get message content + * + * @return mixed + */ + public function getContent() + { + return $this->content; + } + + /** + * @return string + */ + public function toString() + { + $request = ''; + foreach ($this->getMetadata() as $key => $value) { + $request .= sprintf( + "%s: %s\r\n", + (string) $key, + (string) $value + ); + } + $request .= "\r\n" . $this->getContent(); + return $request; + } +} diff --git a/vendor/Zend/Stdlib/MessageInterface.php b/vendor/Zend/Stdlib/MessageInterface.php new file mode 100644 index 0000000..28d8857 --- /dev/null +++ b/vendor/Zend/Stdlib/MessageInterface.php @@ -0,0 +1,44 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib; + +interface MessageInterface +{ + /** + * Set metadata + * + * @param string|int|array|\Traversable $spec + * @param mixed $value + */ + public function setMetadata($spec, $value = null); + + /** + * Get metadata + * + * @param null|string|int $key + * @return mixed + */ + public function getMetadata($key = null); + + /** + * Set content + * + * @param mixed $content + * @return mixed + */ + public function setContent($content); + + /** + * Get content + * + * @return mixed + */ + public function getContent(); +} diff --git a/vendor/Zend/Stdlib/ParameterObjectInterface.php b/vendor/Zend/Stdlib/ParameterObjectInterface.php new file mode 100644 index 0000000..676a6e2 --- /dev/null +++ b/vendor/Zend/Stdlib/ParameterObjectInterface.php @@ -0,0 +1,38 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib; + +interface ParameterObjectInterface +{ + /** + * @param string $key + * @param mixed $value + * @return void + */ + public function __set($key, $value); + + /** + * @param string $key + * @return mixed + */ + public function __get($key); + + /** + * @param string $key + * @return bool + */ + public function __isset($key); + + /** + * @param string $key + * @return void + */ + public function __unset($key); +} diff --git a/vendor/Zend/Stdlib/Parameters.php b/vendor/Zend/Stdlib/Parameters.php new file mode 100644 index 0000000..ab5ada9 --- /dev/null +++ b/vendor/Zend/Stdlib/Parameters.php @@ -0,0 +1,115 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib; + +use ArrayObject as PhpArrayObject; + +class Parameters extends PhpArrayObject implements ParametersInterface +{ + /** + * Constructor + * + * Enforces that we have an array, and enforces parameter access to array + * elements. + * + * @param array $values + */ + public function __construct(array $values = null) + { + if (null === $values) { + $values = []; + } + parent::__construct($values, ArrayObject::ARRAY_AS_PROPS); + } + + /** + * Populate from native PHP array + * + * @param array $values + * @return void + */ + public function fromArray(array $values) + { + $this->exchangeArray($values); + } + + /** + * Populate from query string + * + * @param string $string + * @return void + */ + public function fromString($string) + { + $array = []; + parse_str($string, $array); + $this->fromArray($array); + } + + /** + * Serialize to native PHP array + * + * @return array + */ + public function toArray() + { + return $this->getArrayCopy(); + } + + /** + * Serialize to query string + * + * @return string + */ + public function toString() + { + return http_build_query($this); + } + + /** + * Retrieve by key + * + * Returns null if the key does not exist. + * + * @param string $name + * @return mixed + */ + public function offsetGet($name) + { + if ($this->offsetExists($name)) { + return parent::offsetGet($name); + } + return; + } + + /** + * @param string $name + * @param mixed $default optional default value + * @return mixed + */ + public function get($name, $default = null) + { + if ($this->offsetExists($name)) { + return parent::offsetGet($name); + } + return $default; + } + + /** + * @param string $name + * @param mixed $value + * @return Parameters + */ + public function set($name, $value) + { + $this[$name] = $value; + return $this; + } +} diff --git a/vendor/Zend/Stdlib/ParametersInterface.php b/vendor/Zend/Stdlib/ParametersInterface.php new file mode 100644 index 0000000..feeda58 --- /dev/null +++ b/vendor/Zend/Stdlib/ParametersInterface.php @@ -0,0 +1,86 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib; + +use ArrayAccess; +use Countable; +use Serializable; +use Traversable; + +/* + * Basically, an ArrayObject. You could simply define something like: + * class QueryParams extends ArrayObject implements Parameters {} + * and have 90% of the functionality + */ +interface ParametersInterface extends ArrayAccess, Countable, Serializable, Traversable +{ + /** + * Constructor + * + * @param array $values + */ + public function __construct(array $values = null); + + /** + * From array + * + * Allow deserialization from standard array + * + * @param array $values + * @return mixed + */ + public function fromArray(array $values); + + /** + * From string + * + * Allow deserialization from raw body; e.g., for PUT requests + * + * @param $string + * @return mixed + */ + public function fromString($string); + + /** + * To array + * + * Allow serialization back to standard array + * + * @return mixed + */ + public function toArray(); + + /** + * To string + * + * Allow serialization to query format; e.g., for PUT or POST requests + * + * @return mixed + */ + public function toString(); + + /** + * Get + * + * @param string $name + * @param mixed|null $default + * @return mixed + */ + public function get($name, $default = null); + + /** + * Set + * + * @param string $name + * @param mixed $value + * @return ParametersInterface + */ + public function set($name, $value); +} diff --git a/vendor/Zend/Stdlib/PriorityList.php b/vendor/Zend/Stdlib/PriorityList.php new file mode 100644 index 0000000..b318f26 --- /dev/null +++ b/vendor/Zend/Stdlib/PriorityList.php @@ -0,0 +1,274 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib; + +use Countable; +use Iterator; + +class PriorityList implements Iterator, Countable +{ + const EXTR_DATA = 0x00000001; + const EXTR_PRIORITY = 0x00000002; + const EXTR_BOTH = 0x00000003; + /** + * Internal list of all items. + * + * @var array[] + */ + protected $items = []; + + /** + * Serial assigned to items to preserve LIFO. + * + * @var int + */ + protected $serial = 0; + + /** + * Serial order mode + * @var integer + */ + protected $isLIFO = 1; + + /** + * Internal counter to avoid usage of count(). + * + * @var int + */ + protected $count = 0; + + /** + * Whether the list was already sorted. + * + * @var bool + */ + protected $sorted = false; + + /** + * Insert a new item. + * + * @param string $name + * @param mixed $value + * @param int $priority + * + * @return void + */ + public function insert($name, $value, $priority = 0) + { + if (!isset($this->items[$name])) { + $this->count++; + } + + $this->sorted = false; + + $this->items[$name] = [ + 'data' => $value, + 'priority' => (int) $priority, + 'serial' => $this->serial++, + ]; + } + + /** + * @param string $name + * @param int $priority + * + * @return $this + * + * @throws \Exception + */ + public function setPriority($name, $priority) + { + if (!isset($this->items[$name])) { + throw new \Exception("item $name not found"); + } + + $this->items[$name]['priority'] = (int) $priority; + $this->sorted = false; + + return $this; + } + + /** + * Remove a item. + * + * @param string $name + * @return void + */ + public function remove($name) + { + if (isset($this->items[$name])) { + $this->count--; + } + + unset($this->items[$name]); + } + + /** + * Remove all items. + * + * @return void + */ + public function clear() + { + $this->items = []; + $this->serial = 0; + $this->count = 0; + $this->sorted = false; + } + + /** + * Get a item. + * + * @param string $name + * @return mixed + */ + public function get($name) + { + if (!isset($this->items[$name])) { + return; + } + + return $this->items[$name]['data']; + } + + /** + * Sort all items. + * + * @return void + */ + protected function sort() + { + if (!$this->sorted) { + uasort($this->items, [$this, 'compare']); + $this->sorted = true; + } + } + + /** + * Compare the priority of two items. + * + * @param array $item1, + * @param array $item2 + * @return int + */ + protected function compare(array $item1, array $item2) + { + return ($item1['priority'] === $item2['priority']) + ? ($item1['serial'] > $item2['serial'] ? -1 : 1) * $this->isLIFO + : ($item1['priority'] > $item2['priority'] ? -1 : 1); + } + + /** + * Get/Set serial order mode + * + * @param bool|null $flag + * + * @return bool + */ + public function isLIFO($flag = null) + { + if ($flag !== null) { + $isLifo = $flag === true ? 1 : -1; + + if ($isLifo !== $this->isLIFO) { + $this->isLIFO = $isLifo; + $this->sorted = false; + } + } + + return 1 === $this->isLIFO; + } + + /** + * {@inheritDoc} + */ + public function rewind() + { + $this->sort(); + reset($this->items); + } + + /** + * {@inheritDoc} + */ + public function current() + { + $this->sorted || $this->sort(); + $node = current($this->items); + + return $node ? $node['data'] : false; + } + + /** + * {@inheritDoc} + */ + public function key() + { + $this->sorted || $this->sort(); + return key($this->items); + } + + /** + * {@inheritDoc} + */ + public function next() + { + $node = next($this->items); + + return $node ? $node['data'] : false; + } + + /** + * {@inheritDoc} + */ + public function valid() + { + return current($this->items) !== false; + } + + /** + * @return self + */ + public function getIterator() + { + return clone $this; + } + + /** + * {@inheritDoc} + */ + public function count() + { + return $this->count; + } + + /** + * Return list as array + * + * @param int $flag + * + * @return array + */ + public function toArray($flag = self::EXTR_DATA) + { + $this->sort(); + + if ($flag == self::EXTR_BOTH) { + return $this->items; + } + + return array_map( + function ($item) use ($flag) { + return ($flag == PriorityList::EXTR_PRIORITY) ? $item['priority'] : $item['data']; + }, + $this->items + ); + } +} diff --git a/vendor/Zend/Stdlib/PriorityQueue.php b/vendor/Zend/Stdlib/PriorityQueue.php new file mode 100644 index 0000000..eded6ad --- /dev/null +++ b/vendor/Zend/Stdlib/PriorityQueue.php @@ -0,0 +1,301 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib; + +use Countable; +use IteratorAggregate; +use Serializable; + +/** + * Re-usable, serializable priority queue implementation + * + * SplPriorityQueue acts as a heap; on iteration, each item is removed from the + * queue. If you wish to re-use such a queue, you need to clone it first. This + * makes for some interesting issues if you wish to delete items from the queue, + * or, as already stated, iterate over it multiple times. + * + * This class aggregates items for the queue itself, but also composes an + * "inner" iterator in the form of an SplPriorityQueue object for performing + * the actual iteration. + */ +class PriorityQueue implements Countable, IteratorAggregate, Serializable +{ + const EXTR_DATA = 0x00000001; + const EXTR_PRIORITY = 0x00000002; + const EXTR_BOTH = 0x00000003; + + /** + * Inner queue class to use for iteration + * @var string + */ + protected $queueClass = 'Zend\Stdlib\SplPriorityQueue'; + + /** + * Actual items aggregated in the priority queue. Each item is an array + * with keys "data" and "priority". + * @var array + */ + protected $items = []; + + /** + * Inner queue object + * @var SplPriorityQueue + */ + protected $queue; + + /** + * Insert an item into the queue + * + * Priority defaults to 1 (low priority) if none provided. + * + * @param mixed $data + * @param int $priority + * @return PriorityQueue + */ + public function insert($data, $priority = 1) + { + $priority = (int) $priority; + $this->items[] = [ + 'data' => $data, + 'priority' => $priority, + ]; + $this->getQueue()->insert($data, $priority); + return $this; + } + + /** + * Remove an item from the queue + * + * This is different than {@link extract()}; its purpose is to dequeue an + * item. + * + * This operation is potentially expensive, as it requires + * re-initialization and re-population of the inner queue. + * + * Note: this removes the first item matching the provided item found. If + * the same item has been added multiple times, it will not remove other + * instances. + * + * @param mixed $datum + * @return bool False if the item was not found, true otherwise. + */ + public function remove($datum) + { + $found = false; + foreach ($this->items as $key => $item) { + if ($item['data'] === $datum) { + $found = true; + break; + } + } + if ($found) { + unset($this->items[$key]); + $this->queue = null; + + if (!$this->isEmpty()) { + $queue = $this->getQueue(); + foreach ($this->items as $item) { + $queue->insert($item['data'], $item['priority']); + } + } + return true; + } + return false; + } + + /** + * Is the queue empty? + * + * @return bool + */ + public function isEmpty() + { + return (0 === $this->count()); + } + + /** + * How many items are in the queue? + * + * @return int + */ + public function count() + { + return count($this->items); + } + + /** + * Peek at the top node in the queue, based on priority. + * + * @return mixed + */ + public function top() + { + return $this->getIterator()->top(); + } + + /** + * Extract a node from the inner queue and sift up + * + * @return mixed + */ + public function extract() + { + return $this->getQueue()->extract(); + } + + /** + * Retrieve the inner iterator + * + * SplPriorityQueue acts as a heap, which typically implies that as items + * are iterated, they are also removed. This does not work for situations + * where the queue may be iterated multiple times. As such, this class + * aggregates the values, and also injects an SplPriorityQueue. This method + * retrieves the inner queue object, and clones it for purposes of + * iteration. + * + * @return SplPriorityQueue + */ + public function getIterator() + { + $queue = $this->getQueue(); + return clone $queue; + } + + /** + * Serialize the data structure + * + * @return string + */ + public function serialize() + { + return serialize($this->items); + } + + /** + * Unserialize a string into a PriorityQueue object + * + * Serialization format is compatible with {@link Zend\Stdlib\SplPriorityQueue} + * + * @param string $data + * @return void + */ + public function unserialize($data) + { + foreach (unserialize($data) as $item) { + $this->insert($item['data'], $item['priority']); + } + } + + /** + * Serialize to an array + * + * By default, returns only the item data, and in the order registered (not + * sorted). You may provide one of the EXTR_* flags as an argument, allowing + * the ability to return priorities or both data and priority. + * + * @param int $flag + * @return array + */ + public function toArray($flag = self::EXTR_DATA) + { + switch ($flag) { + case self::EXTR_BOTH: + return $this->items; + case self::EXTR_PRIORITY: + return array_map(function ($item) { + return $item['priority']; + }, $this->items); + case self::EXTR_DATA: + default: + return array_map(function ($item) { + return $item['data']; + }, $this->items); + } + } + + /** + * Specify the internal queue class + * + * Please see {@link getIterator()} for details on the necessity of an + * internal queue class. The class provided should extend SplPriorityQueue. + * + * @param string $class + * @return PriorityQueue + */ + public function setInternalQueueClass($class) + { + $this->queueClass = (string) $class; + return $this; + } + + /** + * Does the queue contain the given datum? + * + * @param mixed $datum + * @return bool + */ + public function contains($datum) + { + foreach ($this->items as $item) { + if ($item['data'] === $datum) { + return true; + } + } + return false; + } + + /** + * Does the queue have an item with the given priority? + * + * @param int $priority + * @return bool + */ + public function hasPriority($priority) + { + foreach ($this->items as $item) { + if ($item['priority'] === $priority) { + return true; + } + } + return false; + } + + /** + * Get the inner priority queue instance + * + * @throws Exception\DomainException + * @return SplPriorityQueue + */ + protected function getQueue() + { + if (null === $this->queue) { + $this->queue = new $this->queueClass(); + if (!$this->queue instanceof \SplPriorityQueue) { + throw new Exception\DomainException(sprintf( + 'PriorityQueue expects an internal queue of type SplPriorityQueue; received "%s"', + get_class($this->queue) + )); + } + } + return $this->queue; + } + + /** + * Add support for deep cloning + * + * @return void + */ + public function __clone() + { + if (null !== $this->queue) { + $this->queue = clone $this->queue; + } + } +} diff --git a/vendor/Zend/Stdlib/Request.php b/vendor/Zend/Stdlib/Request.php new file mode 100644 index 0000000..7c08403 --- /dev/null +++ b/vendor/Zend/Stdlib/Request.php @@ -0,0 +1,15 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib; + +class Request extends Message implements RequestInterface +{ + // generic request implementation +} diff --git a/vendor/Zend/Stdlib/RequestInterface.php b/vendor/Zend/Stdlib/RequestInterface.php new file mode 100644 index 0000000..c2bac31 --- /dev/null +++ b/vendor/Zend/Stdlib/RequestInterface.php @@ -0,0 +1,14 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib; + +interface RequestInterface extends MessageInterface +{ +} diff --git a/vendor/Zend/Stdlib/Response.php b/vendor/Zend/Stdlib/Response.php new file mode 100644 index 0000000..f3074ba --- /dev/null +++ b/vendor/Zend/Stdlib/Response.php @@ -0,0 +1,15 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib; + +class Response extends Message implements ResponseInterface +{ + // generic response implementation +} diff --git a/vendor/Zend/Stdlib/ResponseInterface.php b/vendor/Zend/Stdlib/ResponseInterface.php new file mode 100644 index 0000000..fe94d30 --- /dev/null +++ b/vendor/Zend/Stdlib/ResponseInterface.php @@ -0,0 +1,14 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib; + +interface ResponseInterface extends MessageInterface +{ +} diff --git a/vendor/Zend/Stdlib/SplPriorityQueue.php b/vendor/Zend/Stdlib/SplPriorityQueue.php new file mode 100644 index 0000000..28b365d --- /dev/null +++ b/vendor/Zend/Stdlib/SplPriorityQueue.php @@ -0,0 +1,91 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib; + +use Serializable; + +/** + * Serializable version of SplPriorityQueue + * + * Also, provides predictable heap order for datums added with the same priority + * (i.e., they will be emitted in the same order they are enqueued). + */ +class SplPriorityQueue extends \SplPriorityQueue implements Serializable +{ + /** + * @var int Seed used to ensure queue order for items of the same priority + */ + protected $serial = PHP_INT_MAX; + + /** + * Insert a value with a given priority + * + * Utilizes {@var $serial} to ensure that values of equal priority are + * emitted in the same order in which they are inserted. + * + * @param mixed $datum + * @param mixed $priority + * @return void + */ + public function insert($datum, $priority) + { + if (!is_array($priority)) { + $priority = [$priority, $this->serial--]; + } + parent::insert($datum, $priority); + } + + /** + * Serialize to an array + * + * Array will be priority => data pairs + * + * @return array + */ + public function toArray() + { + $array = []; + foreach (clone $this as $item) { + $array[] = $item; + } + return $array; + } + + /** + * Serialize + * + * @return string + */ + public function serialize() + { + $clone = clone $this; + $clone->setExtractFlags(self::EXTR_BOTH); + + $data = []; + foreach ($clone as $item) { + $data[] = $item; + } + + return serialize($data); + } + + /** + * Deserialize + * + * @param string $data + * @return void + */ + public function unserialize($data) + { + foreach (unserialize($data) as $item) { + $this->insert($item['data'], $item['priority']); + } + } +} diff --git a/vendor/Zend/Stdlib/SplQueue.php b/vendor/Zend/Stdlib/SplQueue.php new file mode 100644 index 0000000..51d8daf --- /dev/null +++ b/vendor/Zend/Stdlib/SplQueue.php @@ -0,0 +1,55 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib; + +use Serializable; + +/** + * Serializable version of SplQueue + */ +class SplQueue extends \SplQueue implements Serializable +{ + /** + * Return an array representing the queue + * + * @return array + */ + public function toArray() + { + $array = []; + foreach ($this as $item) { + $array[] = $item; + } + return $array; + } + + /** + * Serialize + * + * @return string + */ + public function serialize() + { + return serialize($this->toArray()); + } + + /** + * Unserialize + * + * @param string $data + * @return void + */ + public function unserialize($data) + { + foreach (unserialize($data) as $item) { + $this->push($item); + } + } +} diff --git a/vendor/Zend/Stdlib/SplStack.php b/vendor/Zend/Stdlib/SplStack.php new file mode 100644 index 0000000..6ba2739 --- /dev/null +++ b/vendor/Zend/Stdlib/SplStack.php @@ -0,0 +1,55 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib; + +use Serializable; + +/** + * Serializable version of SplStack + */ +class SplStack extends \SplStack implements Serializable +{ + /** + * Serialize to an array representing the stack + * + * @return array + */ + public function toArray() + { + $array = []; + foreach ($this as $item) { + $array[] = $item; + } + return $array; + } + + /** + * Serialize + * + * @return string + */ + public function serialize() + { + return serialize($this->toArray()); + } + + /** + * Unserialize + * + * @param string $data + * @return void + */ + public function unserialize($data) + { + foreach (unserialize($data) as $item) { + $this->unshift($item); + } + } +} diff --git a/vendor/Zend/Stdlib/StringUtils.php b/vendor/Zend/Stdlib/StringUtils.php new file mode 100644 index 0000000..575cf2a --- /dev/null +++ b/vendor/Zend/Stdlib/StringUtils.php @@ -0,0 +1,187 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib; + +use Zend\Stdlib\StringWrapper\StringWrapperInterface; + +/** + * Utility class for handling strings of different character encodings + * using available PHP extensions. + * + * Declared abstract, as we have no need for instantiation. + */ +abstract class StringUtils +{ + /** + * Ordered list of registered string wrapper instances + * + * @var StringWrapperInterface[] + */ + protected static $wrapperRegistry = null; + + /** + * A list of known single-byte character encodings (upper-case) + * + * @var string[] + */ + protected static $singleByteEncodings = [ + 'ASCII', '7BIT', '8BIT', + 'ISO-8859-1', 'ISO-8859-2', 'ISO-8859-3', 'ISO-8859-4', 'ISO-8859-5', + 'ISO-8859-6', 'ISO-8859-7', 'ISO-8859-8', 'ISO-8859-9', 'ISO-8859-10', + 'ISO-8859-11', 'ISO-8859-13', 'ISO-8859-14', 'ISO-8859-15', 'ISO-8859-16', + 'CP-1251', 'CP-1252', + // TODO + ]; + + /** + * Is PCRE compiled with Unicode support? + * + * @var bool + **/ + protected static $hasPcreUnicodeSupport = null; + + /** + * Get registered wrapper classes + * + * @return string[] + */ + public static function getRegisteredWrappers() + { + if (static::$wrapperRegistry === null) { + static::$wrapperRegistry = []; + + if (extension_loaded('intl')) { + static::$wrapperRegistry[] = 'Zend\Stdlib\StringWrapper\Intl'; + } + + if (extension_loaded('mbstring')) { + static::$wrapperRegistry[] = 'Zend\Stdlib\StringWrapper\MbString'; + } + + if (extension_loaded('iconv')) { + static::$wrapperRegistry[] = 'Zend\Stdlib\StringWrapper\Iconv'; + } + + static::$wrapperRegistry[] = 'Zend\Stdlib\StringWrapper\Native'; + } + + return static::$wrapperRegistry; + } + + /** + * Register a string wrapper class + * + * @param string $wrapper + * @return void + */ + public static function registerWrapper($wrapper) + { + $wrapper = (string) $wrapper; + if (!in_array($wrapper, static::$wrapperRegistry, true)) { + static::$wrapperRegistry[] = $wrapper; + } + } + + /** + * Unregister a string wrapper class + * + * @param string $wrapper + * @return void + */ + public static function unregisterWrapper($wrapper) + { + $index = array_search((string) $wrapper, static::$wrapperRegistry, true); + if ($index !== false) { + unset(static::$wrapperRegistry[$index]); + } + } + + /** + * Reset all registered wrappers so the default wrappers will be used + * + * @return void + */ + public static function resetRegisteredWrappers() + { + static::$wrapperRegistry = null; + } + + /** + * Get the first string wrapper supporting the given character encoding + * and supports to convert into the given convert encoding. + * + * @param string $encoding Character encoding to support + * @param string|null $convertEncoding OPTIONAL character encoding to convert in + * @return StringWrapperInterface + * @throws Exception\RuntimeException If no wrapper supports given character encodings + */ + public static function getWrapper($encoding = 'UTF-8', $convertEncoding = null) + { + foreach (static::getRegisteredWrappers() as $wrapperClass) { + if ($wrapperClass::isSupported($encoding, $convertEncoding)) { + $wrapper = new $wrapperClass($encoding, $convertEncoding); + $wrapper->setEncoding($encoding, $convertEncoding); + return $wrapper; + } + } + + throw new Exception\RuntimeException( + 'No wrapper found supporting "' . $encoding . '"' + . (($convertEncoding !== null) ? ' and "' . $convertEncoding . '"' : '') + ); + } + + /** + * Get a list of all known single-byte character encodings + * + * @return string[] + */ + public static function getSingleByteEncodings() + { + return static::$singleByteEncodings; + } + + /** + * Check if a given encoding is a known single-byte character encoding + * + * @param string $encoding + * @return bool + */ + public static function isSingleByteEncoding($encoding) + { + return in_array(strtoupper($encoding), static::$singleByteEncodings); + } + + /** + * Check if a given string is valid UTF-8 encoded + * + * @param string $str + * @return bool + */ + public static function isValidUtf8($str) + { + return is_string($str) && ($str === '' || preg_match('/^./su', $str) == 1); + } + + /** + * Is PCRE compiled with Unicode support? + * + * @return bool + */ + public static function hasPcreUnicodeSupport() + { + if (static::$hasPcreUnicodeSupport === null) { + ErrorHandler::start(); + static::$hasPcreUnicodeSupport = defined('PREG_BAD_UTF8_OFFSET_ERROR') && preg_match('/\pL/u', 'a') == 1; + ErrorHandler::stop(); + } + return static::$hasPcreUnicodeSupport; + } +} diff --git a/vendor/Zend/Stdlib/StringWrapper/AbstractStringWrapper.php b/vendor/Zend/Stdlib/StringWrapper/AbstractStringWrapper.php new file mode 100644 index 0000000..3e395cc --- /dev/null +++ b/vendor/Zend/Stdlib/StringWrapper/AbstractStringWrapper.php @@ -0,0 +1,269 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\StringWrapper; + +use Zend\Stdlib\Exception; +use Zend\Stdlib\StringUtils; + +abstract class AbstractStringWrapper implements StringWrapperInterface +{ + /** + * The character encoding working on + * @var string|null + */ + protected $encoding = 'UTF-8'; + + /** + * An optionally character encoding to convert to + * @var string|null + */ + protected $convertEncoding; + + /** + * Check if the given character encoding is supported by this wrapper + * and the character encoding to convert to is also supported. + * + * @param string $encoding + * @param string|null $convertEncoding + * @return bool + */ + public static function isSupported($encoding, $convertEncoding = null) + { + $supportedEncodings = static::getSupportedEncodings(); + + if (!in_array(strtoupper($encoding), $supportedEncodings)) { + return false; + } + + if ($convertEncoding !== null && !in_array(strtoupper($convertEncoding), $supportedEncodings)) { + return false; + } + + return true; + } + + /** + * Set character encoding working with and convert to + * + * @param string $encoding The character encoding to work with + * @param string|null $convertEncoding The character encoding to convert to + * @return StringWrapperInterface + */ + public function setEncoding($encoding, $convertEncoding = null) + { + $supportedEncodings = static::getSupportedEncodings(); + + $encodingUpper = strtoupper($encoding); + if (!in_array($encodingUpper, $supportedEncodings)) { + throw new Exception\InvalidArgumentException( + 'Wrapper doesn\'t support character encoding "' . $encoding . '"' + ); + } + + if ($convertEncoding !== null) { + $convertEncodingUpper = strtoupper($convertEncoding); + if (!in_array($convertEncodingUpper, $supportedEncodings)) { + throw new Exception\InvalidArgumentException( + 'Wrapper doesn\'t support character encoding "' . $convertEncoding . '"' + ); + } + + $this->convertEncoding = $convertEncodingUpper; + } else { + $this->convertEncoding = null; + } + $this->encoding = $encodingUpper; + + return $this; + } + + /** + * Get the defined character encoding to work with + * + * @return string + * @throws Exception\LogicException If no encoding was defined + */ + public function getEncoding() + { + return $this->encoding; + } + + /** + * Get the defined character encoding to convert to + * + * @return string|null + */ + public function getConvertEncoding() + { + return $this->convertEncoding; + } + + /** + * Convert a string from defined character encoding to the defined convert encoding + * + * @param string $str + * @param bool $reverse + * @return string|false + */ + public function convert($str, $reverse = false) + { + $encoding = $this->getEncoding(); + $convertEncoding = $this->getConvertEncoding(); + if ($convertEncoding === null) { + throw new Exception\LogicException( + 'No convert encoding defined' + ); + } + + if ($encoding === $convertEncoding) { + return $str; + } + + $from = $reverse ? $convertEncoding : $encoding; + $to = $reverse ? $encoding : $convertEncoding; + throw new Exception\RuntimeException(sprintf( + 'Converting from "%s" to "%s" isn\'t supported by this string wrapper', + $from, + $to + )); + } + + /** + * Wraps a string to a given number of characters + * + * @param string $string + * @param int $width + * @param string $break + * @param bool $cut + * @return string|false + */ + public function wordWrap($string, $width = 75, $break = "\n", $cut = false) + { + $string = (string) $string; + if ($string === '') { + return ''; + } + + $break = (string) $break; + if ($break === '') { + throw new Exception\InvalidArgumentException('Break string cannot be empty'); + } + + $width = (int) $width; + if ($width === 0 && $cut) { + throw new Exception\InvalidArgumentException('Cannot force cut when width is zero'); + } + + if (StringUtils::isSingleByteEncoding($this->getEncoding())) { + return wordwrap($string, $width, $break, $cut); + } + + $stringWidth = $this->strlen($string); + $breakWidth = $this->strlen($break); + + $result = ''; + $lastStart = $lastSpace = 0; + + for ($current = 0; $current < $stringWidth; $current++) { + $char = $this->substr($string, $current, 1); + + $possibleBreak = $char; + if ($breakWidth !== 1) { + $possibleBreak = $this->substr($string, $current, $breakWidth); + } + + if ($possibleBreak === $break) { + $result .= $this->substr($string, $lastStart, $current - $lastStart + $breakWidth); + $current += $breakWidth - 1; + $lastStart = $lastSpace = $current + 1; + continue; + } + + if ($char === ' ') { + if ($current - $lastStart >= $width) { + $result .= $this->substr($string, $lastStart, $current - $lastStart) . $break; + $lastStart = $current + 1; + } + + $lastSpace = $current; + continue; + } + + if ($current - $lastStart >= $width && $cut && $lastStart >= $lastSpace) { + $result .= $this->substr($string, $lastStart, $current - $lastStart) . $break; + $lastStart = $lastSpace = $current; + continue; + } + + if ($current - $lastStart >= $width && $lastStart < $lastSpace) { + $result .= $this->substr($string, $lastStart, $lastSpace - $lastStart) . $break; + $lastStart = $lastSpace = $lastSpace + 1; + continue; + } + } + + if ($lastStart !== $current) { + $result .= $this->substr($string, $lastStart, $current - $lastStart); + } + + return $result; + } + + /** + * Pad a string to a certain length with another string + * + * @param string $input + * @param int $padLength + * @param string $padString + * @param int $padType + * @return string + */ + public function strPad($input, $padLength, $padString = ' ', $padType = STR_PAD_RIGHT) + { + if (StringUtils::isSingleByteEncoding($this->getEncoding())) { + return str_pad($input, $padLength, $padString, $padType); + } + + $lengthOfPadding = $padLength - $this->strlen($input); + if ($lengthOfPadding <= 0) { + return $input; + } + + $padStringLength = $this->strlen($padString); + if ($padStringLength === 0) { + return $input; + } + + $repeatCount = floor($lengthOfPadding / $padStringLength); + + if ($padType === STR_PAD_BOTH) { + $repeatCountLeft = $repeatCountRight = ($repeatCount - $repeatCount % 2) / 2; + + $lastStringLength = $lengthOfPadding - 2 * $repeatCountLeft * $padStringLength; + $lastStringLeftLength = $lastStringRightLength = floor($lastStringLength / 2); + $lastStringRightLength += $lastStringLength % 2; + + $lastStringLeft = $this->substr($padString, 0, $lastStringLeftLength); + $lastStringRight = $this->substr($padString, 0, $lastStringRightLength); + + return str_repeat($padString, $repeatCountLeft) . $lastStringLeft + . $input + . str_repeat($padString, $repeatCountRight) . $lastStringRight; + } + + $lastString = $this->substr($padString, 0, $lengthOfPadding % $padStringLength); + + if ($padType === STR_PAD_LEFT) { + return str_repeat($padString, $repeatCount) . $lastString . $input; + } + + return $input . str_repeat($padString, $repeatCount) . $lastString; + } +} diff --git a/vendor/Zend/Stdlib/StringWrapper/Iconv.php b/vendor/Zend/Stdlib/StringWrapper/Iconv.php new file mode 100644 index 0000000..46413ab --- /dev/null +++ b/vendor/Zend/Stdlib/StringWrapper/Iconv.php @@ -0,0 +1,289 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\StringWrapper; + +use Zend\Stdlib\Exception; + +class Iconv extends AbstractStringWrapper +{ + /** + * List of supported character sets (upper case) + * + * @var string[] + * @link http://www.gnu.org/software/libiconv/ + */ + protected static $encodings = [ + // European languages + 'ASCII', + 'ISO-8859-1', + 'ISO-8859-2', + 'ISO-8859-3', + 'ISO-8859-4', + 'ISO-8859-5', + 'ISO-8859-7', + 'ISO-8859-9', + 'ISO-8859-10', + 'ISO-8859-13', + 'ISO-8859-14', + 'ISO-8859-15', + 'ISO-8859-16', + 'KOI8-R', + 'KOI8-U', + 'KOI8-RU', + 'CP1250', + 'CP1251', + 'CP1252', + 'CP1253', + 'CP1254', + 'CP1257', + 'CP850', + 'CP866', + 'CP1131', + 'MACROMAN', + 'MACCENTRALEUROPE', + 'MACICELAND', + 'MACCROATIAN', + 'MACROMANIA', + 'MACCYRILLIC', + 'MACUKRAINE', + 'MACGREEK', + 'MACTURKISH', + 'MACINTOSH', + + // Semitic languages + 'ISO-8859-6', + 'ISO-8859-8', + 'CP1255', + 'CP1256', + 'CP862', + 'MACHEBREW', + 'MACARABIC', + + // Japanese + 'EUC-JP', + 'SHIFT_JIS', + 'CP932', + 'ISO-2022-JP', + 'ISO-2022-JP-2', + 'ISO-2022-JP-1', + + // Chinese + 'EUC-CN', + 'HZ', + 'GBK', + 'CP936', + 'GB18030', + 'EUC-TW', + 'BIG5', + 'CP950', + 'BIG5-HKSCS', + 'BIG5-HKSCS:2004', + 'BIG5-HKSCS:2001', + 'BIG5-HKSCS:1999', + 'ISO-2022-CN', + 'ISO-2022-CN-EXT', + + // Korean + 'EUC-KR', + 'CP949', + 'ISO-2022-KR', + 'JOHAB', + + // Armenian + 'ARMSCII-8', + + // Georgian + 'GEORGIAN-ACADEMY', + 'GEORGIAN-PS', + + // Tajik + 'KOI8-T', + + // Kazakh + 'PT154', + 'RK1048', + + // Thai + 'ISO-8859-11', + 'TIS-620', + 'CP874', + 'MACTHAI', + + // Laotian + 'MULELAO-1', + 'CP1133', + + // Vietnamese + 'VISCII', + 'TCVN', + 'CP1258', + + // Platform specifics + 'HP-ROMAN8', + 'NEXTSTEP', + + // Full Unicode + 'UTF-8', + 'UCS-2', + 'UCS-2BE', + 'UCS-2LE', + 'UCS-4', + 'UCS-4BE', + 'UCS-4LE', + 'UTF-16', + 'UTF-16BE', + 'UTF-16LE', + 'UTF-32', + 'UTF-32BE', + 'UTF-32LE', + 'UTF-7', + 'C99', + 'JAVA', + + /* Commented out because that's internal encodings not existing in real world + // Full Unicode, in terms of uint16_t or uint32_t (with machine dependent endianness and alignment) + 'UCS-2-INTERNAL', + 'UCS-4-INTERNAL', + + // Locale dependent, in terms of `char' or `wchar_t' (with machine dependent endianness and alignment, + // and with OS and locale dependent semantics) + 'char', + 'wchar_t', + '', // The empty encoding name is equivalent to "char": it denotes the locale dependent character encoding. + */ + + // When configured with the option --enable-extra-encodings, + // it also provides support for a few extra encodings: + + // European languages + 'CP437', + 'CP737', + 'CP775', + 'CP852', + 'CP853', + 'CP855', + 'CP857', + 'CP858', + 'CP860', + 'CP861', + 'CP863', + 'CP865', + 'CP869', + 'CP1125', + + // Semitic languages + 'CP864', + + // Japanese + 'EUC-JISX0213', + 'Shift_JISX0213', + 'ISO-2022-JP-3', + + // Chinese + 'BIG5-2003', // (experimental) + + // Turkmen + 'TDS565', + + // Platform specifics + 'ATARIST', + 'RISCOS-LATIN1', + ]; + + /** + * Get a list of supported character encodings + * + * @return string[] + */ + public static function getSupportedEncodings() + { + return static::$encodings; + } + + /** + * Constructor + * + * @throws Exception\ExtensionNotLoadedException + */ + public function __construct() + { + if (!extension_loaded('iconv')) { + throw new Exception\ExtensionNotLoadedException( + 'PHP extension "iconv" is required for this wrapper' + ); + } + } + + /** + * Returns the length of the given string + * + * @param string $str + * @return int|false + */ + public function strlen($str) + { + return iconv_strlen($str, $this->getEncoding()); + } + + /** + * Returns the portion of string specified by the start and length parameters + * + * @param string $str + * @param int $offset + * @param int|null $length + * @return string|false + */ + public function substr($str, $offset = 0, $length = null) + { + return iconv_substr($str, $offset, $length, $this->getEncoding()); + } + + /** + * Find the position of the first occurrence of a substring in a string + * + * @param string $haystack + * @param string $needle + * @param int $offset + * @return int|false + */ + public function strpos($haystack, $needle, $offset = 0) + { + return iconv_strpos($haystack, $needle, $offset, $this->getEncoding()); + } + + /** + * Convert a string from defined encoding to the defined convert encoding + * + * @param string $str + * @param bool $reverse + * @return string|false + */ + public function convert($str, $reverse = false) + { + $encoding = $this->getEncoding(); + $convertEncoding = $this->getConvertEncoding(); + if ($convertEncoding === null) { + throw new Exception\LogicException( + 'No convert encoding defined' + ); + } + + if ($encoding === $convertEncoding) { + return $str; + } + + $fromEncoding = $reverse ? $convertEncoding : $encoding; + $toEncoding = $reverse ? $encoding : $convertEncoding; + + // automatically add "//IGNORE" to not stop converting on invalid characters + // invalid characters triggers a notice anyway + return iconv($fromEncoding, $toEncoding . '//IGNORE', $str); + } +} diff --git a/vendor/Zend/Stdlib/StringWrapper/Intl.php b/vendor/Zend/Stdlib/StringWrapper/Intl.php new file mode 100644 index 0000000..eaab28f --- /dev/null +++ b/vendor/Zend/Stdlib/StringWrapper/Intl.php @@ -0,0 +1,88 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\StringWrapper; + +use Zend\Stdlib\Exception; + +class Intl extends AbstractStringWrapper +{ + /** + * List of supported character sets (upper case) + * + * @var string[] + */ + protected static $encodings = ['UTF-8']; + + /** + * Get a list of supported character encodings + * + * @return string[] + */ + public static function getSupportedEncodings() + { + return static::$encodings; + } + + /** + * Constructor + * + * @throws Exception\ExtensionNotLoadedException + */ + public function __construct() + { + if (!extension_loaded('intl')) { + throw new Exception\ExtensionNotLoadedException( + 'PHP extension "intl" is required for this wrapper' + ); + } + } + + /** + * Returns the length of the given string + * + * @param string $str + * @return int|false + */ + public function strlen($str) + { + return grapheme_strlen($str); + } + + /** + * Returns the portion of string specified by the start and length parameters + * + * @param string $str + * @param int $offset + * @param int|null $length + * @return string|false + */ + public function substr($str, $offset = 0, $length = null) + { + // Due fix of PHP #62759 The third argument returns an empty string if is 0 or null. + if ($length !== null) { + return grapheme_substr($str, $offset, $length); + } + + return grapheme_substr($str, $offset); + } + + /** + * Find the position of the first occurrence of a substring in a string + * + * @param string $haystack + * @param string $needle + * @param int $offset + * @return int|false + */ + public function strpos($haystack, $needle, $offset = 0) + { + return grapheme_strpos($haystack, $needle, $offset); + } +} diff --git a/vendor/Zend/Stdlib/StringWrapper/MbString.php b/vendor/Zend/Stdlib/StringWrapper/MbString.php new file mode 100644 index 0000000..d6db185 --- /dev/null +++ b/vendor/Zend/Stdlib/StringWrapper/MbString.php @@ -0,0 +1,121 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\StringWrapper; + +use Zend\Stdlib\Exception; + +class MbString extends AbstractStringWrapper +{ + /** + * List of supported character sets (upper case) + * + * @var null|string[] + * @link http://php.net/manual/mbstring.supported-encodings.php + */ + protected static $encodings = null; + + /** + * Get a list of supported character encodings + * + * @return string[] + */ + public static function getSupportedEncodings() + { + if (static::$encodings === null) { + static::$encodings = array_map('strtoupper', mb_list_encodings()); + + // FIXME: Converting € (UTF-8) to ISO-8859-16 gives a wrong result + $indexIso885916 = array_search('ISO-8859-16', static::$encodings, true); + if ($indexIso885916 !== false) { + unset(static::$encodings[$indexIso885916]); + } + } + + return static::$encodings; + } + + /** + * Constructor + * + * @throws Exception\ExtensionNotLoadedException + */ + public function __construct() + { + if (!extension_loaded('mbstring')) { + throw new Exception\ExtensionNotLoadedException( + 'PHP extension "mbstring" is required for this wrapper' + ); + } + } + + /** + * Returns the length of the given string + * + * @param string $str + * @return int|false + */ + public function strlen($str) + { + return mb_strlen($str, $this->getEncoding()); + } + + /** + * Returns the portion of string specified by the start and length parameters + * + * @param string $str + * @param int $offset + * @param int|null $length + * @return string|false + */ + public function substr($str, $offset = 0, $length = null) + { + return mb_substr($str, $offset, $length, $this->getEncoding()); + } + + /** + * Find the position of the first occurrence of a substring in a string + * + * @param string $haystack + * @param string $needle + * @param int $offset + * @return int|false + */ + public function strpos($haystack, $needle, $offset = 0) + { + return mb_strpos($haystack, $needle, $offset, $this->getEncoding()); + } + + /** + * Convert a string from defined encoding to the defined convert encoding + * + * @param string $str + * @param bool $reverse + * @return string|false + */ + public function convert($str, $reverse = false) + { + $encoding = $this->getEncoding(); + $convertEncoding = $this->getConvertEncoding(); + + if ($convertEncoding === null) { + throw new Exception\LogicException( + 'No convert encoding defined' + ); + } + + if ($encoding === $convertEncoding) { + return $str; + } + + $fromEncoding = $reverse ? $convertEncoding : $encoding; + $toEncoding = $reverse ? $encoding : $convertEncoding; + return mb_convert_encoding($str, $toEncoding, $fromEncoding); + } +} diff --git a/vendor/Zend/Stdlib/StringWrapper/Native.php b/vendor/Zend/Stdlib/StringWrapper/Native.php new file mode 100644 index 0000000..38b3c10 --- /dev/null +++ b/vendor/Zend/Stdlib/StringWrapper/Native.php @@ -0,0 +1,134 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\StringWrapper; + +use Zend\Stdlib\Exception; +use Zend\Stdlib\StringUtils; + +class Native extends AbstractStringWrapper +{ + /** + * The character encoding working on + * (overwritten to change defaut encoding) + * + * @var string + */ + protected $encoding = 'ASCII'; + + /** + * Check if the given character encoding is supported by this wrapper + * and the character encoding to convert to is also supported. + * + * @param string $encoding + * @param string|null $convertEncoding + * @return bool + */ + public static function isSupported($encoding, $convertEncoding = null) + { + $encodingUpper = strtoupper($encoding); + $supportedEncodings = static::getSupportedEncodings(); + + if (!in_array($encodingUpper, $supportedEncodings)) { + return false; + } + + // This adapter doesn't support to convert between encodings + if ($convertEncoding !== null && $encodingUpper !== strtoupper($convertEncoding)) { + return false; + } + + return true; + } + + /** + * Get a list of supported character encodings + * + * @return string[] + */ + public static function getSupportedEncodings() + { + return StringUtils::getSingleByteEncodings(); + } + + /** + * Set character encoding working with and convert to + * + * @param string $encoding The character encoding to work with + * @param string|null $convertEncoding The character encoding to convert to + * @return StringWrapperInterface + */ + public function setEncoding($encoding, $convertEncoding = null) + { + $supportedEncodings = static::getSupportedEncodings(); + + $encodingUpper = strtoupper($encoding); + if (!in_array($encodingUpper, $supportedEncodings)) { + throw new Exception\InvalidArgumentException( + 'Wrapper doesn\'t support character encoding "' . $encoding . '"' + ); + } + + if ($encodingUpper !== strtoupper($convertEncoding)) { + $this->convertEncoding = $encodingUpper; + } + + if ($convertEncoding !== null) { + if ($encodingUpper !== strtoupper($convertEncoding)) { + throw new Exception\InvalidArgumentException( + 'Wrapper doesn\'t support to convert between character encodings' + ); + } + + $this->convertEncoding = $encodingUpper; + } else { + $this->convertEncoding = null; + } + $this->encoding = $encodingUpper; + + return $this; + } + + /** + * Returns the length of the given string + * + * @param string $str + * @return int|false + */ + public function strlen($str) + { + return strlen($str); + } + + /** + * Returns the portion of string specified by the start and length parameters + * + * @param string $str + * @param int $offset + * @param int|null $length + * @return string|false + */ + public function substr($str, $offset = 0, $length = null) + { + return substr($str, $offset, $length); + } + + /** + * Find the position of the first occurrence of a substring in a string + * + * @param string $haystack + * @param string $needle + * @param int $offset + * @return int|false + */ + public function strpos($haystack, $needle, $offset = 0) + { + return strpos($haystack, $needle, $offset); + } +} diff --git a/vendor/Zend/Stdlib/StringWrapper/StringWrapperInterface.php b/vendor/Zend/Stdlib/StringWrapper/StringWrapperInterface.php new file mode 100644 index 0000000..f25b325 --- /dev/null +++ b/vendor/Zend/Stdlib/StringWrapper/StringWrapperInterface.php @@ -0,0 +1,111 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + +namespace Zend\Stdlib\StringWrapper; + +interface StringWrapperInterface +{ + /** + * Check if the given character encoding is supported by this wrapper + * and the character encoding to convert to is also supported. + * + * @param string $encoding + * @param string|null $convertEncoding + */ + public static function isSupported($encoding, $convertEncoding = null); + + /** + * Get a list of supported character encodings + * + * @return string[] + */ + public static function getSupportedEncodings(); + + /** + * Set character encoding working with and convert to + * + * @param string $encoding The character encoding to work with + * @param string|null $convertEncoding The character encoding to convert to + * @return StringWrapperInterface + */ + public function setEncoding($encoding, $convertEncoding = null); + + /** + * Get the defined character encoding to work with (upper case) + * + * @return string + */ + public function getEncoding(); + + /** + * Get the defined character encoding to convert to (upper case) + * + * @return string|null + */ + public function getConvertEncoding(); + + /** + * Returns the length of the given string + * + * @param string $str + * @return int|false + */ + public function strlen($str); + + /** + * Returns the portion of string specified by the start and length parameters + * + * @param string $str + * @param int $offset + * @param int|null $length + * @return string|false + */ + public function substr($str, $offset = 0, $length = null); + + /** + * Find the position of the first occurrence of a substring in a string + * + * @param string $haystack + * @param string $needle + * @param int $offset + * @return int|false + */ + public function strpos($haystack, $needle, $offset = 0); + + /** + * Convert a string from defined encoding to the defined convert encoding + * + * @param string $str + * @param bool $reverse + * @return string|false + */ + public function convert($str, $reverse = false); + + /** + * Wraps a string to a given number of characters + * + * @param string $str + * @param int $width + * @param string $break + * @param bool $cut + * @return string + */ + public function wordWrap($str, $width = 75, $break = "\n", $cut = false); + + /** + * Pad a string to a certain length with another string + * + * @param string $input + * @param int $padLength + * @param string $padString + * @param int $padType + * @return string + */ + public function strPad($input, $padLength, $padString = ' ', $padType = STR_PAD_RIGHT); +} diff --git a/vendor/Zend/Stdlib/compatibility/autoload.php b/vendor/Zend/Stdlib/compatibility/autoload.php new file mode 100644 index 0000000..f8670cc --- /dev/null +++ b/vendor/Zend/Stdlib/compatibility/autoload.php @@ -0,0 +1,14 @@ +<?php +/** + * Zend Framework (http://framework.zend.com/) + * + * @link http://github.com/zendframework/zf2 for the canonical source repository + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + * @deprecated + */ + +/** + * Legacy purposes only, to prevent code that references it from breaking. + */ +trigger_error('Polyfill autoload support (file library/Zend/Stdlib/compatibility/autoload.php) is no longer necessary; please remove your require statement referencing this file', E_USER_DEPRECATED);