Upload
rafael-garcia
View
12.136
Download
1
Embed Size (px)
DESCRIPTION
Principais características do Yii Framework e Mão na massa! Palestra apresentada na Íparos Design Studio no primeiro ciclo de palestras de 2011
Citation preview
[email protected] www.yiiframework.com
[email protected] www.yiiframework.com
Rafael Alves Nogueira [email protected]
Desenvolvedor PHP há 9 anosDesenvolvo com Yii Framework há 2 anos
Já desenvolvi algumas extensões para o Yii:* Wrappers para extensões Jquery;* Integração com PHP IDS;
[email protected] www.yiiframework.com
Sobre o Yii:
Is it fast? ... Is it secure? ... Is it professional? ... Is it right for my next project? ... Yes, it is!
Quiang Xue, desenvolvedor do Projeto Prado, iniciou o desenvolvimento do Yii em Janeiro de 2008. Em dezembro a versão 1.0 estava pronta, hoje estamos na versão 1.1.6 e a versão 2.0 reformulada para o php 5.3 estará disponível em Dezembro de 2011.
Caracteristicas...
OOP, MVC, DRY, DAO/QueryBuilder/AR, Form Input Validation, AJAX Widgets, RBAC, Skin and Theme, WebService, I18N, L10N, Layered Cache, Error handling and log, Security ( CSRF, XSS, SQL Injection, HTML Purify and Cookie), Teste Unitário e Funcional, XHTML, extensões, modularidade, Drive Event, scaffolding, etc.
O guia do Yii é utlizar as melhores ideias de vários projetos e frameworks e extensivamente o lazy loading.
[email protected] www.yiiframework.com
WorkFlow<?php$yii=dirname(__FILE__).'/../yii/framework/yii.php';$config=dirname(__FILE__).'/protected/config/main.php';
defined('YII_DEBUG') or define('YII_DEBUG',true);defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL',3);
require_once($yii);Yii::createWebApplication($config)->run();
[email protected] www.yiiframework.com
OOP, MVC e DRY
Componentes Extensões
Controller,Actions e
Filter
Behaviors
Widgets
Model
Controller
View
Modules Vendors
[email protected] www.yiiframework.com
DAO/QueryBuilder/AR
Yii::app()->db->createCommand($sql)->execute();
Yii::app()->db->createCommand()->select('nome')->from(Usuario::model()->tableName)->where(’id=:id’, array(’:id’=>$id))->queryRow();
$Usuario = Usuario::model()->findByPk($id);$Transaction = Yii::app()->db->beginTransaction();$Usuario->nome = 'Teste...';try{
$Usuario->save();$transaction->commit();
} catch (Exception $e) {$transaction->rollBack();
}
CActiveRecord
Evento
Compromisso Reunião
[email protected] www.yiiframework.com
DAO/QueryBuilder/ARCaracterísticas muito uteis do AR
1) Instruções em massa:ActiveRecord::deleteAll(condition);ActiveRecord::updateAll(params, condition);
4) Eventos:ActiveRecord::beforeValidate();ActiveRecord::afterFind();
2) Behaviors:Modificam ou adicionamcomportamentos.
3) campos calculados
class Usuário extends CactiveRecord {…public function getNomeCompleto() {
return “$this->nome $this->sobrenome”;}...
}
[email protected] www.yiiframework.com
Form Validation InputCactiveRecord, Cmodel e CModelForm
- ActiveRecord::rules(), ActiveRecord::save() e Model::validate()- Cenários (scenario)- rules e validators
class Usuário extends CactiveRecord {…public function rules() {
return array(array('nome,email','required'),array('senha, login', 'required', 'on'=>'login'),array('nome','length', 'min'=>2, 'max'=>50),array('email','email'),
);}...
}
[email protected] www.yiiframework.com
Form Validation InputCactiveRecord, Cmodel e CModelForm
Validators do Yii: bollean, captcha, e-mail, compare, default, exist, file, filter, in, length,match, numerical, required, type, unique, url, safe e unsafe;
Podemos estender Cvalidator;
Podemos escrever métodos na nossa classe e referencia-los como validators:
class Usuário extends CactiveRecord {…public function rules() {
return array(array('nome','meuvalidator'),
);}
public function getMeuValidator($valor){return true;
}...
}
[email protected] www.yiiframework.com
AJAX WidgetJquery e outros
A base para trabalhar com javascript adotada pelo Yii é o Jquery, os Widgets do Yii usam Jquery, e a biblioteca Jquery pode ser lida diretamente do core.Para gerenciar os scripts e os estilos o Yii conta com o componente da aplicação clientScript, as extensões geralmente fazem uso desse componente para publicar seus scripts e estilos.Todos os components do JqueryUI tem wrappers no Yii.
Yii::app()->getClientScript()->registerScriptFile();Yii::app()->getClientScript()->registerCssFile();Yii::app()->getClientScript()->registerScript();Yii::app()->getClientScript()->registerCss();Yii::app()->getClientScript()->registerCoreScripts();
Os scripts são gerados no local correto do código HTML;Alterações para renderizar views especializadas para mobile por exemplo pode ser feitas estendendo CclientScript assim como CHTML;Reaproveitamento de código;Escreve pouco ou nenhum javascript.Além de várias extensions contamos com CgridView, Cmenu, CJUIWidgets, etc...
[email protected] www.yiiframework.com
AJAX WidgetJquery e outros
<div id="forAjaxRefresh"></div> <?php echo CHtml::ajaxLink('clickMe', array('ajax'), array('update'=>'#forAjaxRefresh'));?>
public function actionAjax(){ $this->renderPartial('ajaxView', array(), false, true);}
<?php $this->beginWidget('zii.widgets.jui.CJuiDialog',array( 'id'=>'jobDialog', 'options'=>array( 'title'=>Yii::t('job','Create Job'), 'autoOpen'=>true, 'modal'=>'true', 'width'=>'auto', 'height'=>'auto', ), ));echo $this->renderPartial('_formDialog', array('model'=>$model)); ?><?php $this->endWidget('zii.widgets.jui.CJuiDialog');?>
[email protected] www.yiiframework.com
AJAX WidgetJquery e outros
public function actionDynamiccities(){ $data=Location::model()->findAll('parent_id=:parent_id', array(':parent_id'=>(int) $_POST['country_id'])); $data=CHtml::listData($data,'id','name'); foreach($data as $value=>$name) { echo CHtml::tag('option', array('value'=>$value),CHtml::encode($name),true); }}
echo Chtml::dropDownList('country_id','', array(1=>'USA',2=>'France',3=>'Japan'),array('ajax' => array('type'=>'POST','url'=>CController::createUrl('currentController/dynamiccities'),'update'=>'#city_id',))); echo CHtml::dropDownList('city_id','', array());
[email protected] www.yiiframework.com
RBACAcesso baseado em perfil, autenticação e autorização
O Yii possui o componente de aplicação authManager para gerenciar o RBAC.A base do RBAC pode estar em um banco de dados, arquivo php e existem opções fora do core do Yii.
Em 99% dos casos o foco da autorização é a credencial do usuário, para realizar o processo de autenticação do usuário no sistema utilizamos CUserIdenty, responsável por validar as credenciais de acesso, após autenticado as informações são persistidas e acessadas atraves de Yii::app()->user que retorna CwebUser.
A autorização é feita pelos controllers e estem devem utilizar o filtro accessControl e sobrescrever o método accessRules passando um array com as regras de acesso as actions do controller atual.
Uma regra pode ser de allow ou deny baseada nos seguintes parametros:Actions, controllers, users, roles, ips, verbs, expressions
[email protected] www.yiiframework.com
RBACAcesso baseado em perfil, autenticação e autorização
class PostController extends CController{ ...... public function accessRules() { return array( array('deny', 'actions'=>array('create', 'edit'), 'users'=>array('?'), ), array('allow', 'actions'=>array('delete'), 'roles'=>array('admin'), ), array('deny', 'actions'=>array('delete'), 'users'=>array('*'), ), ); }}
[email protected] www.yiiframework.com
Camada de ApresentaçãoLayout, Themes e Skins
Atualmente o Yii vem preparado pra criar um layout com o framework css blueprint, o que facilita muito a criação e a manutenção do layout. Mas qual quer outra ferramenta ou seus layouts podem ser aplicados ao Yii sem complicações.
1) Layout – basicamente é a estrutura da aplicação dividida em main (parte fixa que envolve o conteúdo) e views (conteúdo), podemos ter vários layouts ao mesmo tempo: 1 coluna, 2 colunas, com menu, sem menu, etc... usados simultaneamente pela aplicação.
2) Themes – um tema para ser aplicado no layout, modifica cores, imagens e estilos do layout. Pode modificar parte da estrutura do layout ou até todo o layout.
3) Skins – Os widgets podem estar presente em qualquer parte do layout, no main, na view, em temas ou aninhados em outros widgets. Widgets na maioria dos casos precisam receber parâmetros e alguns deles recebem muitos parâmetros pincipalmente algumas extensões javascript. Como esses parâmetros quase sempre são repetitivos, eles foram separados do widget sendo postos em um arquivo de skin que é referenciado ao criar o widget. Podemos criar vários widgets usando a mesma skin para configura-los, e para reconfigura-los basta alterar a skin.
[email protected] www.yiiframework.com
Layoutheader
footer
view Widget
Camada de ApresentaçãoLayout, Themes e Skins
Layoutheader
footer
view
Como o framework controla o fluxo de execução o código não fica quebrado em partealguma.
[email protected] www.yiiframework.com
Layoutheader
footer
Layoutheader
footer
view Widget
Camada de ApresentaçãoLayout, Themes e Skins
view
O tema é um conjunto de estilos, imagens, que pode ou não ter novas estruturas parao layout.
[email protected] www.yiiframework.com
Layoutheader
footer
Layoutheader
footer
view
Widget
Camada de ApresentaçãoLayout, Themes e Skins
view
Widget
Widget
Widget Widget
Widget
Widget
O conteúdo da view ou widget pode ser atualizado com AJAX através de parâmetros.
[email protected] www.yiiframework.com
WebServiceSOAP e REST(1.1.6)
class StockController extends CController{ public function actions() { return array( 'quote'=>array( 'class'=>'CWebServiceAction', ), ); } public function getPrice($symbol) { $prices=array('IBM'=>100, 'GOOGLE'=>350); return isset($prices[$symbol])?$prices[$symbol]:0; }}
$client=new SoapClient('http://webapp/index.php?r=stock/quote');echo $client->getPrice('GOOGLE');
[email protected] www.yiiframework.com
InternacionalizaçãoI18N, L10N
array(…'sourceLanguage'='en','langague'=>'pt-br',...
);
1) Definimos a linguagem em que a aplicação foi escrita e a linguagem em que a aplicação é usada.* ChttpRequest::preferredLanguage;
Yii::t('app', 'Path alias "{alias}" is redefined.', array('{alias}'=>$alias))
2) Yii::t(contexto, mensagem origem original, parâmetros);
3) MessageSource – DB, GNUGettext e PHP
4) Opções e PluraisYii::t('app', 'n==1#one book|n>1#many books', 1));Yii::t('test', 'cucumber|cucumbers', 1);Yii::t('test', '{n} cucumber|{n} cucumbers', 1);
5) Formatos$numberFormatter->format('#,##0.00',$number))$dateFormatter->format('yyyy-MM-dd',$timestamp);
* Constants for ISO 8601 Date Output
[email protected] www.yiiframework.com
Cache em camadas
1) A cache também é configurada como componente da aplicação e pode utilizar recursosComo MemCache, APCCache, Xcache, Eaccelerator, ZendDataCache, DBCache,FileCache e DummyCache. A cache pode ser associada a dependências comoFileDependency, DirectoryDependency, DB, GlobalState, Chained e Expression.Suporte para variações por Route, Session, Params e Expression. Suporte a Cacheaninhada.
Yii::app()->cache->set($id, $value, 30);$value=Yii::app()->cache->get($id);Yii::app()->cache->set($id, $value, 30,
new CfileCacheDependency('FileName'));
2) Data Caching
3) Fragment Caching ...other HTML content...<?php if($this->beginCache($id, array('duration'=>3600))) { ?>...content to be cached...<?php $this->endCache(); } ?>...other HTML content...
[email protected] www.yiiframework.com
Cache em camadas
4) Page Caching - Filter OutputCache public function filters(){ return array( array( 'COutputCache', 'duration'=>100, 'varyByParam'=>array('id'), ), );}
5) Dynamic Content - usado junto comPage Caching ou Fragment Caching ...other HTML content...
<?php if($this->beginCache($id)) { ?>...fragment content to be cached... <?php $this->renderDynamic($callback); ?>...fragment content to be cached...<?php $this->endCache(); } ?>...other HTML content...
[email protected] www.yiiframework.com
Error handling and log
return array( ...... 'components'=>array( 'errorHandler'=>array( 'errorAction'=>'site/error', ), ),);
2) Exceptions
throw new ChttpException(404,'The specified post cannot be found.');
1) Error handling com uma action
3) Podemos usar os eventos da aplicaçãoonError e onException.
4) Log de mensagens
Yii::log($message, $level, $category);Yii::trace($message, $category); //debug mode true
[email protected] www.yiiframework.com
array( ...... 'preload'=>array('log'), 'components'=>array( ...... 'log'=>array( 'class'=>'CLogRouter', 'routes'=>array( array( 'class'=>'CFileLogRoute', 'levels'=>'trace, info', 'categories'=>'system.*', ), array( 'class'=>'CEmailLogRoute', 'levels'=>'error, warning', 'emails'=>'[email protected]', ), ), ), ),)
Error handling and log5) Log Router
Yii::beginProfile('blockID');...code block being profiled...Yii::endProfile('blockID');
6) Profile log
[email protected] www.yiiframework.com
<?php $this->beginWidget('CHtmlPurifier'); ?>...display user-entered content here...<?php $this->endWidget(); ?>
SecurityCSRF, XSS, SQL Injection, HTML Purify and Cookie(HMAC)
return array( 'components'=>array( 'request'=>array( 'enableCsrfValidation'=>true,
'enableCookieValidation'=>true, ), ),);
$cookie=Yii::app()->request->cookies[$name];$value=$cookie->value;
$cookie=new CHttpCookie($name,$value);Yii::app()->request->cookies[$name]=$cookie;
ExtensãoPHP IDS
[email protected] www.yiiframework.com
Code Generation
% cd WebRoot/testdrive% protected/yiic shellYii Interactive Tool v1.1Please type 'help' for help. Type 'exit' to quit.>> model User tbl_user generate models/User.php generate fixtures/tbl_user.php generate unit/UserTest.php
The following model classes are successfully generated: User
If you have a 'db' database connection, you can test these models now with: $model=User::model()->find(); print_r($model);
>> crud User generate UserController.php generate UserTest.php mkdir D:/testdrive/protected/views/user generate create.php generate update.php generate index.php generate view.php generate admin.php generate _form.php generate _view.php
Crud 'user' has been successfully created. You may access it via:http://hostname/path/to/index.php?r=user
% php YiiRoot/framework/yiic.php webapp testdrive
[email protected] www.yiiframework.com
Code Generation - Gii
return array( ...... 'modules'=>array( 'gii'=>array( 'class'=>'system.gii.GiiModule', 'password'=>'pick up a password here', // 'ipFilters'=>array(...a list of IPs...), // 'newFileMode'=>0666, // 'newDirMode'=>0777, ), ),);
http://hostname/testdrive/index.php?r=gii
[email protected] www.yiiframework.com
Outras características
● Teste funcional, Teste unitário, TDD● Event Driven● XHTML padronizado● Extensões● Módulos● Console Application● URL Manager
[email protected] www.yiiframework.com
Mão na massa!Criando sua primeira aplicação com Yii framwork
[email protected] www.yiiframework.com
Mão na massa!Workflow de desenvolvimento
1. Criar o esqueleto da aplicação com Yii Console Tool;2. Configurar a aplicação, adicionar seus componentes;3. Criar seus Models, o Gii pode ajduar a criar as classes ActiveRecord;4. Criar os Controllers (Gii);5. Implementar as actions e views;6. Configurar os filters dos controllers quando necessário;7. Se for necessário configurar um ou mais temas (themes);8. Traduções e Internacionalização (I18N);9. Implementar as técnicas de caching apropiadas;10. Tune up da aplicação.
* Executar testes em cada item.
Antes de iniciar o ambiente deve estar preparado, e o banco de dados criado.
[email protected] www.yiiframework.com
Mão na massa!Ambiente
O ambiente é o básico para qualquer aplicação web em PHP.
LAMP, WAMP ou outros com PHP 5.1
[email protected] www.yiiframework.com
Mão na massa!Requisitos
O Yii vem com uma ferramentapara ajudar a detectar os requisitos necessários para oframework e para a aplicação.
Http://localhost/yii/requirements/
Após essa etapa o frameworkPode passar para um diretório Acima do diretório web
[email protected] www.yiiframework.com
Mão na massa!Yii Console Tool - WebApp
Após o download do Yii o primeiro passo é criar o esqueleto da aplicação.
[email protected] www.yiiframework.com
Mão na massa!Yii Console Tool - WebApp
[email protected] www.yiiframework.com
Mão na massa!Aplicação
Nossa aplicação será um site simples para divulgação de serviços médicos e agendamento de consultas através de formulário, sem gestão de conteúdo. Para facilitar a tarefa acrescentaremos o campo data ao formulário e forneceremos o link para visualização da agenda com os horários marcados.
O backend da nossa aplicação será protegido por senha e contará com 3 níveis de acesso: secretaria (confirma as consultas), médico (visualiza suas consultas) e administrador (acesso total).
O site deve ter recursos da web 2.0.
[email protected] www.yiiframework.com
Mão na massa!Configurar a aplicação
Todas as configurações da aplicação concentram-se no arquivo …/webapp/protected/config/main.php, arquivos de configuração com outras finaldiades como test.php, console.php, …/protected/backend/config/main.php utilizam main.php como base.
return array( 'name'=>'Sistema de Agendamento',
... 'modules'=>array( 'gii'=>array( 'class'=>'system.gii.GiiModule', 'password'=>'teste123', 'ipFilters'=>array('127.0.0.1',
'::1'), ), ), …);
return array( … 'components'=>array(
… 'db'=>array( 'connectionString' => 'mysql:host=localhost;dbname=webagenda', 'username' => 'root',
'password' => 'teste123','charset' => 'utf8',
),…
),);
[email protected] www.yiiframework.com
Mão na massa!Gii - Criado seus Models
[email protected] www.yiiframework.com
Mão na massa!Gii - Criado seus Controllers
[email protected] www.yiiframework.com
Mão na massa!Implementar actions e views
Usuário
SolicitaConsulta
VêCalendário
Administrador Usuário
AdministraConsultas e Contas,
Gera relatórios
Médico
Vê SuasConsultas
AgendaCompromissos
Secretária
ConfirmaConsulta
Todos
Login, Logout, Atualiza sua Conta
[email protected] www.yiiframework.com
1. Criar o esqueleto da aplicação com Yii Console Tool;2. Configurar a aplicação, adicionar seus componentes;3. Criar seus Models, o Gii pode ajduar a criar as classes ActiveRecord;4. Criar os Controllers (Gii);5. Implementar as actions e views;6. Configurar os filters dos controllers quando necessário;7. Se for necessário configurar um ou mais temas (themes);8. Traduções e Internacionalização (I18N);9. Implementar as técnicas de caching apropiadas;10. Tune up da aplicação.
* Executar testes em cada item.
Mão na massa!Implementar actions e views
[email protected] www.yiiframework.com
Dados legais!Pra vender o peixe do Yii
[email protected] www.yiiframework.com
Dados legais!Pra vender o peixe do Yii