Skip to content

Instantly share code, notes, and snippets.

@cotcotquedec
Last active February 23, 2017 09:04
Show Gist options
  • Save cotcotquedec/df15f9111e5c8d118ac270f6a157c460 to your computer and use it in GitHub Desktop.
Save cotcotquedec/df15f9111e5c8d118ac270f6a157c460 to your computer and use it in GitHub Desktop.
Load route from controller reflexion for laravel 5.3 as Route::controller is no more
<?php namespace App\Http;
use BetterReflection\Reflection\ReflectionClass;
/**
* Class Route
*
* Installation :
* package require https://github.com/Roave/BetterReflection
* $ composer require roave/better-reflection
*
* Put this file into app/Http
*
* @package App\Http
*/
class Route {
/**
* Controller de l'application reflect
*
* @var array
*/
protected $controllers = [
'user' => Controllers\UserController::class,
'schedule' => Controllers\ScheduleController::class,
'reference' => Controllers\ReferenceController::class,
'partner' => Controllers\PartnerController::class,
'private' => Controllers\PrivateController::class,
'payment' => Controllers\PaymentController::class,
];
/**
* Chargement des route a partir des controller
*
*/
static function load() {
$class = new static;
foreach ($class->getControllers() as $prefix => $controller) {
$class->loadRouteFromController($prefix, $controller);
}
}
/**
* getter for $controllers
*
* @return array
*/
public function getControllers()
{
return $this->controllers;
}
/**
* Load route for $controller
*
* @param $prefix
* @param $controller
*/
public function loadRouteFromController($prefix, $controller)
{
// on charge le controller
new \ReflectionClass($controller);
$reflection = ReflectionClass::createFromName($controller);
// on scan les methods
foreach ($reflection->getMethods() as $method) {
// nom de la method
$name = $method->getName();
// si la method appartient a Illuminate on zap
if (preg_match('#^Illuminate#', $method->getDeclaringClass()->getName())) {
continue;
}
// Recuperation de la syntaxe de la router controller
if (preg_match('#(?<action>get|post|delete|any)(?<title>.+)#', $name, $match)) {
//recuperation des informations
$action = $match['action'];
$title = str_slug($match['title']);
// construction de l'url
$uri = '/' . $prefix . ($title == 'index' ? '' : '/' . $title);
// Gestion des paramètres
foreach ($method->getParameters() as $parameter) {
$uri .= sprintf('/{%s%s}', $parameter->getName(), $parameter->isDefaultValueAvailable() ? '?' : '' );
}
// création de la route
$route = call_user_func_array([\Route::getFacadeRoot(), $action], [$uri, sprintf('%s@%s', '\\' . $controller, $name)]);
// nomage de la route
$route->name(sprintf('%s.%s.%s', $prefix, $title, $action));
}
}
return $this;
}
}
@nasrulhazim
Copy link

HI there,

Probably we can convert this to a package, much easier for installation on Laravel 5.3.

Thanks.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment