PHP Conference Brasil 2013 - Aplicações PHP 5.4 com componentes Aura

Preview:

DESCRIPTION

Nesta palestra aprenderemos a criar uma aplicação utilizando os recursos do PHP 5.4 e os componentes do projeto Aura. A demonstração será feita ao vivo com a criação de snippets de código.

Citation preview

Aplicações PHP 5.4 com componentes Aura

Flávio Gomes da Silva Lisboa@fgsl

Quem sou eu?

Quem sou eu?

Quem sou eu?

Quem sou eu?

Quem sou eu?

Zend Framework 1 Zend Framework 2

2008

Quem sou eu?

http://romocavaleirodoespaco.blogspot.com.br

VAMOS COMEÇAR?

O projeto Aura

●Código limpo;●Bibliotecas fracamente acopladas;●Pacotes independentes;●Em conformidade com os padrões PHP-FIG.

Código limpo

“Eu gosto que meu código seja elegante e eficiente. A lógica deve ser simples para que fique mais difícil para os bugs se esconder, as dependências devem ser mínimas para que haja facilidade de manutenção, o tratamento de erros deve estar completamente de acordo com uma estratégia articulada, e o desempenho deve estar próximo ao ideal de modo a não tentar as pessoas a tornar o código confuso com otimizações sem fundamento. Código limpo faz algo bem feito.”

Quem disse isso?

Código limpo

Bjarne Stroustrup, criador do C++

Fraco acoplamento

Padrões

“Eu penso em padrões como algo que pode ajudar pessoas a pensarem de modo orientado a objetos”

Erich Gamma

O caso de uso

● Um cadastro de alunos.

● Matrícula e nome.

● Inclusão, alteração, exclusão e recuperação.

● Apache + PHP + MySQL

Sugestão: XAMPP

http://www.apachefriends.org/pt_br/xampp.html

Ambiente de desenvolvimento

http://www.zend.com/en/company/community/pdt/downloads

Ambiente de desenvolvimento

Ambiente de desenvolvimento

Instalando o Composer

php -r

"eval('?>'.file_get_contents('https://getcomposer.org/installer'));"

No webroot...

Criando um projeto Aura com Composer

Criando um projeto Aura com Composer

Criando um projeto Aura com Composer

Abrindo o projeto

Abrindo o projeto

Estrutura do projeto

Estrutura do projeto

Estrutura do projeto

Estrutura do projeto

Redirecionando

escola-aura\.htaccess

RewriteEngine onRewriteRule .* web/index.php

Criando o controlador

Criando o controlador

Criando o controlador

<?php

namespace Escola\Package\Web\Home;

use Aura\Framework\Web\Controller\AbstractPage;

class HomePage extends AbstractPage { public function actionIndex() { $this->view = 'index'; }}

Criando a visão

Criando a visão

<h1>Cadastro de Alunos</h1>

Configurando a rota

<?php/** * * Overrides for 'default' config mode. * * @var Aura\Framework\System $system Aura system directories; when cast to * a string, the Aura system root directory. * * @var Aura\Autoload\Loader $loader The autoloader for the system. * * @var Aura\Di\Container $di The DI container for the system. * */// attach the path for a route named 'home' to the controller and action$di->params ['Aura\Router\Map'] ['attach'] [''] = [ // all routes with the '' path prefix (i.e., no prefix) 'routes' => [ // a route named 'home' 'home' => [ 'path' => '/escola-aura/', 'values' => [ 'controller' => 'home', 'action' => 'index' ] ]

] ];

// map the 'home' controller value to the controller class$di->params ['Aura\Framework\Web\Controller\Factory'] ['map'] ['home'] = 'Escola\Package\Web\Home\HomePage';?>

Nosso alô mundo

Cadastro de Alunos

http://localhost/escola-aura/

Criando um layout único

/escola-aura/include/Escola/Package/Web/Home/views/layout.php

<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Escola Aura</title></head><body><h1>Cadastro de Alunos</h1><?php include $this->find($this->content)?></body></html>

Criando um layout único

/escola-aura/include/Escola/Package/Web/Home/views/index.php

<a href="<?php echo $this->url?>">Incluir aluno</a>

Gerando rotas

public function actionIndex(){

$this->view = 'layout';$this->data = [

'content' => 'index','url' => $this->router->generate('edit')

];}

