Criando rotas (URLs amigáveis) com Inphinit PHP framework

Guilherme Nascimento
3 min readApr 17, 2020

Antes de começar leia: https://github.com/inphinit/inphinit/wiki/Estrutura-das-pastas

Uso básico

No main.php você pode criar as rotas assim:

<?php
use Inphinit\App;
use Inphinit\Routing\Route;
//Rota Index, o ANY permite qualquer método HTTP
Route::set('ANY', '/', 'Home:index');
//Closure
Route::set('ANY', '/closure', function () {
return 'Olá, Mundo!';
});
//Closure e use
$data = 'Mary';
Route::set('ANY', '/closure-use', function () use ($data) {
return 'Olá ' . $data . '!';
});
//Rota com expressão regular, você pode navegar assim http://[server]/user/mary ou http://[server]/user/john
Route::set('ANY', '/user/{:[a-z0-9_.]+:}', 'Users.Profile:show');
Route::set('GET', '/fooget', 'Foo:get'); //Permite somente o método GET do HTTP
Route::set('POST', '/foopost', 'Foo:post'); //Permite somente o método POST do HTTP
Route::set('PUT', '/fooput', 'Foo:put'); //Permite somente o método PUT do HTTP
Route::set('HEAD', '/foohead', 'Foo:head'); //Permite somente o método HEAD do HTTP
//Permite GET e POST
Route::set(array('GET', 'POST'), '/foo', 'Foo:method');
//Permite GET, HEAD e POST
Route::set(array('GET', 'HEAD', 'POST'), '/foo', 'Foo:method');
// Se estiver usando PHP 5.4+
Route::set(['GET', 'HEAD', 'POST'], '/foo', 'Foo:method');

Leia mais sobre o uso de {::} em Expressão Regular

Controllers

Controllers usam . (ponto) como separador/delimitador do namespace e : como delimitador do método/função do Controller:

  • Usar ‘Foo:get’ é o mesmo que \Controller\Foo::get();
  • Usar ‘Users.Profile:show’ é o mesmo que \Controller\Users\Profile::show();
  • Usar ‘Baz.Bar.Foo:foobar’ é o mesmo que \Controller\Baz\Bar\Foo::foobar();

Veja mais detalhes em Usando Controllers

Gropo de Routes

Este recurso é Experimental

Para usar primeiro adicione Inphinit\Experimental\Routing\Group no main.php, por exemplo:

<?php
use Inphinit\App;
use Inphinit\Routing\Route;
use Inphinit\Experimental\Routing\Group;

Criando um grupo pelo caminho do endereço (path)

Todas as rotas definidas dentro de then são relativas ao path, por exemplo:

Group::create()->path('/foo/bar/')->then(function () {
Route::set('GET', '/', 'Foo:index'); // Acesse http://example/foo/bar/
Route::set('GET', '/abc', 'Foo:bar'); // Acesse http://example/foo/bar/abc
Route::set('GET', '/xyz/', 'Foo:baz'); // Acesse http://example/foo/bar/xyz/
});

Criando um grupo pelo domínio

Todas rotas em then são apenas disponíveis no domínio definido em domain, por exemplo:

// Se acessar o domínio www.example.com
Group::create()->domain('www.example.com')->then(function () {
Route::set('GET', '/', 'Foo:index'); // Acesse até http://example.com/
Route::set('GET', '/abc', 'Foo:bar'); // Acesse http://example.com/abc
Route::set('GET', '/xyz/', 'Foo:baz'); // Acesse http://example.com/xyz/
});
// Se acessar o subdominio foo.example.com
Group::create()->domain('foo.example.com')->then(function () {
Route::set('GET', '/', 'Foo:index'); // Acesse http://foo.example.com/
Route::set('GET', '/abc', 'Foo:bar'); // Acesse http://foo.example.com/abc
Route::set('GET', '/xyz/', 'Foo:baz'); // Acesse http://foo.example.com/xyz/
});
// Um domínio diferente, por exemplo site2.com
Group::create()->domain('site2.com')->then(function () {
Route::set('GET', '/', 'Foo:index'); // Acesse http://site2.com/
Route::set('GET', '/abc', 'Foo:bar'); // Acesse http://site2.com/abc
Route::set('GET', '/xyz/', 'Foo:baz'); // Acesse http://site2.com/xyz/
});

