rafa.informatica@gmail.com   www.yiiframework.com
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
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
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();




      rafa.informatica@gmail.com              www.yiiframework.com
OOP, MVC e DRY

                Componentes       Extensões




Model              Behaviors

                                                         Modules   Vendors

                    Controller,
Controller          Actions e
                      Filter



  View                             Widgets


  rafa.informatica@gmail.com      www.yiiframework.com
DAO/QueryBuilder/AR
     Yii::app()->db->createCommand($sql)->execute();
                                                              CActiveRecord

      Yii::app()->db->createCommand()
      ->select('nome')                                            Evento
      ->from(Usuario::model()->tableName)
      ->where(’id=:id’, array(’:id’=>$id))
      ->queryRow();
                                                    Compromisso            Reunião
    $Usuario = Usuario::model()->findByPk($id);
    $Transaction = Yii::app()->db->beginTransaction();
    $Usuario->nome = 'Teste...';
    try{
         $Usuario->save();
         $transaction->commit();
    } catch (Exception $e) {
         $transaction->rollBack();
    }


rafa.informatica@gmail.com       www.yiiframework.com
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
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
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
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
AJAX Widget
                                          Jquery e outros

<div id="forAjaxRefresh"></div>           public function actionAjax()
                                          {
<?php echo CHtml::ajaxLink('clickMe',       $this->renderPartial('ajaxView', array(), false, true);
array('ajax'),                            }
 array('update'=>'#forAjaxRefresh'));?>

 <?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');?>


    rafa.informatica@gmail.com        www.yiiframework.com
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
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
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
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
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
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
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
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
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
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
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
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
Error handling and log
  5) Log Router                              array(
                                                ......
                                                'preload'=>array('log'),
                                                'components'=>array(
                                                    ......
                                                    'log'=>array(
                                                        'class'=>'CLogRouter',
                                                        'routes'=>array(
                                                           array(
                                                              'class'=>'CFileLogRoute',
  6) Profile log                                              'levels'=>'trace, info',
                                                              'categories'=>'system.*',
    Yii::beginProfile('blockID');                          ),
    ...code block being profiled...                        array(
    Yii::endProfile('blockID');                               'class'=>'CEmailLogRoute',
                                                              'levels'=>'error, warning',
                                                              'emails'=>'admin@example.com',
                                                           ),
                                                        ),
                                                    ),
                                                ),
                                             )

rafa.informatica@gmail.com            www.yiiframework.com
Security
             CSRF, XSS, SQL Injection, HTML Purify and Cookie(HMAC)


 <?php $this->beginWidget('CHtmlPurifier'); ?>
 ...display user-entered content here...
 <?php $this->endWidget(); ?>

 return array(
    'components'=>array(
       'request'=>array(
           'enableCsrfValidation'=>true,                 Extensão
           'enableCookieValidation'=>true,               PHP IDS
       ),
    ),
 );

$cookie=Yii::app()->request->cookies[$name];
$value=$cookie->value;

$cookie=new CHttpCookie($name,$value);
Yii::app()->request->cookies[$name]=$cookie;

rafa.informatica@gmail.com        www.yiiframework.com
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
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
Code Generation - Gii




rafa.informatica@gmail.com    www.yiiframework.com
Code Generation - Gii




rafa.informatica@gmail.com    www.yiiframework.com
Code Generation - Gii




rafa.informatica@gmail.com    www.yiiframework.com
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
Mão na massa!
                      Criando sua primeira aplicação com Yii framwork




rafa.informatica@gmail.com           www.yiiframework.com
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
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
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
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
Mão na massa!
                             Yii Console Tool - WebApp




rafa.informatica@gmail.com     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.




rafa.informatica@gmail.com       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(
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
Mão na massa!
                                 Banco de dados




rafa.informatica@gmail.com     www.yiiframework.com
Mão na massa!
                              Gii - Criado seus Models




rafa.informatica@gmail.com      www.yiiframework.com
Mão na massa!
                             Gii - Criado seus Controllers




rafa.informatica@gmail.com       www.yiiframework.com
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
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
Dados legais!
                             Pra vender o peixe do Yii




rafa.informatica@gmail.com       www.yiiframework.com
Dados legais!
                             Pra vender o peixe do Yii




rafa.informatica@gmail.com       www.yiiframework.com
Obrigado!!


                             rafa.informatica@gmail.com



rafa.informatica@gmail.com        www.yiiframework.com

Rafael Garcia - Yii Framework, principais características e em ação

  • 1.
    rafa.informatica@gmail.com www.yiiframework.com
  • 2.
    Rafael Alves NogueiraGarcia 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: Isit 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
  • 4.
    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(); rafa.informatica@gmail.com www.yiiframework.com
  • 5.
    OOP, MVC eDRY Componentes Extensões Model Behaviors Modules Vendors Controller, Controller Actions e Filter View Widgets rafa.informatica@gmail.com www.yiiframework.com
  • 6.
    DAO/QueryBuilder/AR Yii::app()->db->createCommand($sql)->execute(); CActiveRecord Yii::app()->db->createCommand() ->select('nome') Evento ->from(Usuario::model()->tableName) ->where(’id=:id’, array(’:id’=>$id)) ->queryRow(); Compromisso Reunião $Usuario = Usuario::model()->findByPk($id); $Transaction = Yii::app()->db->beginTransaction(); $Usuario->nome = 'Teste...'; try{ $Usuario->save(); $transaction->commit(); } catch (Exception $e) { $transaction->rollBack(); } 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
  • 11.
    AJAX Widget Jquery e outros <div id="forAjaxRefresh"></div> public function actionAjax() { <?php echo CHtml::ajaxLink('clickMe', $this->renderPartial('ajaxView', array(), false, true); array('ajax'), } array('update'=>'#forAjaxRefresh'));?> <?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');?> 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 andlog 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
  • 24.
    Error handling andlog 5) Log Router array( ...... 'preload'=>array('log'), 'components'=>array( ...... 'log'=>array( 'class'=>'CLogRouter', 'routes'=>array( array( 'class'=>'CFileLogRoute', 6) Profile log 'levels'=>'trace, info', 'categories'=>'system.*', Yii::beginProfile('blockID'); ), ...code block being profiled... array( Yii::endProfile('blockID'); 'class'=>'CEmailLogRoute', 'levels'=>'error, warning', 'emails'=>'admin@example.com', ), ), ), ), ) rafa.informatica@gmail.com www.yiiframework.com
  • 25.
    Security CSRF, XSS, SQL Injection, HTML Purify and Cookie(HMAC) <?php $this->beginWidget('CHtmlPurifier'); ?> ...display user-entered content here... <?php $this->endWidget(); ?> return array( 'components'=>array( 'request'=>array( 'enableCsrfValidation'=>true, Extensão 'enableCookieValidation'=>true, PHP IDS ), ), ); $cookie=Yii::app()->request->cookies[$name]; $value=$cookie->value; $cookie=new CHttpCookie($name,$value); Yii::app()->request->cookies[$name]=$cookie; 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
  • 28.
    Code Generation -Gii rafa.informatica@gmail.com www.yiiframework.com
  • 29.
    Code Generation -Gii rafa.informatica@gmail.com www.yiiframework.com
  • 30.
    Code Generation -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
  • 37.
    Mão na massa! Yii Console Tool - WebApp 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
  • 47.
    Obrigado!! rafa.informatica@gmail.com rafa.informatica@gmail.com www.yiiframework.com