Magic

Um framework web  opensource escrito em PHP

Também pode chamar de toolkit ;)

https://github.com/gabriel-felipe/magic

Por  Gabriel Felipe

 

Magic o que?

Magic é um framework web. Escolher vários frameworks e integrar eles é complicado, ou no mínimo chato. Para resolver isso o Magic vem com várias funcionalidades que integram o front e o backend.  Algumas coisas que já chegam integradas: 
JQuery,mini-framework css básico e responsivo, pré-processador Less e facilitadores para ajax.


E qual o roteiro dessa apresentação?

  • Introdução à MVC
  • Introdução ao Magic
  • O que muda nos css?
  • Bancos de dados
  • Sistema de rotas
  • Ajax
  • Manager

Introdução a MVC

Versão Wikipedia

Model-view-controller (MVC), em português modelo-visão-controlador, é um modelo de arquitetura de software que separa a representação da informação da interação do usuário com ele. O modelo (model) consiste nos dados da aplicação, regras de negócios, lógica e funções. Uma visão (view) pode ser qualquer saída de representação dos dados, como uma tabela ou um diagrama. 

É possível ter várias visões do mesmo dado, como um gráfico de barras para gerenciamento e uma visão tabular para contadores. O controlador (controller) faz a mediação da entrada, convertendo-a em comandos para o modelo ou visão. As ideias centrais por trás do MVC são a reusabilidade de código e separação de conceitos.

Wikipedia

Introdução a MVC

Versão analogia a algo palpável:  




Maconha.

Introdução a MVC

Versão analogia a algo palpável (Maconha).


O Model seria esse cara ai da esquerda, quem cuida da plantação, ve o que presta, o que não presta, planta as sementinhas colhe as plantinhas...



A View, é o traficante.  É quem leva o produto do Model até o usuário. 

Mas reparem que o produto saiu da plantação como mato, e  o traficante leva o produto para o usuário de uma maneira mais elaborada. Tem uma embalagem, foi pesado, ou seja o produto foi tratado antes. O cara que faz esse tratamento entre o que sai do model, e o que chega na view é o controller.

Uma Introdução ao Magic

Algumas coisas que serão importantes sabermos:

É um framework que suporta varios escopos. 
(Ex.: Área pública, Admin, Área do cliente)

Todas as requisições são feitas ao index.php.

Index.php vai chamar um controller de acordo com a página requesitada, o controller irá se comunicar com os models, bibliotecas e views e retornar o resultado ao cliente.

Um controller pode representar mais de uma página.

O fluxo da requisição


Alguns dados sobre a produção de um app com o Magic:

(Sem ordem e sem função de editar)
19 minutos
~125 linhas de código
1 xícara de café

O que eu já tinha pronto?
Banco de dados
Template. (HTML/CSS)

O que muda no CSS?



Velocidade! 


Framework básico com grid responsivo e classes de ajuda prontas para uso.


Poder

Integrado com pré-processador LESS CSS
.border-radius (@radius: 5px) {
    -webkit-border-radius: @radius;
    -moz-border-radius: @radius;
    border-radius: @radius;
}
/* Implementation */
#somediv {
    .border-radius(20px);
} 
Browser Sniffing dentro do css
if $browser == 'IE':  #browser-warning {display: block; background:#f00;}else:   #browser-warning {display:none;}end

Mais poder

