Ajuda com regex => routes mais de 2 diretórios genérico

44 views
Skip to first unread message

Douglas J.A.M

unread,
Apr 20, 2012, 8:28:01 AM4/20/12
to kohan...@googlegroups.com
Bom dia pessoal,

Estou apanhando aqui para fazer um regex para atender de maneira genérica a leitura de todas os meus controllers em seus subdiretorios para
poder ler por exemplo


Gostaria de fazer uma rota única para todos meus controllers, sendo que na segunda rota deve ser:
n diretorios separados por virgula, e a ultima palavra é o controller, caso tenha somente uma palavra, o directory é o default o o controlleré o exibido na url.
Creio eu que lógica está correta mas uma excessão está sendo gerada:

ErrorException [ Warning ]: preg_match() [<a href='function.preg-match'>function.preg-match</a>]: Compilation failed: range out of order in character class at offset 55


Route::set('default', '(<action>)', array('action' => 'login|logout'))
        ->defaults(array(
            'directory' => 'sistema',
            'controller' => 'autenticacao',
            'action' => 'index',
        ));

Route::set('aplicacao', '(<directory>)(<controller>(/<action>(/<id>)))',
        array('directory' => '[[A-Za-z]+/?]*', // palavras de no minimo 1 caractere separadas por 0 ou 1 "/" a cada palavra, pode se ter 0 ou n-1 palavras
              'controller' => '[A-Za-Z]+', // ultima ou unica palavra de no minimo 1 caractere
              'action' => 'ver|novo|editar|excluir',
              'id' => 'd+'))
        ->defaults(array(
            'directory' => 'sistema',
            'controller' => 'inicio',
            'action' => 'index',
        ));

Juarez Junior

unread,
Apr 20, 2012, 8:31:01 AM4/20/12
to kohan...@googlegroups.com
Não seria mais fácil criar uma rota para cada diretório? Digo isto pq
uso aqui no projeto da empresa.

[s]

2012/4/20 Douglas J.A.M <dougl...@gmail.com>:

> --
> Você está recebendo esta mensagem porque se inscreveu no grupo "Kohana Php"
> dos Grupos do Google.
> Para ver esta discussão na web, acesse
> https://groups.google.com/d/msg/kohana-php/-/NA1xzeDp6xsJ.
> Para postar neste grupo, envie um e-mail para kohan...@googlegroups.com.
> Para cancelar a inscrição nesse grupo, envie um e-mail para
> kohana-php+...@googlegroups.com.
> Para obter mais opções, visite esse grupo em
> http://groups.google.com/group/kohana-php?hl=pt-BR.

--
Juarez Junior - juarez...@gmail.com
http://twitter.com/juareznjunior
http://juareznjunior.wordpress.com/

Douglas J.A.M

unread,
Apr 20, 2012, 8:36:22 AM4/20/12
to kohan...@googlegroups.com
Pois é dar até da, mas quero já poupar este trabalho, o sistema vai ser bem grande e quanto mais eu automatiza-lo melhor será

Anderson Marques Ferraz

unread,
Apr 20, 2012, 9:42:42 AM4/20/12
to kohan...@googlegroups.com
YAGNI. Faça quando tiver que fazer.

--
Você está recebendo esta mensagem porque se inscreveu no grupo "Kohana Php" dos Grupos do Google.
Para ver esta discussão na web, acesse https://groups.google.com/d/msg/kohana-php/-/xfDsfyLKA08J.

Para postar neste grupo, envie um e-mail para kohan...@googlegroups.com.
Para cancelar a inscrição nesse grupo, envie um e-mail para kohana-php+...@googlegroups.com.
Para obter mais opções, visite esse grupo em http://groups.google.com/group/kohana-php?hl=pt-BR.



--
Anderson Marques Ferraz
UEFS - Engenharia de Computação - 2006.1
Linux user #500881 - http://counter.li.org/

