Hive Pass 2 Denunciar post Postado Julho 25, 2013 Olá pessoal, eu estou criando esse tópico com o intuito de mostrar o que eu sei sobre o sistema de rotas (routing) e tentar saber qual a visão de vocês sobre o mesmo.Já foram criados dois tópicos distintos sobre o assunto, tópicos com assuntos diferentes mas que acabaram chegando no tema.Um era meu, sobre a questão da organização do código, onde eu comecei o tópico querendo saber dos membros mais avançados na programação com o PHP Orientado a Objeto algumas dúvidas que eu tinha, e o código de exemplo que eu tinha colocado era um sistema de rotas simples, onde foi discutido algumas coisas e chegamos há algumas conclusões. – Quem quiser fazer a leitura como complemento, segue o link (http://forum.imasters.com.br/topic/504477-orientao-a-objetos/)O outro tópico foi do membro @dedas, onde ele deixou claro que está criando um sistema de rotas para a aplicação dele. (http://forum.imasters.com.br/topic/504724-abstrao/)O porque eu estou iniciando esse tópico?Simples, o assunto é único, sistema de rotas (routing).De ontem para hoje eu analisei muitos códigos e lembrei de outros códigos que eu já tinha olhado, e cada um interpreta o sistema de rotas de uma forma diferente.Por exemplo:No Code Igniter, como foi discutido no primeiro tópico utiliza um tipo “antigo” de rotas, onde as rotas podem ser definidas por configuração de usuário, ou o sistema automaticamente faz o roteamento utilizando a url.O Code Igniter tem um sistema de configuração de rotas dessa forma: $route['product/(:num)'] = "catalog/product_lookup_by_id/$1"; Onde as rotas são definidas em uma variável chamada $route e logo em seguida passado como atribuição o controller/action/ e parâmetros utilizando wildcards (:num) – exemplo.Explicando o sistema de router do Code Igniter no meu ponto de vista:O sistema de router do Code Igniter ele utiliza dos números mágicos para fazer a separação de quem é o controller, action e parâmetros. Exemplo: $controller = $uri_splitted[0]; - Da mesma forma que eu fiz primeiro tópico.Um padrão comum entre frameworks “antigos”.Mas porque antigo?Existem alguns frameworks que utilizam essa forma de definição de rotas: "/blog/:num" => array( "controller" => "blog", "action" => "post", "params" => array( "id" => "$1" ) ) A segunda forma eu creio que seja mais convencional, pois na hora de desenvolver não é preciso utilizar métodos como preg_split para separar a url por / para depois pegar por números mágicos o primeiro index, segundo e tentar descobrir quem é o controller ou action, o que é diferente dessa forma, onde já existe um índice no array informando que o controller é “index”, por exemplo, dessa forma o programador só precisaria de um foreach para obter o valor do “controller”.Já vi várias formas de router.Router que faz a função de dispatcher junto, onde ele faz o parser da configuração de rotas e ao mesmo tempo já executa a função de dispatcher chamando a “classe” controller, instanciando, chamando o método (action) e passando os parâmetros. (O que eu acho totalmente errado).Router que faz a função apenas de parser da configuração de rotas e com métodos como “get_controller” permite que outra classe como a dispatcher faça a função dela, de obter o controller e fazer a função dela. (meio certa) – Lembrando que o dispatcher nesse caso recebe um parâmetro com type hinting Router, onde só aceita objetos do tipo Router para depois utilizar os métodos get_controller();Já vi sistema de rotas utilizando objetos Request e Response, onde o Dispatcher recebe dois parâmetros com type hinting Request e Reponse, onde o Request funciona como o router, que tem o controller, action e tudo mais, pois fez o parser da configuração de rotas e depois o dispatcher pega esse Request e utiliza o Response para responder de várias formas, em AJAX, dentre outras (eu ainda não entendi direito como essa funciona).Eu queria saber de você qual a sua definição para um sistema de rotas, pois pelo que eu percebi cada sistema implementa de uma forma, mas para você, qual é a correta e qual você utilizaria?Obrigado. Compartilhar este post Link para o post Compartilhar em outros sites
Enrico Pereira 299 Denunciar post Postado Julho 26, 2013 É um sistema "velho" porque não é um router real, é apenas um alias. Em palavras menos delicadas: gambiarra. Router é uma das partes de um sistema web. Você usa Request, Response, Router juntos para formar o front controller. --- Um routing real não é um alias de URLs. Um routing real mapeia URLs, apenas isso, essa é a única responsabilidade dele. - Esse esquema de arrays não é a melhor forma, IMHO. - REST, essa é a chave da web. Um routing sem suporte a métodos HTTP é um routing quase que inútil. Veja o Respect\Rest em um exemplo de pseudo-código usando Closures: $router = new Router('/index.php/'); $router->get('/', function() { return 'Hello World'; }); $router->get('/users', function() { return 'Todos os usuários'; }); $router->get('/users/*', function($id) { return 'Usuário: ' . $id; }); $router->post('/users', function() { return 'Criando usuário'; }); $router->put('/users/*', function($id) { return 'Editando usuário: ' . $id; }); $router->delete('/users/*', function($id) { return 'Removendo usuário: ' . $id; }); --- Mas, não há regra. Não há correta. A única pessoa que pode escolher é você. Compartilhar este post Link para o post Compartilhar em outros sites
Hive Pass 2 Denunciar post Postado Julho 26, 2013 Muito interessante o seu ponto de vista, de verdade. Na realidade, bem radical. Infelizmente eu não entendi muito por ser iniciante no assunto, e a gente segue na ordem que vamos descobrindo as coisas, e até o momento eu apenas descobrir o sitema de routes utilizando os arrays. Grande parte dos frameworks que eu verifiquei utilizam o sistema de routes com array, foram raros os que eu vi que trabalham com métodos HTTP, utilizando Request, e Response, os outros apenas utilizam o route com o propósito de fazer um parser do sistema de configuração de rotas em array para depois determinar qual seria o controller a ser chamado. Vou fazer quote em alguns pontos da sua postagem que para mim ficaram bem difíceis, e queria saber se você pode me explicar melhor, por favor: Router é uma das partes de um sistema web. Você usa Request, Response, Router juntos para formar o front controller. Você afirmou que o Router era uma "gambiarra" e logo em seguida fala que ela é uma das partes de um sistema web? Sobre Request e Response e Router juntos, como assim formar um front controller? Seria formar o controller a ser chamado pela requisição do usuário, ou não? Um routing real não é um alias de URLs. Um routing real mapeia URLs, apenas isso, essa é a única responsabilidade dele. Mapeia de qual forma? Qual seria o retorno desse mapeamento? - Porque no caso, até onde eu sei, meu nível de conhecimento, esse mapeamento seria para definir quem é o controller, action, e argumentos. :( REST, essa é a chave da web. Um routing sem suporte a métodos HTTP é um routing quase que inútil. Não tenho conhecimento sobre REST, você poderia indicar onde eu poderia está lendo e tentar fazer essa interação com o meu sistema, com ou sem o Router, mas como você falou, o Router sem métodos HTTP é inúltil, logo um Router deve existir em uma aplicação? Se você fosse criar um sistema, qual seria a organização que você usaria? Criar uma classe Request, Response, Router e Dispatcher ou utilizaria de outras formas/técnicas? Sobre esse Respect\Rest no exemplo que você deu, ele me parece bem com o que eu vi na documentação de Routing do Laravel. Vou dá uma olhada nela depois. Mas, não há regra. Não há correta. A única pessoa que pode escolher é você. Falar isso é a mesma coisa que me dá um tiro, sou ultra metódico cara, de natureza, e isso só me f***, eu NUNCA acho que meu código está bom, e eu ainda tomar uma decisão de utilizar um método que uma pessoa falou ser ultrapasso e falar qual seria as melhores técnicas. Vamos estudar. rsrs. Compartilhar este post Link para o post Compartilhar em outros sites
Dorian Neto 41 Denunciar post Postado Julho 26, 2013 Sei bem como você se senti Hive Pass :) Sou ultra metódico também, ja refatorei meu sistema várias e várias vezes e nunca consigo deixar do jeito que eu quero :/ Pra falar a verdade, eu não tinha o menor conhecimento sobre Routers até começar a estudar o laravel. Achei muuuito foda o sistema de rotas que ele implementa e fiquei louco pra saber mais sobre. Em minhas pesquisas descobri que o framework utiliza a arquitetura RestFull, e achei esse livro(que por sinal parece ser muito bom, li apenas o primeiro capítulo e já fiquei louco :P) que da uma boa base: http://www.novatec.com.br/livros/sistemas-restful/ O autor desse livre deixou os exemplos usados no livro no github dele: https://github.com/danielps/livroRESTful Se você quiser entender 100% a técnica RestFull, da uma olhada nesse sisteminha de vendas que ele criou: https://github.com/danielps/livroRESTful/tree/master/sistema-vendas-server Se quiser implementar no teu sistema, da uma olhada nesses 2 sites:http://respect.li/ e http://www.slimframework.com/ Abraço :) Compartilhar este post Link para o post Compartilhar em outros sites
Enrico Pereira 299 Denunciar post Postado Julho 26, 2013 Grande parte dos frameworks que eu verifiquei utilizam o sistema de routes com array, foram raros os que eu vi que trabalham com métodos HTTP, utilizando Request, e Response, os outros apenas utilizam o route com o propósito de fazer um parser do sistema de configuração de rotas em array para depois determinar qual seria o controller a ser chamado. Esqueça-os, será melhor. Rails, Laravel, Symfony2, Zend Framework 2, Play! Framework usam. E agora serei retórico: o que você espera com esse Routing? Grande parte dos frameworks que eu verifiquei utilizam o sistema de routes com array, foram raros os que eu vi que trabalham com métodos HTTP, utilizando Request, e Response, os outros apenas utilizam o route com o propósito de fazer um parser do sistema de configuração de rotas em array para depois determinar qual seria o controller a ser chamado. Você está se fechando no mundo do CodeIgniter, CakePHP, ZF1, etc. No passado, o único propósito da maioria dos frameworks PHP era fazer CRUDs de forma rápida e dar um ambiente que não fosse uma porcaria porque naquela época o PHP era detestável (para muitos hoje em dia ainda é, mas não vem ao caso....). Hoje em dia, os frameworks se focam mais em um desenvolvimento mais robusto de aplicações ricas. Isso inclui APIs Restful, o que é absurdamente aplicado hoje em dia, principalmente com a acensão dos frameworks JavaScript e crescimento do mercado mobile. Quando eu digo frameworks "velhos", eu não digo por "birra", eu digo que eles são frameworks baseados em realidades do passado (principalmente o CI). Você afirmou que o Router era uma "gambiarra" e logo em seguida fala que ela é uma das partes de um sistema web? Sobre Request e Response e Router juntos, como assim formar um front controller? Seria formar o controller a ser chamado pela requisição do usuário, ou não? Não.. eu digo que alias de URL é gambiarra. URLs, requisições (requests) e respostas (responses) não são nada inovador nem mesmo uma metodologia. Essa é simplesmente a forma em que a web funciona, através do protocolo HTTP. Você (o cliente) requisita e o servidor responde, esse é o funcionamento da web, de grosso modo. Front controller é o camada que pega a request, trata ela e manda o output para o servidor emitir ao usuário. Front controller é um design pattern descrito no livro de padrões do Martin Fowler: http://www.martinfowler.com/eaaCatalog/frontController.html. Mapeia de qual forma? Qual seria o retorno desse mapeamento? - Porque no caso, até onde eu sei, meu nível de conhecimento, esse mapeamento seria para definir quem é o controller, action, e argumentos. :( Como você identifica uma página? Através da URL. O router simplesmente facilita o trabalho da aplicação em fazer o mapeamento. Esse diagrama é popular na comunidade Rails, espero que ajude-o: Não tenho conhecimento sobre REST, você poderia indicar onde eu poderia está lendo e tentar fazer essa interação com o meu sistema, com ou sem o Router, mas como você falou, o Router sem métodos HTTP é inúltil, logo um Router deve existir em uma aplicação? "Quase" inútil. Melhorando o que disse: menos eficiente. Voltando ao que disse no início deste tópico, API Restful é uma demanda das aplicações web hoje em dia. Volto a perguntar: o que você quer? qual o objetivo? Não há silver bullet. Você, de alguma forma, vai mapear a URL. Seja com um router, seja com um if, seja com o próprio servidor em arquivos .php diretamente (eca). Se você fosse criar um sistema, qual seria a organização que você usaria? Criar uma classe Request, Response, Router e Dispatcher ou utilizaria de outras formas/técnicas? Sobre esse Respect\Rest no exemplo que você deu, ele me parece bem com o que eu vi na documentação de Routing do Laravel. Vou dá uma olhada nela depois. Eu usaria alguma biblioteca. Em um projeto recente, eu usei o Aura.Router com o Aura.Http e o Aura.Web para fazer isso. Se você estiver tão indeciso, use um framework pronto, tipo o Laravel. Falar isso é a mesma coisa que me dá um tiro, sou ultra metódico cara, de natureza, e isso só me f***, eu NUNCA acho que meu código está bom, e eu ainda tomar uma decisão de utilizar um método que uma pessoa falou ser ultrapasso e falar qual seria as melhores técnicas. Vamos estudar. rsrs. Em duas palavras: leia código. Compartilhar este post Link para o post Compartilhar em outros sites
Hive Pass 2 Denunciar post Postado Julho 26, 2013 @dedas Muito obrigado, estarei dando uma olhada no livro e pesquisando mais sobre Restful. @Enrico Pereira Despensa comentários, perfeita posição e aplicação do ponto de vista em relação. - Mesmo não sendo um total conhecedor, eu sou um programador e tenho conhecimento do que é certo o que é errado em certo ponto. Vamos dizer que nós pensamos lógicamente, e se alguém aplicar algo para mim, e eu tomar uma decisão de que a sua opinião, tem lógica e que faz total sentido para mim, eu com total certeza vou concordar com você. O meu objetivo é aprender, tentar criar um framework, reinventar a roda literalmente. Uma vez eu vi uma frase: "Se a roda não fosse reinventar, estaríamos andando com rodas de pedras até hoje' É basicamente isso, aprender e aprender. Por onde me recomenda começar a ler? Qual livro, ou artigo que você acha últil sobre o assunto? Obrigado. Compartilhar este post Link para o post Compartilhar em outros sites
Enrico Pereira 299 Denunciar post Postado Julho 26, 2013 Eu sugiro que você realmente vá a fundo em frameworks web (não só PHP), lendo os respectivos códigos. Não há um livro sério que ensine a criar um framework, tampouco um artigo. Mas há livros que eu realmente gosto: Clean Code, Refactoring to Patterns, GOF, PofEAA (aprecie com moderação), PHP Objects Patterns and Practice, Test Driven Development: By Example. Todos eles você encontra facilmente na amazon.com. Em português talvez no submarino. Compartilhar este post Link para o post Compartilhar em outros sites
Hive Pass 2 Denunciar post Postado Julho 26, 2013 @Enrico Pereira Na realidade quando perguntei sobre artigos e livros não foram com o assunto de "como criar um framework", pois eu sei que não existe (ou existe e nunca vi) e também não acharia interessante algum livro que falasse sobre isso. - Os artigos e livros que eu perguntei foram sobre a questão de rotas, restful, dentre outros. Eu vou continuar pesquisado, estudando e tentar fazer algo. Qualquer dúvida que aparecer sobre a questão de rotas eu postarei novamente aqui. Obrigado. E quem tiver um ponto de vista diferente ou uma forma de implementação diferente, por favor, faça uma postagem. Compartilhar este post Link para o post Compartilhar em outros sites
Henrique Barcelos 290 Denunciar post Postado Julho 26, 2013 Assim como você, estou iniciando agora nessa parte de roteamento. Estou desenvolvendo um framework como forma de estudo, provavelmente vai ser meu TCC também. O que tenho agora é esse pacote aí: https://github.com/henriquejpb/SpiceFramework/tree/master/src/Spice/Routing Ainda não testei em uma aplicação real para saber como se comportaria, provavelmente tenha que alterar algumas coisas. Compartilhar este post Link para o post Compartilhar em outros sites
Hive Pass 2 Denunciar post Postado Julho 26, 2013 Assim como você, estou iniciando agora nessa parte de roteamento. Estou desenvolvendo um framework como forma de estudo, provavelmente vai ser meu TCC também. O que tenho agora é esse pacote aí: https://github.com/henriquejpb/SpiceFramework/tree/master/src/Spice/Routing Ainda não testei em uma aplicação real para saber como se comportaria, provavelmente tenha que alterar algumas coisas. Muito interessante Henrique, estou dando uma olhada em seu código e tentando entender a lógica aplicada. Uma pergunta: Existe uma parte de configuração para o seu sistema de rotas ou ele funciona de forma automática? Eu estou estudando o sistema de rotas de todas as formas, até as formas que eu já conheço eu estou tentando entender mais para tirar uma conclusão final do que eu vou fazer. o que eu posso fazer e qual seria o melhor para a minha aplicação. E também estudar sobre o REST(ful), que é um assunto MUITO novo para mim. Apesar de já ter ouvido falar antes, nunca compreendi ao certo o que era - Mas com a ajuda do @Enrico Pereira lembrei da existência do Rest(ful) e que seria mais um assunto para tomar conhecimento.. Obrigado por compartilhar o seu código (conhecimento). Qualquer novidade que eu tiver estarei postando também. Compartilhar este post Link para o post Compartilhar em outros sites