Definindo rotas

// a route named 'edit''edit' => [

'path' => '/escola-aura/edit/{:matricula}','values' => [

'controller' => 'home','action' => 'edit', 'matricula' => 0

],'params' => [

'matricula' => '(\d+)']

],

/escola-aura/config/default.php

Controle de edição

public function actionEdit(){

$this->view = 'layout';$this->data = [

'content' => 'edit','action' => $this->router->generate('save')

];}

Visão de edição

<form action="<?php echo $this->action?>" method="post">Nome: <input type="text" name="nome" autofocus="autofocus"><input type="hidden" name="matricula"><input type="submit" value="gravar"> </form>

/escola-aura/include/Escola/Package/Web/Home/views/edit.php

Nossa tabela

CREATE TABLE IF NOT EXISTS `alunos` ( `matricula` int(11) NOT NULL AUTO_INCREMENT, `nome` varchar(30) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`matricula`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;

Banco de dados "escola-aura"

Definição de rota de inclusão

// a route named 'save''save' => [

'path' => '/escola-aura/save','values' => [

'controller' => 'home','action' => 'save'

] ],

/escola-aura/config/default.php

Ação de inclusão

public function actionSave(){

$connection = $GLOBALS['di']->get('database');$connection->connect();

$insert = $connection->newInsert();

$insert->into('alunos')->cols(['nome']);

$bind = ['nome'=> $this->getContext()->getPost('nome')];

$stmt = $connection->query($insert, $bind);

$this->response->setRedirect($this->router->generate('home'));}

Conexão com banco de dados

