Rotas

Aprenda como criar rotas com correspondência baseada em padrões para closures, funções, métodos e controladores, e como isolar rotas em escopos distintos.

Para criar uma nova rota, edite o system/main.php arquivo. Se desejar que a rota esteja disponível apenas no modo de desenvolvimento, edite o system/dev.php arquivo correspondente.

Criar rotas

A criação de uma rota deve ser feita utilizando:

$app->action(array | string $method, string $path, $callback);

Utilizando função anônima (closure)

$app->action('GET', '/closure', function () { return 'Hello "closure"!'; });

Utilizando funções com um nome específico

function sample() { echo 'Hour server: ', date('h:i:s'); } $app->action('GET', '/hour', 'sample');

Utilizando o método de uma instância

class Sample { public function method() { echo 'Hello!'; } } $instance = new Sample(); $app->action('ANY', '/', [$instance, 'method']);

Utilizando rotas com múltiplos métodos HTTP

$app->action(['GET', 'HEAD', 'POST'], '/foo', function () { ... }); $app->action(['PATCH', 'PUT'], '/bar', function () { ... });

Utilizando controladores

Para melhor compreender isso na prática, crie um arquivo system/Controllers/Blog/Post.php com o seguinte conteúdo:

<?php namespace Controllers\Blog; class Post { public function list($app) { return 'Coming soon'; } public function read($app, $params) { $id = $params['id']; return "ID: {$id}"; } }

Em seguida, crie as rotas (não é necessário incluir o Controllers prefixo do namespace — o framework o adiciona automaticamente), por exemplo:

$app->action('GET', '/blog/posts', 'Blog\Home::list'); $app->action('GET', '/blog/posts/<id>', 'Blog\Home::post');

Agrupamento de rotas (escopo)

O sistema de agrupamento de rotas (escopo) é simples e flexível. Ele se baseia na URL ou caminho completo e suporta o * caractere curinga, bem como os mesmos padrões disponíveis para rotas. Um exemplo de rota só será adicionado se o caminho começar com /blog/:

/* * http://localhost:5000/blog/ * http://localhost:5000/blog/post * http://localhost:5000/blog/search */ $app->scope('/blog/', function ($app, $params) { $app->action('GET', '/', function () { ... }); $app->action('POST', '/post', function () { ... }); $app->action('GET', '/search', function () { ... }); });

Restringir rotas a um escopo que aceite apenas HTTPS ou HTTP

As rotas só serão adicionadas se você estiver acessando via HTTPS:

$app->scope('https://*', function ($app, $params) { ... });

As rotas só serão adicionadas se você estiver acessando via HTTP:

$app->scope('http://*', function ($app, $params) { ... });

Restringir rotas para que sejam acessíveis apenas dentro de um domínio específico.

As rotas só serão adicionadas quando o host da solicitação for example.com

$app->scope('*://example.com/', function ($app, $params) { ... });

Restringir rotas a um escopo por subdomínio

As rotas só serão adicionadas se você estiver acessando um subdomínio de example.com, por exemplo,site1.example.com

$app->scope('*://*.example.com/', function ($app, $params) { ... });

Utilizando um padrão para capturar o subdomínio:

$app->scope('*://<subdomain>.example.com/', function ($app, $params) { $subdomain = $params['subdomain']; ... });

Rotas e escopos com padrões de URL

Utilizando um padrão que espera um caminho com um ID id de qualquer formato:

$app->action('GET', '/users/<id>/<user>', function ($app, $params) { $id = $params['id']; $username = $params['user']; ... });

Utilizando um padrão que espera um caminho com um nome id em formato UUID:

$app->action('GET', '/users/<id:uuid>/<user>', function ($app, $params) { $id = $params['id']; $username = $params['user']; ... });

Padrões padrão:

Tipo Exemplo Descrição
alnum $app->action('GET', '/baz/<video:alnum>', ...); Aceita apenas parâmetros alfanuméricos; $params retorna ['video' => ...]
alpha $app->action('GET', '/foo/bar/<name:alpha>', ...); Aceita apenas parâmetros alfabéticos; $params retorna ['name' => ...]
decimal $app->action('GET', '/baz/<price:decimal>', ...); Aceita apenas parâmetros numéricos decimais; $params retorna ['price' => ...]
num $app->action('GET', '/foo/<id:num>', ...); Aceita apenas parâmetros inteiros; $params retorna ['id' => ...]
nospace $app->action('GET', '/foo/<nospace:nospace>', ...); Aceita qualquer caractere, exceto espaços, como %20 tabulações (veja o \S padrão regex).
uuid $app->action('GET', '/bar/<barcode:uuid>', ...); Aceita parâmetros formatados em UUID; $params retorna ['barcode' => ...]
version $app->action('GET', '/baz/<api:version>', ...); Aceita parâmetros no formato Semantic Versioning 2.0.0 (SemVer) ; $params retorna ['api' => ...]

Os padrões são muito flexíveis, permitindo que sejam modificados usando uma expressão regular personalizada. Substitua o formato SemVer pelo <major>.<minor>.<revision>.<build> formato:

$app->action('GET', '/download/<foobar:version>/<user>', function ($app, $params) { $version = $params['foobar']; ... }); $app->setPattern('version', '\d+\.\d+\.\d+\.\d+');

Substitua o formato SemVer pelo <major>.<minor> formato (útil para APIs da web):

$app->action('GET', '/api/<foobar:version>/<user>', function ($app, $params) { $version = $params['foobar']; ... }); $app->setPattern('version', '\d+\.\d+');

Compartilhamento de dados

A flexibilidade da classe Inphinit\App permite definir propriedades dinamicamente, proporcionando acesso conveniente a informações dentro de controladores ou funções de retorno de chamada de rotas. Exemplo:

$app->scope('https://api.example.com/', function ($app, $params) { $app->userInfo = authUserInfoContext(); $app->customers = customersContext(); Response:type('application/json'); $app->action('GET', '/me', function ($app, $params) { return json_encode($app->userInfo->get()); }); $app->action('GET', '/customers', 'Api\\Clients::list'); $app->action('GET', '/customers/<id:uuid>/orders', 'Api\\Clients::orders'); });

Exemplo de utilização de dados compartilhados no Controlador:

<?php namespace Controllers; class FooBar { public function list($app, $params) { return json_encode($app->customers->all()); } public function orders($app, $params) { $customerId = $params['id']; $customer = $app->customers->find($customerId); return json_encode($customer->orders()); } }

Mais recursos de rota

Página inicial
Apoie com uma estrela no GitHub