Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Vinicius Lima_48564

Melhor estrutura de sistema em php

Recommended Posts

Boa tarde, recentemente fui contratado para o desenvolvimento de um sistema do zero, um cms para ser mais específico. Este sistema deve ser em mvc, orientado a objeto e semelhante ao wordpress (com pasta de temas e plugin independentes).

 

Devido a isso comecei a ler código fonte do wordpress, e outros scripts como elgg por exemplo; durante as minhas "leituras" observei que esses sistemas carregavam o script através de uma série de includes e requires, carregavam constantes primeiro, depois algumas classes, depois outras e lá no final depois de todo o sistema carregado aí chamavam os arquivos de view.

 

A minha dúvida é qual a maneira "mais indicada" para o desenvolvimento de um sistema em php? Nós precisamos necessariamente encher o script de funções e diversos arquivos incluidos sempre que o sistema for carregado; ou podemos simplesmente só fazer um auto_load de classes principais e funções diretamente no script que for chamado?

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiro, não é NECESSARIAMENTE que precisa.

trabalhar com o autoload é bacana mas no final o arquivo ainda vai ser incluido só que você não vera isso.

 

mas eu prefiro um autoload do que um monte de include.

 

leve em conta que o wordpress trabalha por widgets/blocos para montar sua estrutura, isso para que você modifique 1 arquivo e ele possa ser aplicado ao restante do site (parte mágica do wordpress, trabalho com esse conceito desde que conheci)

 

agora por ultimo.

classes e funções

Não existe em orientado a Objeto

http://forum.imasters.com.br/topic/392555-11-classes-x-objetos/

 

e o que significa simplesmente só fazer quando for chamado?

Compartilhar este post


Link para o post
Compartilhar em outros sites
Wordpress é (quase) todo escrito usando código procedural, se você quer fazer um CMS usando o padrão MVC, o Wordpress não é um exemplo a seguir. Só o .htaccess, aí sim. Redirecione todas as requisições (exceto as requisições de arquivos -- CSS, JS, PNG, etc) para index.php.


Quanto ao carregamento, creio que a melhor forma é adicionar o diretório onde estão as classes (geralmente chamado lib) e os diretórios de controllers, models e views.




├ lib/
└ core/
├ controllers/
├ models/
├ views/
├ public/
├ .htaccess
├ index.php



<?php
$paths = array(
    "../lib",
    "../core/controllers",
    "../core/models",
    "../core/views",
);
 
$realpaths = array();
 
try {
    foreach ($paths as $path)
    {
        $realpath = realpath($path);
        if ($realpath) {
            $realpaths []= $realpath;
        } else {
            throw new Exception("Path not found: {$path}");
        }
    }
} catch (Exception $e) {
    echo $e->getMessage();
    exit;
}
 
set_include_path(get_include_path()
  . PATH_SEPARATOR
  . implode(PATH_SEPARATOR, $realpaths)
);
 



Use o autoload recomendado por PSR-0.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito obigado Vinícius e mangakah pelas respostas.

 

Vinícius o que eu quis dizer com só fazer quando for chamado, é o seguinte. Pelo que eu vi do wordpress independente do que o usuário fizer, ele sempre carregará todo o script, todos plugins, resumindo todo site.

Entretanto se um usuário do sistema quiser ir na página "Fale Conosco" que contém um simples formulário e a sua unica ação é validar os dados desse formulário e inserí-los no banco de dados, seria necessário eu carregar classes de Administrador, Usuário, Editor e o que mais for. Para a página Fale Conosco tudo que eu preciso, é de uma classe que realize a inserção dos dados na tabela apropriada e nada mais. Sendo assim ums script contato.php que incluí-se: funções, Classe de Banco de Dados, constantes e algum arquivo mais que seja necessário a todo o site já basta, concorda?

 

Já pelo que vi do wordpress se eu fosse criar esta mesma página Fale Conosco, o wordpress carregaria todos o sistema incluindo uma série de classes que não seriam úteis ao que seria feito, tudo isso desnecessariamente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso é um problema de performance, o WordPress não usa lazy-loading.

 

Esqueça funções, são uma destruidora de um sistema. Não existe autoload de função, require/include é um lixo e deixa o sistema péssimo para manutenção.

 

Use autoload, ele automaticamente vai incluir a classe (se já não foi antes) quando você tentar fazer uma referência. E não se esqueça que existem também interfaces. Não use orientação a classe, cuidado.

 

Esqueça também a ideia de colocar tudo em um arquivo só. Uma classe => um arquivo.

 

Uma estrutura real:

projeto/
    app/
        autoload.php
        configs/ (pode ser yml, xml, json, etc.)
        database.php
        mailer.php
        routes.php
        ...
    /views (as views e layouts do sistema)
        ...
    src/ (código com namespaces, seguindo PSR-0)
        NomeDaApp/ (vendor)
        Contact/ (módulo do fale conosco)
            Controllers/
            Entities/ (VOs)
            ...
        News/ (módulo de notícias)
            Controllers/
            Entities/ (VOs)
            ...
        Dispatcher/ (o componente que vai receber a requisição, montar as configs, baseado na rota executar o controller e mandar a resposta para o cliente)
            ...
    vendor/ (bibliotecas de terceiro, recomendo composer para gerenciá-las)
        ...
    public/ (pasta para onde o servidor vai apontar, também chamada de public_html/www/htdocs/etc.)
        index.php
        .htaccess (se necessário)

Ficaria pesado fazer tudo na mão, tente experimentar bibliotecas como as do Aura (PHP 5.4+ apenas).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito obrigado pela resposta Enrico, foi de grande utilidade estava meio perdido de verdade quanto a organização do projeto e se existiam padrões para a sua construção. Já havia prourado na internet e não havia encontrado entretanto graças a sua resposta pude encontrar mais informações sobre como desenvolver um código mais padronizado e de fator "verdadeiramente" Orientado a objeto.

 

Tenho muitas dúvidas ainda sobre como a Orientação a Objeto funciona no php, mas essas dúvidas não são referentes ao que é uma classe, o que é uma interface, etc.. Minhas dúvidas são referentes a quais as suas funções práticas no script e como tudo se relaciona, pois na maioria das demonstrações são usadas classes como Pessoa, Aluno, Animal, etc. Entretanto teoricamente no desenvolvimento de um sistema não usamos classes como essas, e infelizmente quando eu vou desenvolver o código não consigo visualizar claramente ainda como que classes e objetos vão conceber uma página.

Compartilhar este post


Link para o post
Compartilhar em outros sites

:seta: O primeiro ponto é entender a diferença entre ambas.

 

Classe é um protótipo.

Objeto é uma instância de um protótipo.

 

:seta: O segundo é esquecer herança

:seta: O terceiro é esquecer métodos/propriedades estáticas

 

(Falei isso porque não se aprende OO pensando em herança e estáticos.)

 

:seta: O quarto é esquecer o modelo de páginas e pensar em módulos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

São classes, você, em um sistema real orientado a objetos, não vai ter um único arquivo com código espaguete, as responsabilidades são divididas. Não se chega e sai digitando código em qualquer lugar.

 

Melhor forma de aprender: ler código

 

Um exemplo: https://github.com/zendframework/zf-web

Sim, é complexo esse código, mas perceba que não é um código procedural, onde você praticamente trabalha com comandos "corridos". Não precisa nem entender o código em si, mas perceber que é tudo divido.

 

Eu escolhi essa aplicação justamente por levar "módulos" em conta.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito obrigado novamente Enrico :yes: , agora estou começando a entender tudo isto (na teoria é claro). Vou estudar e ler o código fonte deste framework na tentativa de conseguir visualizar como é divido cada coisa e como elas se comunicam entre si. Vai ser de grande utilidade, agora o jeito é estudar novamente né kk.

 

Devido a tudo isso me bateu mais um dúvida (essa é a última prometo), o profissional de php que estuda todos esses padrões e técnicas de desenvolvimento obtém o reconhecimento no mercado de trabalho? Eu programo há dois anos e há 1 ano trabalho como free lancer fazendo trabalhos em sites simples ou com código "mal escrito", geralmente os trabalhos que peguei eram códigos mais procedurais, os que tentavam ser Orientados a Objeto, ou usavam poucas classes e simplesmente instânciavam um objeto dentro de um script quase que todo procedural, ou faziam o uso de frameworks e cms como cakephp e wordpress respectivamente.

 

Essa minha necessidade de aprender esses "padrões de projeto" e a Orientação a Objeto "verdadeira" mesmo, se deu pelo fato de eu não estar contente com o código que produzia e que modificava, e também pelo fato de eu estar desenvolvendo um cms do zero e como vai se tratar do produto de venda de uma empresa, achei que deveria dar mais atenção e produzir um sistema o mais organizado e "correto" possível.

 

Entretanto devido a toda essa parte que eu não conhecia, fiquei com essa dúvida, no mercado de trabalho atual todo esse esforço por um código de qualidade e totalmente orientado a objeto vale a pena?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vale, pois o que mais acontece em um sistema é manutenção. E manutenção com código ruim é uma péssima experiência, além de que com um código OO podemos criar testes automatizados e integração contínua (não precisa pesquisar sobre isso agora).

 

E outro ponto é a reutilização, você não vai fazer aquilo mil vezes se criar um código bem feito e abstrato.

 

A OO é um longo caminho, teoria, princípios SOLID, GRASP, Design Patterns, etc. mas lembre-se que a OO não faz um bom código, quem faz o bom código e o programador, a OO é uma excelente base apenas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito obrigado pela ajuda Enrico, você ajudou bastante. Agora vou pesquisar, estudar e testar até conseguir compreender tudo isso. Muito obrigado novamente Enrico pela paciência e ajuda. vou encerrar este tópico o problema já foi resolvido.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.