Skip to content

Commit

Permalink
Refactor of routes
Browse files Browse the repository at this point in the history
  • Loading branch information
dmongeau committed Feb 7, 2018
1 parent ff5e7f9 commit 15d495a
Show file tree
Hide file tree
Showing 12 changed files with 337 additions and 239 deletions.
13 changes: 13 additions & 0 deletions src/Folklore/Panneau/Http/Controllers/DefinitionController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php

namespace Folklore\Panneau\Http\Controllers;

use Illuminate\Http\Request;

class DefinitionController extends Controller
{
public function layout(Request $request)
{
return app('panneau')->layout();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,8 @@

class LayoutController extends Controller
{
public function definition(Request $request)
public function index(Request $request)
{
$definition = app('panneau')->layout()->toArray();
return $definition;
return view('panneau::page');
}
}
9 changes: 3 additions & 6 deletions src/Folklore/Panneau/Http/Middlewares/InjectResource.php
Original file line number Diff line number Diff line change
Expand Up @@ -33,23 +33,20 @@ public function handle(Request $request, Closure $next)

protected function getResourceNameFromRequest(Request $request)
{
$resourceParamName = config('panneau.route.resource_param');
$resourceParamName = config('panneau.routes.parameters.resource');
// Get the route parameter if set
if (!is_null($request->route($resourceParamName))) {
return $request->route($resourceParamName);
}
// If not set (implying a custom controller with predefined
// route path), get the action's parameter
$action = $request->route()->getAction();
if (isset($action[$resourceParamName])) {
return $action[$resourceParamName];
}
return null;
return array_get($action, 'resource', null);
}

protected function getResourceIdFromRequest(Request $request)
{
$idParamName = config('panneau.route.id_param');
$idParamName = config('panneau.routes.parameters.id');
// Get the route parameter
if (!is_null($request->route($idParamName))) {
return $request->route($idParamName);
Expand Down
200 changes: 151 additions & 49 deletions src/Folklore/Panneau/Panneau.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,22 +9,19 @@

class Panneau
{
protected $name;
protected $container;
protected $resources;
protected $blocks;
protected $layout;
protected $routes;

public function __construct(Container $container)
{
$this->container = $container;
protected $app;
protected $name = 'Simple Panneau';
protected $resources = [];
protected $resourcesInstances = [];
protected $blocks = [];
protected $layout = null;
protected $defaultRoutes = [];
protected $customRoutes = [];

$this->name = 'Simple Panneau';
$this->resources = [];
$this->blocks = [];
$this->layout = null;
$this->routes = [];
public function __construct($app)
{
$this->app = $app;
}

public function setName($name)
Expand All @@ -37,72 +34,140 @@ public function name()
return $this->name;
}

public function setResource($id, $resource)
public function setCustomRoutes($routes)
{
$this->resources[$id] = $resource;
$this->customRoutes = $routes;
}

public function setResources(array $resources)
public function getCustomRoutes()
{
foreach ($resources as $id => $definition) {
$this->setResource($id, $definition);
}
return $this->customRoutes;
}

public function setBlock($id, $block)
public function setDefaultRoutes($routes)
{
$this->blocks[$id] = $block;
$this->defaultRoutes = $routes;
}

public function setBlocks(array $blocks)
public function getDefaultRoutes()
{
foreach ($blocks as $id => $definition) {
$this->setBlock($id, $definition);
return $this->defaultRoutes;
}



public function getResourcesRoutes()
{
$registrar = $this->app['panneau.registrar'];
$routes = array_values($registrar->getRoutesNames('resource'));
$resources = $this->getResources();
foreach ($resources as $resource) {
$customController = $resource->getController();
if (!is_null($customController)) {
$resourceRoutes = $registrar->getRoutesNames($resource->getId());
$routes = array_merge($routes, array_values($resourceRoutes));
}
}
return $routes;
}

public function getResourceRoutes($id)
{
$registrar = $this->app['panneau.registrar'];
return $registrar->getRoutesNames($id);
}

public function setRoutes($routes)
public function getAllRoutes()
{
$this->routes = $routes;
$defaultRoutes = $this->getDefaultRoutes();
$resourcesRoutes = $this->getResourcesRoutes();
$customRoutes = $this->getCustomRoutes();
return array_merge($defaultRoutes, $resourcesRoutes, $customRoutes);
}

public function routes()
{
$prefix = config('panneau.route.prefix');
$this->updateRouterPatterns();

// @TODO do something better
$routes = [
'home' => '/'.$prefix,
];
foreach ($this->routes as $action => $definition) {
$path = $definition['path'];
if (!empty($prefix)) {
$path = '/'.$prefix.$path;
}
$routes['resource.'.$action] = $path;
if ($this->app->routesAreCached()) {
return;
}
return $routes;

$router = $this->app->bound('router') ? $this->app['router'] : $this->app;
$config = $this->app['config']->get('panneau.routes', []);
$routeGroupConfig = array_only($config, ['prefix', 'namespace', 'middleware', 'domain']);
$router->group($routeGroupConfig, function ($router) use ($config) {
$controllers = array_get($config, 'controllers', []);
$resources = $this->getResources();
$routesPath = is_file(base_path('routes/panneau.php')) ?
base_path('routes/panneau.php') : (__DIR__ . '/../../routes/panneau.php');
require $routesPath;
});
}

public function resource($id)
public function setResource($id, $resource)
{
$this->resources[$id] = $resource;
}

public function setResources(array $resources)
{
foreach ($resources as $id => $definition) {
$this->setResource($id, $definition);
}
}

public function resource($id, $fresh = false)
{
if (!array_key_exists($id, $this->resources)) {
return null;
}

if (!$fresh && isset($this->resourcesInstances[$id])) {
return $this->resourcesInstances[$id];
}

$resource = $this->resources[$id];

if (is_string($resource)) {
// Assume a resource class path, get instance
$resource = app($resource);
} else {
// Create new instance from data array
$resource = new Resource($resource + ['id' => $id]);
$resource = new Resource($resource);
}

// Set id from specified id
$resource->setId($id);

if (!$fresh) {
$this->resourcesInstances[$id] = $resource;
}

return $resource;
}

public function getResources($fresh = false)
{
$resources = [];
foreach ($this->resources as $id => $resource) {
$resources[] = $this->resource($id, $fresh);
}
return $resources;
}

public function setBlock($id, $block)
{
$this->blocks[$id] = $block;
}

public function setBlocks(array $blocks)
{
foreach ($blocks as $id => $definition) {
$this->setBlock($id, $definition);
}
}

public function block($id)
{
if (!array_key_exists($id, $this->blocks)) {
Expand Down Expand Up @@ -145,14 +210,8 @@ public function layout()
public function getDefinition()
{
$name = $this->name();

$routes = $this->routes();

$resources = [];
foreach ($this->resources as $id => $resource) {
$resources[] = $this->resource($id);
}

$routes = $this->getRoutesForDefinition();
$resources = $this->getResources();
$layout = $this->layout();

return new PanneauDefinition([
Expand All @@ -162,4 +221,47 @@ public function getDefinition()
'layout' => $layout,
]);
}

public function getRoutesForResource($resource)
{
$routes = $this->getResourceRoutes($resource);
return $this->getPathsFromRoutes($routes);
}

public function getRoutesForDefinition()
{
$routes = $this->getAllRoutes();
return $this->getPathsFromRoutes($routes);
}

protected function updateRouterPatterns()
{
$router = $this->app->bound('router') ? $this->app['router'] : $this->app;
$resources = $this->getResources();
$paramName = $this->app['config']->get('panneau.routes.parameters.resource', 'resource');
$ids = [];
foreach ($resources as $resource) {
if (is_null($resource->getController())) {
$ids[] = $resource->getId();
}
}
$router->pattern($paramName, implode('|', $ids));
}

protected function getPathsFromRoutes($routes)
{
$paths = [];
$allRoutes = $this->app['router']->getRoutes();
foreach ($routes as $name) {
$route = is_string($name) ? $allRoutes->getByName($name) : $name;
$parameters = $route->parameterNames();
$params = [];
foreach ($parameters as $parameter) {
$params[] = ':'.$parameter;
}
$key = preg_replace('/^panneau\./', '', $name);
$paths[$key] = route($name, $params, false);
}
return $paths;
}
}
Loading

0 comments on commit 15d495a

Please sign in to comment.