O documento apresenta Rafael Alves Nogueira Garcia, desenvolvedor PHP há 9 anos que desenvolve com o framework Yii há 2 anos. Ele já desenvolveu algumas extensões para o Yii, como wrappers para extensões Jquery e integração com PHP IDS.
2. Rafael Alves Nogueira Garcia
rafa.informatica@gmail.com
Desenvolvedor PHP há 9 anos
Desenvolvo com Yii Framework há 2 anos
Já desenvolvi algumas extensões para o Yii:
* Wrappers para extensões Jquery;
* Integração com PHP IDS;
rafa.informatica@gmail.com www.yiiframework.com
3. 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.
rafa.informatica@gmail.com www.yiiframework.com
7. DAO/QueryBuilder/AR
Características muito uteis do AR
1) Instruções em massa: 2) Behaviors:
ActiveRecord::deleteAll(condition); Modificam ou adicionam
ActiveRecord::updateAll(params, condition); comportamentos.
3) campos calculados 4) Eventos:
ActiveRecord::beforeValidate();
class Usuário extends CactiveRecord { ActiveRecord::afterFind();
…
public function getNomeCompleto() {
return “$this->nome $this->sobrenome”;
}
...
}
rafa.informatica@gmail.com www.yiiframework.com
8. Form Validation Input
CactiveRecord, 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'),
);
}
...
}
rafa.informatica@gmail.com www.yiiframework.com
9. Form Validation Input
CactiveRecord, 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;
}
...
}
rafa.informatica@gmail.com www.yiiframework.com
10. AJAX Widget
Jquery 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...
rafa.informatica@gmail.com www.yiiframework.com
12. AJAX Widget
Jquery e outros
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());
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);
}
}
rafa.informatica@gmail.com www.yiiframework.com
13. RBAC
Acesso 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
rafa.informatica@gmail.com www.yiiframework.com
14. RBAC
Acesso 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('*'),
),
);
}
}
rafa.informatica@gmail.com www.yiiframework.com
15. Camada de Apresentação
Layout, 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.
rafa.informatica@gmail.com www.yiiframework.com
16. Camada de Apresentação
Layout, Themes e Skins
Como o framework controla o fluxo de execução o código não fica quebrado em parte
alguma.
Layout Layout
header header
view view Widget
footer footer
rafa.informatica@gmail.com www.yiiframework.com
17. Camada de Apresentação
Layout, Themes e Skins
O tema é um conjunto de estilos, imagens, que pode ou não ter novas estruturas para
o layout.
Layout Layout
header header
view view Widget
footer footer
rafa.informatica@gmail.com www.yiiframework.com
18. Camada de Apresentação
Layout, Themes e Skins
O conteúdo da view ou widget pode ser atualizado com AJAX através de parâmetros.
Layout Layout
header header
Widget
Widget Widget
view Widget
view Widget Widget
Widget
footer footer
rafa.informatica@gmail.com www.yiiframework.com
19. WebService
SOAP 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');
rafa.informatica@gmail.com www.yiiframework.com
20. Internacionalização
I18N, L10N
1) Definimos a linguagem em que a aplicação foi escrita array(
e a linguagem em que a aplicação é usada. …
* ChttpRequest::preferredLanguage; 'sourceLanguage'='en',
'langague'=>'pt-br',
...
);
2) Yii::t(contexto, mensagem origem original, Yii::t('app', 'Path alias "{alias}" is redefined.',
parâmetros); array('{alias}'=>$alias))
3) MessageSource – DB, GNUGettext e PHP
Yii::t('app', 'n==1#one book|n>1#many books', 1));
4) Opções e Plurais Yii::t('test', 'cucumber|cucumbers', 1);
Yii::t('test', '{n} cucumber|{n} cucumbers', 1);
$numberFormatter->format('#,##0.00',$number))
5) Formatos $dateFormatter->format('yyyy-MM-dd',$timestamp);
* Constants for ISO 8601 Date Output
rafa.informatica@gmail.com www.yiiframework.com
21. Cache em camadas
1) A cache também é configurada como componente da aplicação e pode utilizar recursos
Como MemCache, APCCache, Xcache, Eaccelerator, ZendDataCache, DBCache,
FileCache e DummyCache. A cache pode ser associada a dependências como
FileDependency, DirectoryDependency, DB, GlobalState, Chained e Expression.
Suporte para variações por Route, Session, Params e Expression. Suporte a Cache
aninhada.
Yii::app()->cache->set($id, $value, 30);
2) Data Caching
$value=Yii::app()->cache->get($id);
Yii::app()->cache->set($id, $value, 30,
new CfileCacheDependency('FileName'));
3) Fragment Caching ...other HTML content...
<?php if($this->beginCache($id, array('duration'=>3600))) { ?>
...content to be cached...
<?php $this->endCache(); } ?>
...other HTML content...
rafa.informatica@gmail.com www.yiiframework.com
22. 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 com
Page 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...
rafa.informatica@gmail.com www.yiiframework.com
23. Error handling and log
1) Error handling com uma action 2) Exceptions
return array( throw new ChttpException(404,
...... 'The specified post cannot be found.');
'components'=>array(
'errorHandler'=>array(
'errorAction'=>'site/error',
), 3) Podemos usar os eventos da aplicação
), onError e onException.
);
4) Log de mensagens
Yii::log($message, $level, $category);
Yii::trace($message, $category); //debug mode true
rafa.informatica@gmail.com www.yiiframework.com
26. Code Generation
% php YiiRoot/framework/yiic.php webapp testdrive
% cd WebRoot/testdrive >> crud User
% protected/yiic shell generate UserController.php
Yii Interactive Tool v1.1 generate UserTest.php
Please type 'help' for help. Type 'exit' to quit. mkdir D:/testdrive/protected/views/user
>> model User tbl_user generate create.php
generate models/User.php generate update.php
generate fixtures/tbl_user.php generate index.php
generate unit/UserTest.php generate view.php
generate admin.php
The following model classes generate _form.php
are successfully generated: generate _view.php
User
Crud 'user' has been successfully
If you have a 'db' database connection, created. You may access it via:
you can test these models now with: http://hostname/path/to/index.php?r=user
$model=User::model()->find();
print_r($model);
rafa.informatica@gmail.com www.yiiframework.com
27. 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
rafa.informatica@gmail.com www.yiiframework.com
31. Outras características
● Teste funcional, Teste unitário, TDD
● Event Driven
● XHTML padronizado
● Extensões
● Módulos
● Console Application
● URL Manager
rafa.informatica@gmail.com www.yiiframework.com
32. Mão na massa!
Criando sua primeira aplicação com Yii framwork
rafa.informatica@gmail.com www.yiiframework.com
33. Mão na massa!
Workflow de desenvolvimento
Antes de iniciar o ambiente deve estar preparado, e o banco de dados criado.
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.
rafa.informatica@gmail.com www.yiiframework.com
34. 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
rafa.informatica@gmail.com www.yiiframework.com
35. Mão na massa!
Requisitos
O Yii vem com uma ferramenta
para ajudar a detectar os
requisitos necessários para o
framework e para a aplicação.
Http://localhost/yii/requirements/
Após essa etapa o framework
Pode passar para um diretório
Acima do diretório web
rafa.informatica@gmail.com www.yiiframework.com
36. Mão na massa!
Yii Console Tool - WebApp
Após o download do Yii o primeiro passo é criar o esqueleto da aplicação.
rafa.informatica@gmail.com www.yiiframework.com
38. 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.
rafa.informatica@gmail.com www.yiiframework.com
39. 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(
return array( …
'name'=>'Sistema de Agendamento', 'components'=>array(
... …
'modules'=>array( 'db'=>array(
'gii'=>array( 'connectionString' =>
'class'=>'system.gii.GiiModule', 'mysql:host=localhost;dbname=webagenda',
'password'=>'teste123', 'username' => 'root',
'ipFilters'=>array('127.0.0.1', 'password' => 'teste123',
'::1'), 'charset' => 'utf8',
), ),
), …
… ),
); );
rafa.informatica@gmail.com www.yiiframework.com
40. Mão na massa!
Banco de dados
rafa.informatica@gmail.com www.yiiframework.com
41. Mão na massa!
Gii - Criado seus Models
rafa.informatica@gmail.com www.yiiframework.com
42. Mão na massa!
Gii - Criado seus Controllers
rafa.informatica@gmail.com www.yiiframework.com
43. Mão na massa!
Implementar actions e views
Usuário Administrador Médico
Vê Solicita Administra Vê Suas Agenda
Calendário Consulta Consultas e Contas, Consultas Compromissos
Gera relatórios
Secretária Todos
Confirma
Login, Logout, Atualiza sua Conta
Consulta
rafa.informatica@gmail.com www.yiiframework.com
44. Mão na massa!
Implementar actions e views
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.
rafa.informatica@gmail.com www.yiiframework.com
45. Dados legais!
Pra vender o peixe do Yii
rafa.informatica@gmail.com www.yiiframework.com
46. Dados legais!
Pra vender o peixe do Yii
rafa.informatica@gmail.com www.yiiframework.com