$di->set('database',function(){$connection_factory = include realpath(__DIR__ . '/../package/Aura.Sql/scripts') . DIRECTORY_SEPARATOR . 'instance.php';;$connection = $connection_factory->newInstance(

// adapter name'mysql',

// DSN elements for PDO; this can also be// an array of key-value pairs'host=localhost;dbname=escola-aura',

// username for the connection'root',

// password for the connection'xampp');return $connection;});

$GLOBALS['di'] = $di;

/escola-aura/config/default.php

Listagem de registros

public function actionIndex(){

$connection = $GLOBALS['di']->get('database');$connection->connect();

$select = $connection->newSelect();

$select->cols(['*'])->from('alunos');

$this->view = 'layout';$this->data = [

'content' => 'index','url' => $this->router->generate('edit'),

'list' => $connection->fetchAll($select)];

}

/escola-aura/include/Escola/Package/Web/Home/HomePage.php

Listagem de registros

<a href="<?php echo $this->url?>">Incluir aluno</a><table><thead><tr><th>Matrícula</th><th>Nome</th></tr></thead><?phpforeach ($this->list as $item):?><tr><td><?=$item['matricula']?></td><td><?=$item['nome']?></td></tr><?phpendforeach; ?></table>

/escola-aura/include/Escola/Package/Web/Home/views/index.php

Listagem de registros

Geração de rota de alteração

<a href="<?php echo $this->url?>">Incluir aluno</a><table><thead><tr><th>Matrícula</th><th>Nome</th><th colspan="2">&nbsp;</th></tr></thead><?phpforeach ($this->list as $item):?><tr><td><?=$item['matricula']?></td><td><?=$item['nome']?></td><td><a href="<?=$this->route('edit', ['matricula' => $item['matricula']])?>">alterar</a></td></tr><?phpendforeach; ?></table>

/escola-aura/include/Escola/Package/Web/Home/views/index.php

Ação de alteração

public function actionEdit(){

$aluno = ['matricula' => 0,'nome' => ''

];

if ($matricula = $this->getParams()['matricula']){

$connection = $GLOBALS['di']->get('database');$connection->connect();

$select = $connection->newSelect();

$select->cols(['*'])->from('alunos')->where('matricula = :matricula');

$aluno = $connection->fetchOne($select,['matricula' => $matricula]);}

$this->view = 'layout';$this->data = [

'aluno' => $aluno,'content' => 'edit','action' => $this->router->generate('save')

];}

/escola-aura/include/Escola/Package/Web/Home/HomePage.php

Ação de gravação

public function actionSave(){

$connection = $GLOBALS['di']->get('database');$connection->connect();

$matricula = $this->getContext()->getPost('matricula',0);if ($matricula == 0){

$verb = $connection->newInsert();

$verb->into('alunos')->cols(['nome']);

$bind = ['nome'=> $this->getContext()->getPost('nome')];}else{

$verb = $connection->newUpdate();

$verb->table('alunos')->set('nome',':nome')->where('matricula = :matricula');

$nome = $this->getContext()->getPost('nome');

$bind = ['matricula' => $matricula, 'nome' => $nome];}

$stmt = $connection->query($verb, $bind);

$this->response->setRedirect($this->router->generate('home'));}

/escola-aura/include/Escola/Package/Web/Home/HomePage.php

Definição de rota de exclusão

// a route named 'delete''delete' => [

'path' => '/escola-aura/delete/{:matricula}','values' => [

'controller' => 'home','action' => 'delete','matricula' => 0

],'params' => [

'matricula' => '(\d+)' ]

]

/escola-aura/config/default.php

Geração de rota de exclusão

<a href="<?php echo $this->url?>">Incluir aluno</a><table><thead><tr><th>Matrícula</th><th>Nome</th><th colspan="2">&nbsp;</th></tr></thead><?phpforeach ($this->list as $item):?><tr><td><?=$item['matricula']?></td><td><?=$item['nome']?></td><td><a href="<?=$this->route('edit', ['matricula' => $item['matricula']])?>">alterar</a></td><td><a href="<?=$this->route('delete', ['matricula' => $item['matricula']])?>">excluir</a></td></tr><?phpendforeach; ?></table>

/escola-aura/include/Escola/Package/Web/Home/views/index.php

Ação de exclusão

public function actionDelete(){

$matricula = $this->getParams()['matricula'];if ($matricula > 0){

$connection = $GLOBALS['di']->get('database');$connection->connect();

$delete = $connection->newDelete();

$delete->from('alunos')->where('matricula = :matricula');

$bind = ['matricula' => $matricula];

$connection->query($delete,$bind);}

$this->response->setRedirect($this->router->generate('home'));}

/escola-aura/include/Escola/Package/Web/Home/HomePage.php

Você pode ainda...

● Definir regras para entrada de dados

● Criar formulários programaticamente

● Gerenciar a sessão com objetos

Perguntas?

Obrigado!

Aplicações PHP 5.4 com componentes Aura

Flávio Gomes da Silva Lisboa@fgsl

Quem sou eu?

Quem sou eu?

Quem sou eu?

Quem sou eu?

Quem sou eu?

Zend Framework 1 Zend Framework 2

2008

Quem sou eu?

http://romocavaleirodoespaco.blogspot.com.br

VAMOS COMEÇAR?

O projeto Aura

●Código limpo;●Bibliotecas fracamente acopladas;●Pacotes independentes;●Em conformidade com os padrões PHP-FIG.

Código limpo

“Eu gosto que meu código seja elegante e eficiente. A lógica deve ser simples para que fique mais difícil para os bugs se esconder, as dependências devem ser mínimas para que haja facilidade de manutenção, o tratamento de erros deve estar completamente de acordo com uma estratégia articulada, e o desempenho deve estar próximo ao ideal de modo a não tentar as pessoas a tornar o código confuso com otimizações sem fundamento. Código limpo faz algo bem feito.”

Quem disse isso?

Código limpo

Bjarne Stroustrup, criador do C++

Fraco acoplamento

Padrões

“Eu penso em padrões como algo que pode ajudar pessoas a pensarem de modo orientado a objetos”

Erich Gamma

O caso de uso

● Um cadastro de alunos.

● Matrícula e nome.

● Inclusão, alteração, exclusão e recuperação.

● Apache + PHP + MySQL

Sugestão: XAMPP

http://www.apachefriends.org/pt_br/xampp.html

Ambiente de desenvolvimento

http://www.zend.com/en/company/community/pdt/downloads

Ambiente de desenvolvimento

Ambiente de desenvolvimento

Instalando o Composer

php -r

"eval('?>'.file_get_contents('https://getcomposer.org/installer'));"

No webroot...

Criando um projeto Aura com Composer

Criando um projeto Aura com Composer

Criando um projeto Aura com Composer

Abrindo o projeto

Abrindo o projeto

Estrutura do projeto

Estrutura do projeto

Estrutura do projeto

Estrutura do projeto

Redirecionando

escola-aura\.htaccess

RewriteEngine onRewriteRule .* web/index.php

Criando o controlador

Criando o controlador

Criando o controlador

<?php

namespace Escola\Package\Web\Home;

use Aura\Framework\Web\Controller\AbstractPage;

class HomePage extends AbstractPage { public function actionIndex() { $this->view = 'index'; }}

Criando a visão

Criando a visão

<h1>Cadastro de Alunos</h1>

Configurando a rota

<?php/** * * Overrides for 'default' config mode. * * @var Aura\Framework\System $system Aura system directories; when cast to * a string, the Aura system root directory. * * @var Aura\Autoload\Loader $loader The autoloader for the system. * * @var Aura\Di\Container $di The DI container for the system. * */// attach the path for a route named 'home' to the controller and action$di->params ['Aura\Router\Map'] ['attach'] [''] = [ // all routes with the '' path prefix (i.e., no prefix) 'routes' => [ // a route named 'home' 'home' => [ 'path' => '/escola-aura/', 'values' => [ 'controller' => 'home', 'action' => 'index' ] ]

] ];

