ICanBoogie/bind-routing 0.2.x
  • Namespace
  • Class

Namespaces

  • ICanBoogie
    • Binding
      • Routing

Classes

  • BeforeSynthesizeRoutesEvent
  • Hooks
  • SynthesizeRoutesEvent

Traits

  • ControllerBindings
  • CoreBindings
  • ForwardUndefinedPropertiesToApplication
  1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96  97  98  99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 
<?php

/*
 * This file is part of the ICanBoogie package.
 *
 * (c) Olivier Laviale <olivier.laviale@gmail.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace ICanBoogie\Binding\Routing;

use ICanBoogie\Core;
use ICanBoogie\HTTP\RequestDispatcher;
use ICanBoogie\HTTP\WeightedDispatcher;
use ICanBoogie\Routing\ControllerNotDefined;
use ICanBoogie\Routing\Route;
use ICanBoogie\Routing\RouteDispatcher;
use ICanBoogie\Routing\PatternNotDefined;
use ICanBoogie\Routing\RouteCollection;

class Hooks
{
    /*
     * Events
     */

    /**
     * Synthesize the `routes` config from `routes` fragments.
     *
     * @param array $fragments
     *
     * @return array
     *
     * @throws PatternNotDefined if a pattern is missing from a route definition.
     * @throws ControllerNotDefined if a controller is missing from a route definition and no
     * location is defined.
     */
    static public function synthesize_routes_config(array $fragments)
    {
        new BeforeSynthesizeRoutesEvent($fragments);

        $routes = [];

        foreach ($fragments as $pathname => $fragment)
        {
            foreach ($fragment as $id => $route)
            {
                if (empty($route['pattern']))
                {
                    throw new PatternNotDefined(\ICanBoogie\format("Pattern is not defined for route %id in %pathname.", [

                        'id' => $id,
                        'pathname' => $pathname

                    ]));
                }

                if (empty($route['controller']) && empty($route['location']))
                {
                    throw new ControllerNotDefined(\ICanBoogie\format("Controller is not defined for route %id in %pathname.", [

                        'id' => $id,
                        'pathname' => $pathname

                    ]));
                }

                $routes[$id] = [ '__ORIGIN__' => $pathname ] + $route;
            }
        }

        new SynthesizeRoutesEvent($routes);

        return $routes;
    }

    /**
     * Adds the `routing` dispatcher.
     *
     * @param RequestDispatcher\AlterEvent $event
     * @param RequestDispatcher $target
     */
    static public function alter_dispatcher(RequestDispatcher\AlterEvent $event, RequestDispatcher $target)
    {
        $dispatcher = new RouteDispatcher(self::app()->routes);

        $target['routing'] = new WeightedDispatcher($dispatcher, WeightedDispatcher::WEIGHT_TOP);
    }

    /*
     * Prototypes
     */

    /**
     * Returns the route collection.
     *
     * @param Core|CoreBindings $app
     *
     * @return RouteCollection
     */
    static public function get_routes(Core $app)
    {
        static $routes;

        if (!$routes)
        {
            $routes = new RouteCollection($app->configs['routes'] ?: []);
        }

        return $routes;
    }

    /**
     * Returns the contextualized URL of a route.
     *
     * @param Core|CoreBindings $app
     * @param string|Route $route
     * @param array|object|null $values
     *
     * @return string
     */
    static public function url_for(Core $app, $route, $values = null)
    {
        if (!$route instanceof Route)
        {
            $route = $app->routes[$route];
        }

        $url = $route->format($values);

        return \ICanBoogie\Routing\contextualize($url);
    }

    /*
     * Support
     */

    /**
     * @return Core|CoreBindings
     */
    static private function app()
    {
        return \ICanBoogie\app();
    }
}
ICanBoogie/bind-routing 0.2.x API documentation generated by ApiGen