Studs framework para PHP
Graças a algumas mudanças aqui no trabalho, tivemos que repensar o uso do Code Igniter como framework para os sistemas PHP. A idéia é aproximar programadores Java e PHP, e fazer com que ambos sejam capazes de desenvolver em qualquer uma das duas linguagens. Por isso eu disse que estava bebendo do café, uns tempos atrás.
Pra facilitar o trabalho de todo mundo, e até mesmo facilitar o entendimento da framework Struts do Java, pelos programadores PHP, resolvemos testar alguns portes desta aplicação. Com a ajuda do Leonardo Rodrigues, que programa Java e PHP, adotamos o Studs por ela ser, segundo ele, bem fiel ao Struts.
Achei a documentação um pouco fraca, e não esclarece muito como a framework funciona, mas entender o funcionamento das coisas, pelo menos até aqui, não foi muito difícil.
De cara o Leonardo achou uma diferença entre o Struts e o Studs, que é a possibilidade de definir qual método da classe será acionado pela action, configurado pela propriedade parameter do elemento action no struts-config.xml. Mas nada que uma mexida no núcleo não resolva.
. Basta abrir o arquivo RequestProcessor.php, na pasta WEB-INF/studs/action/. Procure o método processActionExecute. Segue o método alterado:
function &processActionExecute(&$request, &$response, &$action, &$form, &$mapping)
{
$parameter = $mapping->getParameter() ? $mapping->getParameter() : 'execute';
// try {
$result =& $action->$parameter($mapping, $form, $request, $response);
//$result =& $action->execute($mapping, $form, $request, $response);
// } catch (RootException $e) {
if ($e = catch_exception())
{
$result =& $this->processException($request, $response, $e, $form, $mapping);
}
// }
return $result;
}
Dessa forma você não precisará fazer uma classe pra cada Action, e, se não definir um parameter, o Struds vai assumir o comportamento padrão, que é executar o método execute().
Artigos Relacionados:
Comparação de Frameworks PHP
Vi só agora no blog do Elton Luís Minetto um link para um TCC (Trabalho de Conclusão de Curso) com uma comparação entre três famosas frameworks desenvolvidas em PHP: PRADO, Symfony e CakePHP, disponível em PDF.
É uma boa pra quem pretende escolher a dedo qual framework utilizar, ou apenas aprender mais sobre elas.
Veja mais informações sobre frameworks também aqui mesmo no blog.
Artigos Relacionados:
Rapyd com Code Igniter
Voltando aos meus estudos do Code Igniter, acabei encontrando no Blog do Deco uma espécie de estensão da framework, que é o Rapyd. Ele oferece uma série de componentes, agilizando ainda mais o desenvolvimento da sua aplicação.
Dei uma olhada rápida até aqui, mas achei bem interessante e já baixei a instalação pra testar mais tarde. Por enquanto você pode ir dando uma olhada também em alguns exemplos e no guia do usuário, que é bem prático, assim com a documentação do CI.
Artigos Relacionados:
Code Igniter: Estendendo o Controller
Continuando a adaptação da framework Code Igniter para utilização no meu projeto, e também para utilização no meu trabalho, desta vez vou falar de como estender o Controller para sempre carregar uma visualização padrão, e inserir nela a view de conteúdo.
Como já disse anteriormente, para criar extensões das core classes do CI, devemos salvar o arquivo com na pasta application\libraries, com o prefixo MY_. Nesse caso, teremos o arquivo MY_Controller, e a classe de mesmo nome.
Vamos para o código, depois eu explico os detalhes:
class MY_Controller extends Controller
{
/**
* metodo construtor da classe
*/
function MY_Controller()
{
parent::Controller();
}
/**
* mostra a view definida utilizando uma estrutura pre-definida
* @param [str] nome da view a ser exibida
* @param [arr] array com os dados da view a ser exibida
*/
function _mostrar($nmView, $viewData)
{
$conteudo = $this->_carregarConteudo($nmView, $viewData);
$data = array(
"conteudo" => $conteudo
);
$this->load->view('estrutura', $data);
}
/**
* carrega a view a ser inserida em uma estrutura pre-definida
* @param [str] nome da view a ser inserida
* @param [arr] array com os dados da view a ser exibida
* @return [vew] objeto de View para ser incluido
*/
function _carregarConteudo($nmView, $viewData)
{
return $this->load->view($nmView, $viewData, TRUE);
}
}
Criamos o metodo _mostrar(), que deve ser utilizado nas suas classes de controle para exibir uma view (ao invés de usar $this->load->view()). O método _carregarConteudo() não é totalmente necessário para este exemplo, mas ele é responsável por carregar a view de conteúdo da sua página, ou seja, o que será inserido dentro da view geral.
Nossas classes de controle da aplicação, agora teriam funcionamento parecido ao desta:
class Meucontrole extends MY_Controller
{
function Meucontrole()
{
parent::MY_Controller();
}
function index()
{
$data = array("var" => "valor");
$this->_mostrar('minhaview', $data);
}
}
Declaramos a classe estendendo de MY_Controller, definimos o método construtor, e, no método de exibição, definimos "var" para ser utilizada na view "minhaview", através do método _mostrar() que criamos anteriormente. Dessa forma, o conteúdo de "minhaview" será inserido na view "estrutura", através da variável conteudo.
Este é mais um exemplo simples, que pode ser incrementado conforme suas necessidades. Pode-se criar chamadas de Menus dinâmicos, Banners de Publicidades, tudo automaticamente, sem precisar carregá-los em todo controle que você criar.
Artigos Relacionados:
Bug estendendo o Code Igniter: MY_Model
No meu artigo sobre como estender o Core do Code Igniter, eu informei sobre um possível bug que não nos permite criar nosso MY_Model, como manda o user guide da framework.
Reportei o bug no fórum e até hoje não obtive resposta do desenvolvedor do CI, mas acredito que a solução que encontrei é aceitável. A alteração deve ser realizada no arquivo Loader.php, que está na pasta system\libraries. No método model() desta classe, temos o seguinte trecho:
if ( ! class_exists('Model'))
{
require_once(BASEPATH.'libraries/Model'.EXT);
}
Ou seja, ele carrega a classe Model, mas não realiza nenhuma verificação se criamos alguma estensão (MY_Model). Para resolver o problema, verifiquei que existe uma função que executa esta tarefa de carregar uma classe buscando por extensões. Logo, bastava utilizá-la. No lugar do código anterior, coloquei a chamada para a função:
load_class('Model', false);
O if não é necessário, pois a função também realiza esta verificação. O segundo parâmetro é utilizado para que a classe não seja instanciada, apenas carregada. Assim, evitamos o problema de instanciar classes, dentro de um controle, sem que elas tenham sido definidas.