// map the 'home' controller value to the controller class$di->params ['Aura\Framework\Web\Controller\Factory'] ['map'] ['home'] = 'Escola\Package\Web\Home\HomePage';?>

Nosso alô mundo

Cadastro de Alunos

http://localhost/escola-aura/

Criando um layout único

/escola-aura/include/Escola/Package/Web/Home/views/layout.php

<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Escola Aura</title></head><body><h1>Cadastro de Alunos</h1><?php include $this->find($this->content)?></body></html>

Criando um layout único

/escola-aura/include/Escola/Package/Web/Home/views/index.php

<a href="<?php echo $this->url?>">Incluir aluno</a>

Gerando rotas

public function actionIndex(){

$this->view = 'layout';$this->data = [

'content' => 'index','url' => $this->router->generate('edit')

];}

Definindo rotas

// a route named 'edit''edit' => [

'path' => '/escola-aura/edit/{:matricula}','values' => [

'controller' => 'home','action' => 'edit', 'matricula' => 0

],'params' => [

'matricula' => '(\d+)']

],

/escola-aura/config/default.php

Controle de edição

public function actionEdit(){

$this->view = 'layout';$this->data = [

'content' => 'edit','action' => $this->router->generate('save')

];}

Visão de edição

<form action="<?php echo $this->action?>" method="post">Nome: <input type="text" name="nome" autofocus="autofocus"><input type="hidden" name="matricula"><input type="submit" value="gravar"> </form>

/escola-aura/include/Escola/Package/Web/Home/views/edit.php

Nossa tabela

CREATE TABLE IF NOT EXISTS `alunos` ( `matricula` int(11) NOT NULL AUTO_INCREMENT, `nome` varchar(30) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`matricula`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;

Banco de dados "escola-aura"

Definição de rota de inclusão

// a route named 'save''save' => [

'path' => '/escola-aura/save','values' => [

'controller' => 'home','action' => 'save'

] ],

/escola-aura/config/default.php

Ação de inclusão

public function actionSave(){

$connection = $GLOBALS['di']->get('database');$connection->connect();

$insert = $connection->newInsert();

$insert->into('alunos')->cols(['nome']);

$bind = ['nome'=> $this->getContext()->getPost('nome')];

$stmt = $connection->query($insert, $bind);

$this->response->setRedirect($this->router->generate('home'));}

Conexão com banco de dados

