taviroquai 55 Posted January 18, 2011 Report Share Posted January 18, 2011 Titulo do Projecto: FreeFramePHP Última Versão: 1.0.0 Site Oficial: Ex http://taviroquai.sytes.net/Blog/web/ Licença: BSD Líder do Projecto: taviroquai Membros Actuais do Projecto: taviroquai Descrição do Projecto: FreeFrame é uma framework leve e minimalista para PHP5 * PHP5: http://php.net/ChangeLog-5.php * RIA: PHP Framework para RIA (Rich Internet Application) * Mustache para templates - http://mustache.github.com/ * ORM RedBeanPHP (com Legacy) integrada - http://redbeanphp.com/ * Segurança: ACLs - utilizadores, cargos e recursos * Internacionalização: ficheiros de catalogo para mensagens (.ini), * Caching: PHP APC ou custom ficheiros de cache * Plugins Download: Dropbox Dropbox (pacote com demos) Update (20/01/2011): foram corrigidos alguns problemas e adicionados comentários às classes do core. As classes Core e Core_Cache são agora estaticas. O Core_Loader desapareceu para dentro do Core. Agora carrega-se outro component com [s]$component [/s]= Core::load('HelloWorld'); sendo o Core::load() um proxy para instanciar componentes. Update (23/01/2011): Adicionados 3 wrappers para facilitar a API: 1. Pode-se obter a instancia de outro componente com $this->load($nomeComponente, $argumentos), um wrapper do Core::load(). Uma semelhança com o CodeIgniter. Bem simples 2. Pode-se obter logo o output de outro componente com $this->loadOutput($nomeComponente', $argumentos), um wrapper do anterior. 3. Pode-se obter a string da localização através de $this->translate($key), sendo $key a chave da string no ficheiro de localização .ini Update (26/01/2011): No demo do blog, adicionado um controlador .js (opcional) que demostra a facilidade com que uma aplicação pode funcionar sem javascript, ou com javascript, bastando para isso incluir apenas uma linha de código no <head>. Update (30/01/2011): Foram corrigidas algumas incoerencias a nivel de estética do código nos componentes CRUD da administração. Adicionada a possibilidade de chegar directamente a um método público do componente. Exemplo: index.php?c=BlogDemo&m=viewLink As keys "c" e "m" são configuraveis no ficheiro config.php; Adicionada a possibilidade de fazer cache por componente; Adicionada a opção de "saltar" as ACLs; desta forma todos os users têm acesso a todos os componentes (útil para pequenas aplicações que não requerem permissões). Adicionado o script de instalação: /install/install.php Adicionado RedBeanPHP Legacy. Agora funciona nas versões php > 5.2. Testei agora num alojamento partilhado. Update (01/02/2011): Adicionada pasta /Classes/Models para suportar subclasses do RedBean_SimpleModel chamadas pelo Fuse. Já se pode separar os models dos components. Adicionado o método Core_Component::loadView() para facilitar o carregamento das views localizadas na pasta relativa "views/". Já se pode separar as views do componente. Assim, para carregar uma view a partir de um componente basta usar: $this->loadView('nome_do_ficheiro.php'). A pasta para as views também é configurável no config.php. Exemplo de uso das views: $doc = $this->loadView('Document.php'); $doc->title = $this->translate('DocTitle'); $out = $doc->render($this->loadTemplate('document.xhtml')); $this->setOutput($out); Update (05/02/2011): Correcção sobre ACLs: Agora é possivel definir quais os roles condicionados pelas ACLs. Ou seja, se disser que o role admin não é condicionado então não são verificadas as ACLs para este role, embora seja possivel registar as regras e mais tarde tornar estes roles novamente condicionados pelas ACLs. Digamos que é uma camada global antes de verificar as ACLs. Corrigido os ficheiros de localização .ini. Doble quotes para as string funcionam em todas as versões > 5.2.x Update (08/02/2011 Refactoring da estrutura de pastas, mais familiar com outras frameworks. Incompativel com demos da versão anterior. / config.php application/ cache/ classes/ Controller/ Model/ View/ Plugin/ data/ i18/ en_US/ templates/ framework/ classes/ install/ autoload.php freeframe.php web/ controllers/ images/ js/ index.php Update (09/02/2011) Multiplas bases de dados: agora já é possivel usar mais do que 1 base de dados. Classe principal FF é singleton. FreeFrame é agora MVC. No entanto é possivel aceder à base de dados e fazer echo usando apenas o controlador... a separação fica ao critério do programador. Agora é possivel encadeamento de métodos nas views (Method Chaining, Fluent Interfaces). Exemplo: $template = FF_Template::factory ('PublicHome_Document'); $view = FF_View::factory ('PublicHome_Document') ->setTemplate ($template) ->setTitle ($this->translate('DocTitle')) ->addScript (URL . 'js/jquery-1.4.4.min.js') ->addScript (URL . $this->resource_path . 'js/init.js') return $view->render(); Update (12/02/2011) Correções de bugs relacionados com a passagem de "component" para "controller". Adição de pesquisa no backend dos controladores, pois o numero de controladores vai crescer bastante. Melhores ACLs: agora um user pode pertencer a mais do que 1 role. Quando na verificação de permissões, se um usar pertencer a 2 ou mais roles, basta que um role tenha o acesso negado para resultar em DENY. Update (13/02/2011) Corrigido o nome das tabelas (lowercase) para funcionar tanto no Windows como Linux. Update (27/02/2011) Nova classe FF_Request. Permite fazer pedidos http dentro da aplicação. Útil para carregar outras páginas fora da framework. Update (06/03/2011) FF_Session: um wrapper para controlar as sessions e ser possivel estender. FF_Session_RedBean: sessions pela base de dados. Plugin_DBSession: basta ligar/desligar e usa as sessões por defeito do php ou base de dados. PluginManager: um CRUD GUI para os plugins, tal como já existia para Locale, Role, User, Controller e ACL. Um repositório SubVersion aqui: http://taviroquai.sytes.net/opt/svn/FreeFrame/ Correcção de N bugs Update (11/04/2011) Correcções para funcionar no PostgreSQL nomeadamente na classe Paginator. Adicionadas opções para a escolha do nome das tabelas 'user' e 'role' uma vez que estas keywords estão reservadas no PostgreSQL. melhorias por vir... Link to post Share on other sites
softklin 11 Posted January 18, 2011 Report Share Posted January 18, 2011 Também preciso de plugins... já temos plugins mas isto ainda está muito verde... à que melhorar... talvez o softclean me pudesse dar uma ajuda... Ainda não dei uma olhada ao projecto, mas porquê eu para os plugins? Nick antigo: softclean | Tens um projeto? | Wiki P@P Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post. Link to post Share on other sites
taviroquai 55 Posted January 18, 2011 Author Report Share Posted January 18, 2011 Ainda não dei uma olhada ao projecto, mas porquê eu para os plugins? Ops... enganei-me... afinal é o scorch que está a frente do projecto SimpleEventsDrivenPHP e é esse tipo de arquitectura que quero meter nos plugins... Scorch, és tu! Link to post Share on other sites
scorch 12 Posted January 18, 2011 Report Share Posted January 18, 2011 Hum, se quiseres podes usar a minha classe à vontade. Eu ainda estava a pensar fazer uma versão 2, vamos ver se o tempo chega. Se tiveres alguma dúvida, também te posso ajudar, embora agora esteja um pouco apertado de tempo (9º Ano)... 😳 PS: Não respondo a perguntas por mensagem que podem ser respondidas no fórum. Link to post Share on other sites
softklin 11 Posted January 18, 2011 Report Share Posted January 18, 2011 Então é daí Mas pois, é o Scorch que lidera esse projecto, eu apenas o comentei e testei, e sugeri um exemplo com plugins. O Dropbox está a dar 404. No entanto, infelizmente também não devo ter tempo para ajudar nalguma coisa, pois mais dois exames se avizinham.... Nick antigo: softclean | Tens um projeto? | Wiki P@P Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post. Link to post Share on other sites
taviroquai 55 Posted January 19, 2011 Author Report Share Posted January 19, 2011 Pois eu tinha mais ou menos a ideia de que 2 dois estavam de alguma forma envolvidos no projecto de PHP eventos mas já não tinha a certeza... Anyway... já coloquei uma versão mais actual no dropbox. Corrigi uma série de coisas... mas ainda falta muita coisa... Assim por alto, falta documentação, acabar os eventos para os plugins, excepções, criar um install, etc... etc... e quando isto estiver razoável meto no github... Ya scorch, amanha vejo a tua classe Ah! Isto talvez não funcione no windows ... quem testar no win coloque aqui os bugs... Link to post Share on other sites
yoda 126 Posted January 19, 2011 Report Share Posted January 19, 2011 Mete o .zip num servidor tipo rapidshare ou assim, não consigo sacar. before you post, what have you tried? - http://filipematias.info sense, purpose, direction Link to post Share on other sites
taviroquai 55 Posted January 19, 2011 Author Report Share Posted January 19, 2011 Adicionei um link em cima para o 4Shared. Link to post Share on other sites
taviroquai 55 Posted January 20, 2011 Author Report Share Posted January 20, 2011 Acerca dos eventos... actualmente tenho implementado o padrão "observer"... li aqui mais duas formas de fazer isto: http://stackoverflow.com/questions/4471183/php-event-listener-best-practice-implementation Talvez podesse implementar o Mediator usando a class do scorch, mas teria que haver alterações ou estender aquela classe... que dizes scorch? Link to post Share on other sites
scorch 12 Posted January 20, 2011 Report Share Posted January 20, 2011 Bem, a class é basicamente igual ao Mediator, não sei que alterações seriam necessárias. Btw, a classe foi feita mais com base no Mediator que no Observer. PS: Não respondo a perguntas por mensagem que podem ser respondidas no fórum. Link to post Share on other sites
taviroquai 55 Posted January 20, 2011 Author Report Share Posted January 20, 2011 The mediator can then keep track of which listening objects want to receive that event,[...] Na tua classe posso registar a função que responde aos eventos, mas preciso registar o objecto e a função... Link to post Share on other sites
scorch 12 Posted January 20, 2011 Report Share Posted January 20, 2011 Pois, isso está a ser feito na versão 2.0, só que o tempo não é muito para criar algo apresentável. PS: Não respondo a perguntas por mensagem que podem ser respondidas no fórum. Link to post Share on other sites
taviroquai 55 Posted February 4, 2011 Author Report Share Posted February 4, 2011 Pips, Antes de meter isto no github gostava que dessem uma vista de olhos e comentassem quanto ao que gostam ou não gostam desta plataforma. Muito do código inicial foi re-escrito, mas agora está mais estável... Alguns pontos chaves que são específicos do FreeFramePHP, embora similar a outras frameworks que há por aí... 1. Os requisitos para correr são os mesmos do RedBeanPHP 2. ORM incluido: RedBeanPHP. Não estou pensando em torná-la flexivel para encaixar outros ORMs... embora sei que isso seria bom para quem usa outros ORM. 3. Arquitectura por Components. Exemplo de um Componente: <?php /** * HelloWorldDemo Component * * @author mafonso */ class HelloWorldDemo extends Core_Component { public function __construct() { ; } /** * The default function got by $this->load() when requesting index.php?c=HelloWorldDemo * * @return string Returns the content generated */ public function index() { /* * Use setOutput method to set what will be sent out */ $this->setOutput('<h1>Hello World</h1>'); } /** * Html link for this component */ public function viewLink() { $html = sprintf('<a href="%s">HelloWorld</a>', URL . $this->uri); $this->setOutput($html); } } 4. Incluido Classe Mustache para Views e Templates. Exemplo de uso: $view = 'Document.php'; $template = 'document.xhtml'; $doc = $this->loadView($view); $doc->title = $this->translate('DocTitle'); $this->setOutput($doc->render($this->loadTemplate($template))); 5. ACLs incluidas (mas não obrigatŕorias). Ao usar o método load() (proxy para instanciar) para carregar um componente, são verificadas as ACLs na base de dados. Pode-se ainda passar argumentos (opcional). $this->load('NomeDoComponente', $args); 6. Cache às páginas geradas. Por exemplo a página inicial do Blog tem este benchmark: 502856 bytes 0.061845 sec Depois de colocar em cache (usando APC), tem este benchmark: 11060 bytes 0.000484 sec 7. Internacionalização. Para carregar os ficheiros de strings das línguas usa-se $this->loadLocale(). Para obter a string, usa-se $locale->translate(): $locale = $this->loadLocale('zh_CN.ini'); $locale->translate('HelloWorld'); 8. jQuery incluido. Mas pronto... pode-se usar outra framework JS. 9. Ficheiro config.php onde se pode configurar quase tudo sem mexer no código ... Um pequeno resumo da API. Apenas com estes métodos é possivel criar coisas bem simples e outras complexas: // Sobre componentes $this->load('NomeComponente'); // Para carregar outro componente (uma instancia) $this->load('NomeComponente', $args); // Para carregar outro componente e passar um array() de argumentos $this->args[$key]; // Para aceder aos argumentos passados $this->loadOutput('NomeComponente'); // Para devolver logo o output por defeito daquele componente //Agora um pouco de RedBean (ORM) $carro = R::dispense('Carro'); //inicializa um objecto Carro $carro->marca = 'Ford'; // Atribui uma propriedade marca $id = R::store($carro); // Guarda o objecto carro e devolve um ID $carro = R::load('Carro', $id); // Para carregar um objecto Carro através de um ID $carro->apita(); // Usando um Model_Carro extends RedBean_SimpleModel pode-se criar métodos pŕoprios do modelo // Sobre Views, Templates e Output $view = $this->loadView('NomeClasse'); // Para carregar uma view $template = $this->loadTempplate('NomeFicheiroHtml'); // Para carregar um ficheiro HTML $output = $view->render($template); // Para devolver o output gerado pela View $this->setOutput($output); // Para definir o output do componente actual echo URL; // Constante que devolve a URL base echo $this->uri; Devolve a query string para chamar o componente no browser. Exemplo: '?c=NomeComponente' // e outros setters e getters... Digam o que gostam e o que não gostam e que podia ser melhorado deste "produto português" Obrigado. Link to post Share on other sites
yoda 126 Posted February 4, 2011 Report Share Posted February 4, 2011 O que não gostam .. Ui before you post, what have you tried? - http://filipematias.info sense, purpose, direction Link to post Share on other sites
taviroquai 55 Posted February 4, 2011 Author Report Share Posted February 4, 2011 Va la yoda, poe la aí o que não gostas... preciso de feedback com fundamento! Link to post Share on other sites
yoda 126 Posted February 4, 2011 Report Share Posted February 4, 2011 Não tenho muito a fundamentar, porque não a usei, mas como OOP não gosto, não faz sentido muita da sintaxe nem a forma como as coisas se processam. before you post, what have you tried? - http://filipematias.info sense, purpose, direction Link to post Share on other sites
taviroquai 55 Posted February 4, 2011 Author Report Share Posted February 4, 2011 Ok... vamos por partes... Acerca da sintaxe, vou tentar explicar o porquê desta sintaxe... $componente = $this->load('NomeComponente'); faz o mesmo que... $componente = new NomeComponente(); Acontece que o $this->load() é um proxy para instanciar uma classe. O mesmo acontece para $this->loadView(), $this->loadTemplate(), $this->loadOutput()... O CodeIgniter é bastante usado e usa algo semelhante: $this->load->model('NomeModel'); // Para carregar um model $this->load->view('NomeView'); // Para carregar a view Faz-te assim tanta diferença? Até se pode meter igual ao CodeIgniter Acerca da forma como as coisas se processam... basicamente as outras frameworks usam um "router" para chegar aos controladores, tipo: http://maquina/aplicacao/?/controlador/funcao/ Aqui não é diferente... basta passar a query string index.php?c=NomeComponente&m=Metodo o que com URL rewrite pode-se obter o mesmo ?/NomeComponente/NomeMetodo/ Portante é bastante similar a outras plataformas já existente... 🤔 Talvez depois de experimentar e perder um pouco de tempo (tal como o tempo necessário para aprender qualquer outra framework) seja mais facil digerir isto Link to post Share on other sites
yoda 126 Posted February 4, 2011 Report Share Posted February 4, 2011 CodeIgniter sucks Acho que fazias bem em investigar melhor as outras frameworks, de modo a perceber o uso de certos conceitos e a ver mais exemplos de OOP. http://kohanaframework.org/ (a que uso em tudo praticamente) http://www.yiiframework.com/ (meh) http://cakephp.org/ (meh) .. and so on. before you post, what have you tried? - http://filipematias.info sense, purpose, direction Link to post Share on other sites
taviroquai 55 Posted February 4, 2011 Author Report Share Posted February 4, 2011 Não vou correr todas as features de todas as Frameworks... cada uma tem a sua forma de "carregar" as classes/ficheiros mas todas têm que o fazer... o que muda é a API e o consumo de memoria e performance. Se bem que essas frameworks que indicaste são bem mais maduras e têm muitas mais features (por vezes bem pesadas ) o que não se pode usar esse critério para comparar com esta plataforma. Há muitas coisas que se podem adicionar mas também não quero saturar a API. Quero manter isto o mais simples possivel... Mas podemos comparar pequenos exemplos de funcionamento... por exemplo I18n: Kohana, I18n é um helper e carrega as mensagens de uma lingua com: $messages = I18n::load('xx-xx'); Para devolver uma tradução: $hello = I18n::get('Hello friends, my name is :name'); A Yii, organiza os ficheiros por categorias e carrega uma instancia de um CLocale com: $locale = CLocale::getInstance($localeID) Para traduzir: Yii::t('Xyz.categoryName', 'message to be translated') A CakePHP, para usar I18n, é necessário correr um comando na consola. Para traduzir tem 3 funções... a mais utilizada __(): __('Posts') Na FreeFramePHP, os componentes carregam por defeito o ficheiro de localização consuante a localização do user (faz todo o sentido). E ainda se pode carregar outras instancias da classe Core_Locale com: $locale = $this->loadLocale('xx-xx'); Para traduzir: echo $locale->t($key); Bem parecido com o Kohana . Vejam a demonstração LocaleDemo. Só precisava que vissem esta base e se a acham facil de utilizar e se se obtem bons resultados... Link to post Share on other sites
yoda 126 Posted February 4, 2011 Report Share Posted February 4, 2011 Bem, parece-me que não queres mesmo ajuda. Não quis comparar nada, apenas disse que os métodos que usas (e isso não está intrinsecamente ligado com features, que é meio irrelevante) não me cativam e não os acho práticos o suficiente para uma framework. Sou apologista da máxima que "a fazer, que seja por um bom motivo e sempre para o melhor" (a não ser que o intuito seja aprender, que é outro caso). Acho mesmo que devias experimentar as outras frameworks, do que vi por alto da tua, pareceu-me mais um remake do que anda por aí, não vi nada que me saltasse à vista como factor decisivo de uso (em termos de performance até ficou bem abaixo). Se querias manter a framework simples, deves começar por desenhá-la em papel ou com outro método qualquer em que possas definir, sem ter de recorrer directamente ao código, aquilo que pretendes e o que achas essencial. O caso do jQuery, por exemplo, é lixo numa framework PHP, não faz qualquer sentido estar a incluir isso. before you post, what have you tried? - http://filipematias.info sense, purpose, direction Link to post Share on other sites
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now