Rogério Lino

Web development and tips

PHP: Slim Framework Action Based

Há algum tempo utilizo o Slim Framework como base de meus projetos. E o motivo é sua simplicidade, velocidade e facilidade.

E para criar CRUD, eu utilizo um trecho de código para trabalhar rotas semelhante aos frameworks action based. Seguindo a convenção /controlador/método.

Exemplo:

Para a URI /clients/add terei uma classe controladora ClientsController com um método público (a ação) add. E o script tentará renderizar a página add.php dentro do diretório clients. E para a URI /clients/view/1 será necessário ter o método view que recebe um parâmetro (nesse caso “1”).

Abaixo segue o trecho semelhante ao que está disponível no meu repositório no Github (porém nesse repositório utilizo o Twig como template engine): rogeriolino/slimapp-skeleton.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$app->any('/:controller(/)(:action(/)(:params+))', function($controller, $action = 'index', $params = array()) use ($app) {
    // transforma o parâmetro :controller no nome da classe controladora (com namespace)
    $class = "MeuNamespace\\" . ucfirst($controller) . "Controller";
    try {
        if (!class_exists($class)) {
            throw new \Exception('Controlador não encontrado');
        }
        $ctrl = new $class($app);
        $methodName = preg_replace('/[^A-z0-9]/', '_', $action);
        $ref = new \ReflectionMethod($class, $methodName);
        if (!$ref->isPublic()) {
            throw new \Exception('O método do controlador não é público.');
        }
        $view = $methodName;
        $rs = $ref->invokeArgs($ctrl, $params);
        if ($rs) {
            $view = $rs;
        }
        $app->render("{$controller}/{$view}.php");
    } catch (\Exception $e) {
        $app->notFound();
    }
});

Para utilizar o slimapp-skeleton basta clonar o repositório e depois fazer a instalação das dependências via Composer.

Comments