Usando expressão regular no domínio/sub-domínio:

Group::create()->domain('{:[a-z0-9_\-]+:}.example.com')->then(function ($subdomain) {
//$subdomain retorna "foo" se navegar em foo.example.com (e é óbvio que o dominio deve existir)
//$subdomain retorna "john" if navigate to john.example.com
Route::set('GET', '/', 'Foo:index');
});

Criando um grupo com prefixo nos Controllers

Isto:

Group::create()->prefixNS('Baz.Bar')->then(function () {
Route::set('GET', '/', 'Foo:index');
Route::set('GET', '/about', 'Foo:about');
Route::set('GET', '/contact', 'Foo:contact');
Route::set('GET', '/inphinit', 'Inphinit:index');
Quick::create('MyClass')->prepare();
});

É equivalente:

Route::set('GET', '/',         'Baz.Bar.Foo:index');
Route::set('GET', '/about', 'Baz.Bar.Foo:about');
Route::set('GET', '/contact', 'Baz.Bar.Foo:contact');
Route::set('GET', '/inphinit', 'Baz.Bar.Inphinit:index');
Quick::create('Baz.Bar.MyClass')->prepare();

Criando rotas baseadas em um Controller

Este recurso é Experimental

Para usar primeiro adicione Inphinit\Experimental\Routing\Quick no main.php, por exemplo:

<?php
use Inphinit\App;
use Inphinit\Routing\Route;
use Inphinit\Experimental\Routing\Quick;

Você pode definir o métodos Controller para criar as rotas com Inphinit\Experimental\Quickassim:

public function getIndex();  //Acesse http://example/ usando GET
public function postIndex(); //Acesse http://example/ usando POST
public function anyIndex(); //Acesse http://example/ usando qualquer método HTTP
public function anyFoo(); //Acesse http://example/foo qualquer método HTTP
public function anyFooBar(); //Acesse http://example/foo-bar qualquer método HTTP
public function anyFooBarBazXyz(); //Acesse http://example/foo-bar-baz-xyz qualquer método HTTP

Usando a classe Quick

Crie um Controller assim application/Controller/MinhaClasse.php por exemplo:

<?php
namespace Controller;
class MinhaClasse
{
public function getIndex()
{
return 'Olá, Mundo!';
}
public function getAbout()
{
return 'Sobre a empresa!';
}
}

E adicione no seu main.php:

/*
* Cria estas rotas:
* - http://example/
* - http://example/about/
*/
Quick::create('MinhaClasse')->prepare();

Outros exemplos:

/*
* Irá gerar estas rotas (Quick::BOTH é opcional/por defeito):
* - http://example/
* - http://example/about
* - http://example/about/
*/
Quick::create('MinhaClasse')->canonical(Quick::BOTH)->prepare();
/*
* Irá gerar estas rotas:
* - http://example/
* - http://example/about/
*/
Quick::create('MinhaClasse')->canonical(Quick::SLASH)->prepare();
/*
* Irá gerar estas rotas:
* - http://example/
* - http://example/about
*/
Quick::create('MinhaClasse')->canonical(Quick::NOSLASH)->prepare();
/*
* Irá gerar estas rotas:
* - http://example/foo/bar/baz/
* - http://example/foo/bar/baz/about
* - http://example/foo/bar/baz/about/
*/
Group::create()->path('/foo/bar/baz/')->then(function () {
Quick::create('MinhaClasse')->prepare();
});

--

--