View
1.198
Download
3
Category
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"> </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"> </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"> </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"> </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!
Recommended