A powerful routing for PHP.
- Requirements
- How It Works
- Routing Schema
- Router
- Group Route
- Request Route
- Hidden Route
- License
- Huuuge Quote
- PHP Version
^7.1
First of all, you have to initialize a Router:
$router = new \Greg\Routing\Router();Then, set up some routes:
$router->any('/', function() {
return 'Hello World!';
}, 'home');
$router->get('/page/{page}.html', function($page) {
return "Hello on page {$page}!";
}, 'page');
$router->post('/user/{id#uint}', 'UsersController@save', 'user.save');If you set an action like
Controller@action, when dispatching it will instantiate theUsersControllerand call thesavepublic method.
Now, you can dispatch URLs path:
echo $router->dispatch('/'); // result: Hello World!
// Initialize "UsersController" and execute "save" method.
echo $router->dispatch('/user/1', 'POST');and, get URLs for them:
$router->url('home'); // result: /
$router->url('home', ['foo' => 'bar']); // result: /?foo=bar
$router->url('user.save', ['id' => 1]); // result: /user/id
$router->url('user.save', ['id' => 1, 'debug' => true]); // result: /user/id?debug=trueOptionally, you can add a dispatcher to manage actions.
Let say you want to add the Action suffix to action names:
$router->setDispatcher(function ($action) {
if (is_callable($action)) {
return $action;
}
return $action . 'Action';
});Also, you can inverse the control of the controllers.
Let say you want instantiate the controller with some custom data,
or use some external IoC interface and run the init method if exists.
$router->setIoc(function ($controllerName) {
// Let say you already have an IoC container.
global $iocContainer;
$controller = $iocContainer->load($controllerName);
if (method_exists($controller, 'init')) {
$controller->init();
}
return $controller;
});Routing schema supports parameters and optional segments.
Parameter format is {<name>[:<default>][#<type>][|<regex>]}?.
<name> - Parameter name;
<default> - Default value;
<type> - Parameter type. Supports int, uint, boolean(or bool);
<regex> - Parameter regex;
? - Question mark from the end determine if the parameter should be optional.
Only
<name>is required in the parameter.
Optional segment format is [<schema>]. Is working recursively.
<schema> - Any routing schema.
It is very useful when you want to use the same action with different routing schema.
Let say we have a page with all articles of the same type, including pagination. The route for this page will be:
$router->get('/articles/{type:lifestyle|[a-z0-9-]+}[/page-{page:1#uint}]', 'ArticlesController@type', 'articles.type');type parameter is required in the route. Default value is lifestyle and should consist of letters, numbers and dashes.
page parameter is required in its segment, but the segment entirely is optional. Default value is 1 and should consist of unsigned integers.
If the parameter will not be set or will be the same as default value, the entire segment will be excluded from the URL path.
echo $router->url('articles.type'); // result: /articles/lifestyle
echo $router->url('articles.type', ['type' => 'travel']); // result: /articles/travel
echo $router->url('articles.type', ['type' => 'travel', 'page' => 1]); // result: /articles/travel
echo $router->url('articles.type', ['type' => 'travel', 'page' => 2]); // result: /articles/travel/page-2As you can see, there are no more URLs where you can get duplicated content, which is best for SEO. In this way, you can easily create good user friendly URLs.
Below you can find a list of supported methods.
- url - Fetch an URL of a route;
- dispatch - Dispatch an URL path;
- any - Create a route for any request method;
- request - Create a route for a specific request method;
- hidden - Create a hidden route. You can not dispatch it, but you can generate URLs from it;
- group - Create a group of routes;
- find - Find a route by name;
- bind - Set an input/output binder for a parameter;
- bindStrategy - Set an input/output binder for a parameter, using strategy;
- bindIn - Set an input binder for a parameter;
- bindInStrategy - Set an input binder for a parameter, using strategy;
- binderIn - Get the input binder of a parameter;
- bindInParam - Bind an input parameter;
- bindOut - Set an output binder for a parameter;
- bindOutStrategy - Set an output binder for a parameter, using strategy;
- binderOut - Get the output binder of a parameter;
- bindOutParam - Bind an output parameter;
- pattern - Set a parameter pattern;
- type - Set a parameter type;
- getPattern - Get a parameter pattern;
- setDispatcher - Set an action dispatcher;
- getDispatcher - Get the actions dispatcher;
- setIoc - Set an inversion of control for controllers;
- getIoc - Get the inversion of control;
- setNamespace - Set a namespace;
- getNamespace - Get the namespace;
- setErrorAction - Set an error action;
- getErrorAction - Get the error action;
- setHost - Set a host;
- getHost - Get the host.
Get the URL of a route.
url(string $name, array $params = []): stringExample:
$router->get('/page/{page}.html', function($page) {
return "Hello on page {$page}!";
}, 'page');
$router->url('page', ['page' => 'terms']); // result: /page/terms.html
$router->url('page', ['page' => 'terms', 'foo' => 'bar']); // result: /page/terms.html?foo=barDispatch an URL path.
dispatch(string $name, array $params = []): stringExample:
echo $router->dispatch('/'); // Dispatch any route
echo $router->dispatch('/user/1', 'POST'); // Dispatch a POST routeMagic methods:
Below you can find a list of supported methods.
- match - Match a path against routes;
- schema - Get the schema;
- schemaInfo - Get information about schema;
- setParent - Set parent routing;
- getParent - Get parent routing;
- path - Generate the path;
- any - Create a route for any request method;
- request - Create a route for a specific request method;
- hidden - Create a hidden route. You can not dispatch it, but you can generate URLs from it;
- group - Create a group of routes;
- find - Find a route by name;
- bind - Set an input/output binder for a parameter;
- bindStrategy - Set an input/output binder for a parameter, using strategy;
- bindIn - Set an input binder for a parameter;
- bindInStrategy - Set an input binder for a parameter, using strategy;
- binderIn - Get the input binder of a parameter;
- bindInParam - Bind an input parameter;
- bindOut - Set an output binder for a parameter;
- bindOutStrategy - Set an output binder for a parameter, using strategy;
- binderOut - Get the output binder of a parameter;
- bindOutParam - Bind an output parameter;
- pattern - Set a parameter pattern;
- type - Set a parameter type;
- getPattern - Get a parameter pattern;
- setDispatcher - Set an action dispatcher;
- getDispatcher - Get the actions dispatcher;
- setIoc - Set an inversion of control for controllers;
- getIoc - Get the inversion of control;
- setNamespace - Set a namespace;
- getNamespace - Get the namespace;
- setErrorAction - Set an error action;
- getErrorAction - Get the error action;
- setHost - Set a host;
- getHost - Get the host.
Initialize the route group.
__construct(string $schema)Example:
$group = new \Greg\Routing\GroupRoute('/api/v1');
$group->get('/user');Match a path against routes.
match(string $path, ?string $method = null, \Greg\Routing\RouteStrategy &$route = null, \Greg\Routing\RouteData &$data = null): boolExample:
if ($group->match('/', 'GET', $route, $data)) {
echo $route->exec($data);
}Magic methods:
Below you can find a list of supported methods.
- match - Match a path against routes;
- exec - Execute the route;
- url - Fetch an URL for the route;
- where - Set a parameter pattern. Alias of pattern;
- whereIs - Set a parameter type. Alias of type;
- schema - Get the schema;
- schemaInfo - Get information about schema;
- setParent - Set parent routing;
- getParent - Get parent routing;
- path - Generate the path;
- bind - Set an input/output binder for a parameter;
- bindStrategy - Set an input/output binder for a parameter, using strategy;
- bindIn - Set an input binder for a parameter;
- bindInStrategy - Set an input binder for a parameter, using strategy;
- binderIn - Get the input binder of a parameter;
- bindInParam - Bind an input parameter;
- bindOut - Set an output binder for a parameter;
- bindOutStrategy - Set an output binder for a parameter, using strategy;
- binderOut - Get the output binder of a parameter;
- bindOutParam - Bind an output parameter;
- pattern - Set a parameter pattern;
- type - Set a parameter type;
- getPattern - Get a parameter pattern;
- setDispatcher - Set an action dispatcher;
- getDispatcher - Get the actions dispatcher;
- setIoc - Set an inversion of control for controllers;
- getIoc - Get the inversion of control;
- setErrorAction - Set an error action;
- getErrorAction - Get the error action;
- setHost - Set a host;
- getHost - Get the host.
Initialize the request route.
__construct(string $schema, $action)Example:
$route = new \Greg\Routing\RequestRoute('/users', 'UsersController@index');
$route->exec();Match a path against route.
match(string $path, RouteData &$data = null): boolExample:
if ($route->match('/', $data)) {
print_r($data->params());
}Execute the route.
exec(RouteData $data): stringExample:
$route->exec(new RouteData('/', ['foo' => 'bar']));Fetch an URL for the route.
url(array $params = []): stringExample:
$url = $route->url(['foo' => 'bar']);Hidden Route
Magic methods:
Below you can find a list of supported methods.
- url - Fetch an URL for the route;
- schema - Get the schema;
- schemaInfo - Get information about schema;
- setParent - Set parent routing;
- getParent - Get parent routing;
- path - Generate the path;
- bindOut - Set an output binder for a parameter;
- bindOutStrategy - Set an output binder for a parameter, using strategy;
- binderOut - Get the output binder of a parameter;
- bindOutParam - Bind an output parameter;
- setHost - Set a host;
- getHost - Get the host.
Initialize the request route.
__construct(string $schema)Example:
$route = new \Greg\Routing\HiddenRoute('/users');
$route->exec();Create a route for any request method.
any(string $schema, $action, ?string $name = null): \Greg\Routing\RequestRouteCreate a route for a specific request method.
request(string $schema, $action, ?string $name = null, ?string $method = null): \Greg\Routing\RequestRouteYou can also create a specific request method by calling the method name directly.
Available types are: GET, HEAD, POST, PUT, DELETE, CONNECT, OPTIONS, TRACE, PATCH.
[get|head|post|put|delete|connect|options|trace|patch](string $schema, $action, ?string $name = null): \Greg\Routing\RequestRouteExample:
$router->get('/users', 'UsersController@index', 'users');
$router->post('/users/add', 'UsersController@add', 'users.add');hidden
Create a hidden route. You can not dispatch it, but you can generate URLs from it.
hidden(string $schema, string $name): \Greg\Routing\HiddenRouteExample:
$router->hidden('/catalog/{name}', 'partner.catalog')->setHost('mypartner.com');
$router->url('partner.catalog', ['name' => 'cars']); // result: http://mypartner.com/catalog/carsCreate a group of routes.
group(string $schema, ?string $prefix, callable(\Greg\Routing\GroupRoute $route): void $callable): \Greg\Routing\GroupRouteExample:
$router->group('/api', 'api.', function (\Greg\Routing\GroupRoute $group) {
$group->group('/v1', 'v1.', function (\Greg\Routing\GroupRoute $group) {
$group->any('/users', 'UsersController@index', 'users');
});
$group->group('/v2', 'v2.', function (\Greg\Routing\GroupRoute $group) {
$group->any('/users', 'UsersController@index', 'users');
$group->any('/clients', 'ClientsController@index', 'clients');
});
});
$router->url('api.v1.users'); // result: /api/v1/users
$router->url('api.v1.clients'); // throws: \Greg\Routing\RoutingException
$router->url('api.v2.clients'); // result: /api/v2/clientsFind a route by name.
find(string $name): ?\Greg\Routing\FetchRouteStrategyExample:
$route = $router->find('users.save');
$route->url(['foo' => 'bar']);Set a namespace.
setNamespace(string $namespace): $thisExample:
$router->setNamespace('Http');Get the namespace.
getNamespace(): stringSet an input/output binder for a parameter.
bind(string $name, callable(mixed $value): mixed $callableIn, ?callable(mixed $value): mixed $callableOut = null): $thisExample:
$this->bind('id', function($id) {
$user = (object) ['id' => $id];
return $user;
}, function($user) {
return $user->id;
});Set an input/output binder for a parameter, using strategy.
bindStrategy(string $name, \Greg\Routing\BindInOutStrategy $strategy): $thisExample:
$this->bindStrategy('id', new class implements BindInOutStrategy {
public function input($id)
{
$user = (object) ['id' => $id];
return $user;
}
public function output($user)
{
return $user->id;
}
});Set an input binder for a parameter.
bindIn($name, callable(mixed $value): mixed $callable): $thisExample:
$this->bindIn('id', function($id) {
$user = (object) ['id' => $id];
return $user;
});Set an input binder for a parameter, using strategy.
bindInStrategy($name, \Greg\Routing\BindInStrategy $strategy): $thisExample:
$this->bindInStrategy('id', new class implements \Greg\Routing\BindInStrategy {
public function input($id)
{
$user = (object) ['id' => $id];
return $user;
}
});Get the input binder of a parameter.
binderIn(string $name): \Greg\Routing\BindInStrategy|callableExample:
$binder = $router->binderIn('id');
if (is_callable($binder)) {
$user = $binder(1);
} else {
$user = $binder->input(1);
}Bind an input parameter.
bindInParam(string $name, $value): mixedExample:
$user = $router->bindInParam('id', 1);Set an output binder for a parameter.
bindOut($name, callable(mixed $value): mixed $callable): $thisExample:
$this->bindOut('id', function($user) {
return $user->id;
});Set an output binder for a parameter, using strategy.
bindOutStrategy($name, \Greg\Routing\BindOutStrategy $strategy): $thisExample:
$this->bindOutStrategy('id', new class implements \Greg\Routing\BindOutStrategy {
public function output($user)
{
return $user->id;
}
});Get the output binder of a parameter.
binderOut(string $name): \Greg\Routing\BindOutStrategy|callableExample:
$binder = $router->binderOut('id');
if (is_callable($binder)) {
$id = $binder($user);
} else {
$id = $binder->output($user);
}Bind an output parameter.
bindOutParam(string $name, $value): mixedExample:
$user = $router->bindOutParam('id', 1);Set an action dispatcher.
setDispatcher(callable(mixed $action): mixed $callable): $thisExample:
Let say you want to add the Action suffix to action names:
$router->setDispatcher(function ($action) {
if (is_callable($action)) {
return $action;
}
return $action . 'Action';
});Get the actions dispatcher.
getDispatcher(): callableSet an inversion of control for controllers.
setIoc(callable(string $controllerName): object $callable): $thisExample:
Let say you want instantiate the controller with some custom data,
or use some external IoC interface and run the init method if exists.
$router->setIoc(function ($controllerName) {
// Let say you already have an IoC container.
global $iocContainer;
$controller = $iocContainer->load($controllerName);
if (method_exists($controller, 'init')) {
$controller->init();
}
return $controller;
});Get the inversion of control.
getIoc(): callableSet error action.
setErrorAction($action): $thisExample:
$router->setErrorAction(function() {
return 'Ooops! Something has gone wrong.'
});Get error action.
getErrorAction(): mixedSet a host.
setHost(string $host): $thisExample:
$router->setHost('example.com');Get the host.
getHost(): stringGet the schema.
schema(): ?stringGet information about schema.
schemaInfo(): ['regex', 'params']Set parent routing.
setParent(RoutesAbstract $parent): $thisGet parent routing.
getParent(): RoutesAbstractGenerate the path.
path(array $params = []): arraySet a parameter pattern.
pattern(string $name, string $regex): $thisSet a parameter type pattern.
type(string $name, string $type): $thisGet parameter pattern.
getPattern(string $name): ?stringMIT © Grigorii Duca