Php dentro do css
<?php 
/*Construindo um grid dinamicamente*/
$nColunas  = 12;
$margin    =  "10px";
$totalGrid = "100%"
  for($i=1;$i<=$gridColumns;$i++){
    echo ".grid$i {lógica de montagem do grid aqui}";
?>
Element Query
.box@(max width 300) p {font-size:12px;}.box@(min width 700) p {font-size:18px; line-height: 32px}

Praticidade

Minificação e agrupamento automático!
Sem prejudicar seu arquivo de desenvolvimento.

Banco de Dados

Para lidar com os bancos de dados existem 4 classes no framework.

DbModel
A DbModel tem o objetivo de usar uma tabela do banco, inserir registros, atualizar, procurar... 
DbModelPlural
Enquanto a DbModel trabalha com um registro, a DbModelPlural trabalha com vários registros, pode portanto realizar operações em massa.
DbManager
As anteriores lidavam com registros, essa lida com a estrutura.  Ela permite você gerenciar as tabelas e suas colunas.
DbConnect

E por último a DbConnect trata das conexões com o banco.

DbModel, Alguns Exemplos:

Procurar um registro da tabela carros onde o id é 5.
$carro = new DbModel("carros");$carro->find(5);
Exibir o título do carro agora que já achamos ele.
echo $carro->titulo;
Retornar todas as informações do carro num array.
$informacoes = $carro->info();print_r($informacoes);
/*Retorna um array associativo entre as colunas e seus valores, por exemplo:
Array(
  "id"=>"5",  "titulo"=>"Palio".... e por ai vai.)

DbModelPlural

Um exemplo (:

Deletar todos os carros que foram produzidos antes de 2000
$carros = new DbModelPlural("carros");$carros->where("ano < :ano", array("ano"=>2000));$carros->destroy();
Na função where, os parâmetros são passados em um array para poderem ser tratados e assim previnir mysqlInjection.

DbModel, a utilização real.

Essa classe foi feita para ser estendida e possui vários métodos "gatilhos" que são chamados em alguns momentos cruciais.

Quais são os gatilhos disponíveis?

before_destroy e after_destroy
before_new e after_new
before_update e after_update
before_new_n_update e after_new_n_update
before_info

Gerenciamento de URL's

Entendendo as urls.

Primeiro temos que entender que cada controller é uma classe, e cada url chamará um método do controller.

Ou seja, para funcionar a url precisará de pelo menos duas informações, qual o método/controller a ser chamado e de escopo?

Gerenciamento de urls

A combinação de controller/método será combinada a formar um parâmetro que chamaremos de "route".  Abaixo temos um diagrama que exemplifica como é formado o parâmetro route. 

Mapeando as URL's.

Para gerenciar essas url's então criamos um arquivo json.
{       "admin" : {        
    "admin/servicos" : { "route":"common_servicos" },
    "admin/news/nova" : { "route":"common_news_nova" },
    "admin/news" : { "route":"common_news" },
    "admin/" : { "route":"common_home" }
  },
  "public" : { 
    "contato": {"route":"common_contato"},
    "news": {"route":"common_news"},
    "depoimentos": {"route":"common_news"},
    "links": {"route":"common_links"},
    "servicos":{"route": "common_servicos"},
    "servico/{^[0-9]+$}":{"route":"common_servicos_info","id":"$1"},
    "": {"route":"common_home"}
  }}

Pegando as URL's


É importante que sempre deixemos o Magic gerar as urls e não coloquemos elas fixas, dessa forma sempre que atualizarmos o mapeamento de urls o sistema atualizará todos os links do projeto.

 /*$this->url->get("route","parametros","scopo")*/ $linkServico   = $this->url->get("common_servicos_info",array("id"=>9);
$linkHomeAdmin = $this->url->get("common_home",false,"admin");

Ajax

O Magic vem com duas classes para facilitar as requisições ajax. A "majax", em javascript e a "json" no php. 

Exemplo:
 //Javascriptvar ajax = new majax;ajax.onSuccess = function(msg,data){//callback em caso de sucesso}ajax.onFail  = function(msg,data){//Callback em caso de falha}ajax.post("route",{postParametros});
 //Phppublic function route(){//Trata os parametros//Para retornar com sucesso:
echo $this->json->success(msg,dataArray);//Para retornar com falha:
echo $this->json->fail(msg,dataArray);
}

Manager

O Manager é um painel de controle que vem junto com o Magic.


Manager, O que faz?




  • Gerencia Scopos
  • Adicionar Controllers
  • Adicionar DbModels
  • Configurar o Banco de Dados
  • Verificar se as permissões de pasta estão ok
  • Exibir logs de erro
  • Abrigar a documentação
  • Gerenciar Rotas

Era isso =P


Gabriel Felipe, Sócio WebingPro


[twitter]@gabrielfelipec




magic

By gabrielfelipe