Controladores de rota implícitos
Aprenda como criar rotas implícitas dentro dos métodos de um controlador para criar caminhos usando métodos HTTP.
Criar controlador
Os nomes dos métodos representam os métodos e caminhos HTTP exigidos pelas rotas, por exemplo:
| Método do controlador | Método de rota | Percurso | Equivalente |
|---|---|---|---|
getInfo() |
GET |
/info |
$app->action('GET', '/info') |
putInfo() |
PUT |
/info |
$app->action('PUT', '/info') |
putfooBar() |
PUT |
/foo-bar |
$app->action('PUT', '/foo-bar') |
postPing() |
POST |
/ping |
$app->action('POST', '/ping') |
anyFooBarBaz() |
ANY |
/foo-bar-baz |
$app->action('ANY', '/foo-bar-baz') |
getIndex() |
GET |
/ |
$app->action('GET', '/') |
headIndex() |
HEAD |
/ |
$app->action('HEAD', '/') |
deleteSomething() |
DELETE |
/something |
$app->action('DELETE', '/something') |
Para testar, crie o arquivo system/Controllers/ImplicitController.php e adicione o seguinte conteúdo a ele:
<?php
namespace Controller;
class ImplicitController extends \Inphinit\Routing\Treaty
{
public function getIndex()
{
return 'Home';
}
public function getInfo()
{
phpinfo();
}
public function postPing()
{
error_log($_SERVER['REMOTE_ADDR']);
}
public function anyFooBarBaz()
{
phpinfo();
}
}
Em seguida, adicione isto a main.php ou dev.php:
\Controller\ImplicitController::action($app);
É equivalente a:
$app->action('GET', '/', 'ImplicitController::getIndex');
$app->action('GET', '/info', 'ImplicitController::getInfo');
$app->action('POST', '/ping', 'ImplicitController::postPing');
$app->action('ANY', '/foo-bar-baz', 'ImplicitController::anyFooBarBaz');
Limitações
A diferença em relação aos controladores que criam rotas implicitamente é que apenas ANY um método HTTP pode ser usado por rota, enquanto que em declarações de rotas normais é possível adicionar mais de um método HTTP. O exemplo a seguir não pode ser escrito na forma de um controlador que cria rotas implicitamente:
$app->action(['GET', 'HEAD'], '/', 'FooBar::home');
$app->action(['POST', 'PUT', 'PATCH'], '/test', 'FooBar::test');
Em rotas implicitamente criadas para terem métodos diferentes para o mesmo caminho, será sempre necessário criar um método de classe para cada método de um caminho, resultando assim em rotas diferentes:
<?php
namespace Controller;
class FooBar extends \Inphinit\Routing\Treaty
{
public function getIndex() { ... }
public function headIndex() { ... }
public function postTest() { ... }
public function putTest() { ... }
public function patchTest() { ... }
}