|
@@ -14,9 +14,11 @@
|
|
|
*/
|
|
*/
|
|
|
namespace Cake\Routing\Middleware;
|
|
namespace Cake\Routing\Middleware;
|
|
|
|
|
|
|
|
|
|
+use Cake\Http\BaseApplication;
|
|
|
use Cake\Http\MiddlewareQueue;
|
|
use Cake\Http\MiddlewareQueue;
|
|
|
use Cake\Http\Runner;
|
|
use Cake\Http\Runner;
|
|
|
use Cake\Routing\Exception\RedirectException;
|
|
use Cake\Routing\Exception\RedirectException;
|
|
|
|
|
+use Cake\Routing\RouteBuilder;
|
|
|
use Cake\Routing\Router;
|
|
use Cake\Routing\Router;
|
|
|
use Psr\Http\Message\ResponseInterface;
|
|
use Psr\Http\Message\ResponseInterface;
|
|
|
use Psr\Http\Message\ServerRequestInterface;
|
|
use Psr\Http\Message\ServerRequestInterface;
|
|
@@ -29,10 +31,38 @@ use Zend\Diactoros\Response\RedirectResponse;
|
|
|
class RoutingMiddleware
|
|
class RoutingMiddleware
|
|
|
{
|
|
{
|
|
|
/**
|
|
/**
|
|
|
|
|
+ * Constructor
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param \Cake\Http\BaseApplication $app The application instance that routes are defined on.
|
|
|
|
|
+ */
|
|
|
|
|
+ public function __construct(BaseApplication $app = null)
|
|
|
|
|
+ {
|
|
|
|
|
+ $this->app = $app;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * Trigger the application's routes() hook if the application exists.
|
|
|
|
|
+ *
|
|
|
|
|
+ * If the middleware is created without an Application, routes will be
|
|
|
|
|
+ * loaded via the automatic route loading that pre-dates the routes() hook.
|
|
|
|
|
+ *
|
|
|
|
|
+ * @return void
|
|
|
|
|
+ */
|
|
|
|
|
+ protected function loadRoutes()
|
|
|
|
|
+ {
|
|
|
|
|
+ if ($this->app) {
|
|
|
|
|
+ $builder = Router::getRouteBuilder('/');
|
|
|
|
|
+ $this->app->routes($builder);
|
|
|
|
|
+ // Prevent routes from being loaded again
|
|
|
|
|
+ Router::$initialized = true;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
* Apply routing and update the request.
|
|
* Apply routing and update the request.
|
|
|
*
|
|
*
|
|
|
- * Any route/path specific middleware will be wrapped around $next and then the new middleware stack
|
|
|
|
|
- * will be invoked.
|
|
|
|
|
|
|
+ * Any route/path specific middleware will be wrapped around $next and then the new middleware stack will be
|
|
|
|
|
+ * invoked.
|
|
|
*
|
|
*
|
|
|
* @param \Psr\Http\Message\ServerRequestInterface $request The request.
|
|
* @param \Psr\Http\Message\ServerRequestInterface $request The request.
|
|
|
* @param \Psr\Http\Message\ResponseInterface $response The response.
|
|
* @param \Psr\Http\Message\ResponseInterface $response The response.
|
|
@@ -41,6 +71,7 @@ class RoutingMiddleware
|
|
|
*/
|
|
*/
|
|
|
public function __invoke(ServerRequestInterface $request, ResponseInterface $response, $next)
|
|
public function __invoke(ServerRequestInterface $request, ResponseInterface $response, $next)
|
|
|
{
|
|
{
|
|
|
|
|
+ $this->loadRoutes();
|
|
|
try {
|
|
try {
|
|
|
Router::setRequestContext($request);
|
|
Router::setRequestContext($request);
|
|
|
$params = (array)$request->getAttribute('params', []);
|
|
$params = (array)$request->getAttribute('params', []);
|