$di->set('database',function(){$connection_factory = include realpath(__DIR__ . '/../package/Aura.Sql/scripts') . DIRECTORY_SEPARATOR . 'instance.php';;$connection = $connection_factory->newInstance(

// adapter name'mysql',

// DSN elements for PDO; this can also be// an array of key-value pairs'host=localhost;dbname=escola-aura',

// username for the connection'root',

// password for the connection'xampp');return $connection;});

$GLOBALS['di'] = $di;

/escola-aura/config/default.php

Listagem de registros

public function actionIndex(){

$connection = $GLOBALS['di']->get('database');$connection->connect();

$select = $connection->newSelect();

$select->cols(['*'])->from('alunos');

$this->view = 'layout';$this->data = [

'content' => 'index','url' => $this->router->generate('edit'),

'list' => $connection->fetchAll($select)];

}

/escola-aura/include/Escola/Package/Web/Home/HomePage.php

Listagem de registros

<a href="<?php echo $this->url?>">Incluir aluno</a><table><thead><tr><th>Matrícula</th><th>Nome</th></tr></thead><?phpforeach ($this->list as $item):?><tr><td><?=$item['matricula']?></td><td><?=$item['nome']?></td></tr><?phpendforeach; ?></table>

/escola-aura/include/Escola/Package/Web/Home/views/index.php

Listagem de registros

Geração de rota de alteração

<a href="<?php echo $this->url?>">Incluir aluno</a><table><thead><tr><th>Matrícula</th><th>Nome</th><th colspan="2">&nbsp;</th></tr></thead><?phpforeach ($this->list as $item):?><tr><td><?=$item['matricula']?></td><td><?=$item['nome']?></td><td><a href="<?=$this->route('edit', ['matricula' => $item['matricula']])?>">alterar</a></td></tr><?phpendforeach; ?></table>

/escola-aura/include/Escola/Package/Web/Home/views/index.php

Ação de alteração

public function actionEdit(){

$aluno = ['matricula' => 0,'nome' => ''

];

if ($matricula = $this->getParams()['matricula']){

$connection = $GLOBALS['di']->get('database');$connection->connect();

$select = $connection->newSelect();

$select->cols(['*'])->from('alunos')->where('matricula = :matricula');

$aluno = $connection->fetchOne($select,['matricula' => $matricula]);}

$this->view = 'layout';$this->data = [

'aluno' => $aluno,'content' => 'edit','action' => $this->router->generate('save')

];}

/escola-aura/include/Escola/Package/Web/Home/HomePage.php

Ação de gravação

public function actionSave(){

$connection = $GLOBALS['di']->get('database');$connection->connect();

$matricula = $this->getContext()->getPost('matricula',0);if ($matricula == 0){

$verb = $connection->newInsert();

$verb->into('alunos')->cols(['nome']);

$bind = ['nome'=> $this->getContext()->getPost('nome')];}else{

$verb = $connection->newUpdate();

$verb->table('alunos')->set('nome',':nome')->where('matricula = :matricula');

$nome = $this->getContext()->getPost('nome');

$bind = ['matricula' => $matricula, 'nome' => $nome];}

$stmt = $connection->query($verb, $bind);

$this->response->setRedirect($this->router->generate('home'));}

/escola-aura/include/Escola/Package/Web/Home/HomePage.php

Definição de rota de exclusão

// a route named 'delete''delete' => [

'path' => '/escola-aura/delete/{:matricula}','values' => [

'controller' => 'home','action' => 'delete','matricula' => 0

],'params' => [

'matricula' => '(\d+)' ]

]

/escola-aura/config/default.php

Geração de rota de exclusão

<a href="<?php echo $this->url?>">Incluir aluno</a><table><thead><tr><th>Matrícula</th><th>Nome</th><th colspan="2">&nbsp;</th></tr></thead><?phpforeach ($this->list as $item):?><tr><td><?=$item['matricula']?></td><td><?=$item['nome']?></td><td><a href="<?=$this->route('edit', ['matricula' => $item['matricula']])?>">alterar</a></td><td><a href="<?=$this->route('delete', ['matricula' => $item['matricula']])?>">excluir</a></td></tr><?phpendforeach; ?></table>

/escola-aura/include/Escola/Package/Web/Home/views/index.php

Ação de exclusão

public function actionDelete(){

$matricula = $this->getParams()['matricula'];if ($matricula > 0){

$connection = $GLOBALS['di']->get('database');$connection->connect();

$delete = $connection->newDelete();

$delete->from('alunos')->where('matricula = :matricula');

$bind = ['matricula' => $matricula];

$connection->query($delete,$bind);}

$this->response->setRedirect($this->router->generate('home'));}

/escola-aura/include/Escola/Package/Web/Home/HomePage.php

Você pode ainda...

● Definir regras para entrada de dados

● Criar formulários programaticamente

● Gerenciar a sessão com objetos

Perguntas?

Obrigado!