Money demands that you sell, not your weakness to men's stupidity, but your talent for their reason.
(Francisco d'Anconia)

felipe bastos

unread,
Apr 20, 2012, 10:15:44 AM4/20/12
to kohan...@googlegroups.com

Rapaz, no inicio tbm pensei que isso seria util, mas depois percebi que nao tinha motivos para uma aplicacao ter tantos subdiretorios.

Para deixar a aplicacao modular alterei o index.php para reconhecer várias aplicacoes no mesmo sistema.

Ai tenho ...

Site.com/controller/action - que chama application padrao
Site.com/application2/controller/action - chama uma application2, e por ai vai. A application pode ser qualquer nome. E como alterei a rota defaul das outras aplicacoes, posso ter subdiretorio em cada application com tanto que um subdiretorio nao tenha o mesmo nome de uma application.

Dificilmente vc vai precisar passar desse esquema.

Guilherme Maule

unread,
Apr 20, 2012, 10:23:46 AM4/20/12
to kohan...@googlegroups.com
Felipe,

Teria como voce postar aqui a route como ficou?

Obrigado!

Abraços..
--
Att,
Guilherme Maule dos Reis
Web Designer 
43 - 9129 1400

felipe bastos

unread,
Apr 20, 2012, 10:33:16 AM4/20/12
to kohan...@googlegroups.com

Estou mobile agora ..

Mas em cada application eu alterei a route default acrescentando a variavel "application" no mesmo estilo da variavel de diretorio.

E no index.php eu pego o URI e descubro qual application devo chamar ..

$application ... "applications/nome_da_application"

Eu criei um topico a no maximo 15 dias sobre sistemas multi applications .. deve ta recente no historico do grupo

Guilherme Maule

unread,
Apr 20, 2012, 10:36:54 AM4/20/12
to kohan...@googlegroups.com
tranquilo!

valeu..

Att,
Guilherme Maule.

*Enviado de meu iPhone.

felipe bastos

unread,
Apr 20, 2012, 12:09:06 PM4/20/12
to kohan...@googlegroups.com
Por enquanto está assim:

index.php

//pega o candidato a application, que também pode ser um controller
list($void, $subpath, $application) = explode('/', $_SERVER['REQUEST_URI']);

//se existir é um application, senão é um controller do application default
$application = !empty($application) && file_exists('applications/'.$application)
? 'applications/'.$application
: 'applications/application';

As pastas application

/applications/application <--- default
/applications/admin <-- outra application
/applications/blog   <-- outras application
/applications/classificados  <-- outras application

bootstrap.php <-- de cada application (a application default segue o padrão do kohana)

Kohana::init(array(
'base_url'   => '/blog/', <--- nome da application

Kohana::init(array(
'base_url'   => '/admin/', <--- nome da application

Rotas default da application blog

Route::set('default', '(<application>(/<controller>(/<action>(/<id>))))', array(
'application' => 'blog'
))
->defaults(array(
'controller' => 'welcome',
'action'     => 'index',
));

Cada application não default deve seguir este padrão.

Aí meu sistema tem ..

site.com/controller/action/id <--- application default é acionada
site.com/blog/controller/action/id <--- application blog é acionada 
site.com/admin/controller/action/id <--- application admin é acionada

E por aí vai. Você pode acrescentar quantas applications quiser, com tanto que o nome das aplpications não choque com o nome dos controllers da application default..

Isso eu fiz correndo, só para ver se funcionava legal. A idéia era ter módulos integrados no mesmo site, sem usar o modules ou fazer "aplicações descontextualizadas" :D

Bom, agora tem mais uma opção.

felipe bastos

unread,
Apr 20, 2012, 7:18:40 PM4/20/12
to kohan...@googlegroups.com
Hum .. não gostei ;(

Não tinha percebido um problema com arquivos estáticos (css, js, etc) causado pelo nome da application. Preciso de uma classe que centralize os assets e midias.

Jean O. Rodrigues

unread,
Apr 20, 2012, 10:25:39 PM4/20/12
to kohan...@googlegroups.com
Quanto os arquivos estáticos crie uma aplicação, subdominio ou diretório para centralizar os arquivos de todas aplicações.

Enviado via iPhone

Douglas J.A.M

unread,
Apr 24, 2012, 6:55:36 AM4/24/12
to kohan...@googlegroups.com
Galera o pessoal do forum do kohana me ajudou, utilizei funções no route, há como:


Filé demais esse framework viu! Dei um vardump ali só para debug caso desejem testar.

Como meu código ficou:

Route::set('default', function($url = '') {

            $directory = '';
            $controller = 'inicio';
            $action = 'index';
            $id = '';

            $partes = explode('/', $url);
            $i = sizeof($partes) - 1;

            // verifica se tem  id
            if (is_numeric($partes[$i])) {
                $id = $partes[$i];
                $i--;
            }

            // verifica se tem action
            if (in_array($partes[$i], array('index', 'ver', 'novo', 'editar', 'excluir'))) {
                $action = $partes[$i];
                $i--;
            }

            if ($i >= 0) {
                // controller é o próximo
                $controller = $partes[$i];
                $i--;
            }

            // o resto é o diretório
            while ($i >= 0) {
                $directory .= $partes[$i] . '/';
                $i--;
            }

            // caso tenha remove a ultima barra do diretório
            if (strlen($directory) > 0)
                $directory = substr($directory, 0, -1);

            // verifico se na url veio só login, se sim, o controller é autenticacao
            // e a ação é login|logout
            if($controller == "login" || $controller == "logout"){
                $action = $controller;
                $controller = "autenticacao";
            }
            
            $retorno = array(
                'directory' => $directory,
                'controller' => $controller,
                'action' => $action,
                'id' => $id,
            );

            echo var_dump($retorno);
            return $retorno;
        });

felipe bastos

unread,
Apr 24, 2012, 7:13:06 AM4/24/12
to kohan...@googlegroups.com

Vixe .. isso tudo?

Voce ja pensou no nome das classes?

Controller_Diretorio1_Diretorio2_Diretorio3_DiretorioN_NomedoController extends ...

Achei seu algoritmo confuso ...

Vc poderia dar um explode no uri .. e ir verificando se é diretorio is_directory().

Quando nao for mais diretorio .. é controller, action, id (baseado no padrão).

De qualquer forma, Boa sorte!

--
Você está recebendo esta mensagem porque se inscreveu no grupo "Kohana Php" dos Grupos do Google.
Para ver esta discussão na web, acesse https://groups.google.com/d/msg/kohana-php/-/HPq_iZ2tVvcJ.

Douglas J.A.M

unread,
Apr 24, 2012, 7:17:11 AM4/24/12
to kohan...@googlegroups.com
Pois é, realmente o nome das classes de controller terão de ficar assim, mas como eu creio que raramente vou fazer chamadas a controllers não tem problema.
Realmente ainda não ta otimizado, mas vou ir refinando isto com o tempo, perdi tempo demais tentando fazer o regex, tenho de acelerar aqui senão não vai ter como mostrar resultados.

Joel Souza

unread,
Apr 24, 2012, 7:55:20 AM4/24/12
to kohan...@googlegroups.com

Protip:

0 kohana tem o método Debug::vars($var) que eh um var_dump de luxo.

Em 24/04/2012 07:55, "Douglas J.A.M" <dougl...@gmail.com> escreveu:
--
Reply all
Reply to author
Forward
0 new messages