SlideShare ist ein Scribd-Unternehmen logo
1 von 116
Downloaden Sie, um offline zu lesen
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?

2008

Zend Framework 1

Zend Framework 2
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 on
RewriteRule .* web/index.php
Criando o controlador
Criando o controlador
Criando o controlador

<?php
namespace EscolaPackageWebHome;
use AuraFrameworkWebControllerAbstractPage;
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 AuraFrameworkSystem $system Aura system directories; when cast to
* a string, the Aura system root directory.
*
* @var AuraAutoloadLoader $loader The autoloader for the system.
*
* @var AuraDiContainer $di The DI container for the system.
*
*/
// attach the path for a route named 'home' to the controller and action
$di->params ['AuraRouterMap'] ['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 ['AuraFrameworkWebControllerFactory'] ['map'] ['home'] =
'EscolaPackageWebHomeHomePage';
?>
Nosso alô mundo
http://localhost/escola-aura/

Cadastro de Alunos
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
/escola-aura/config/default.php

// a route named 'edit'
'edit' => [
'path' => '/escola-aura/edit/{:matricula}',
'values' => [
'controller' => 'home',
'action' => 'edit',
'matricula' => 0
],
'params' => [
'matricula' => '(d+)'
]
],
Controle de edição

public function actionEdit()
{
$this->view = 'layout';
$this->data = [
'content' => 'edit',
'action' => $this->router->generate('save')
];
}
Visão de edição
/escola-aura/include/Escola/Package/Web/Home/views/edit.php

<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>
Nossa tabela

Banco de dados "escola-aura"

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 ;
Definição de rota de inclusão
/escola-aura/config/default.php

// a route named 'save'
'save' => [
'path' => '/escola-aura/save',
'values' => [
'controller' => 'home',
'action' => 'save'
]
],
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
/escola-aura/config/default.php
$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;
Listagem de registros
/escola-aura/include/Escola/Package/Web/Home/HomePage.php
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)
];
Listagem de registros
/escola-aura/include/Escola/Package/Web/Home/views/index.php

<a href="<?php echo $this->url?>">Incluir aluno</a>
<table>
<thead>
<tr>
<th>Matrícula</th>
<th>Nome</th>
</tr>
</thead>
<?php
foreach ($this->list as $item):
?>
<tr>
<td><?=$item['matricula']?></td>
<td><?=$item['nome']?></td>
</tr>
<?php
endforeach;
?>
</table>
Listagem de registros
Geração de rota de alteração
/escola-aura/include/Escola/Package/Web/Home/views/index.php
<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>
<?php
foreach ($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>
<?php
endforeach;
?>
</table>
Ação de alteração
/escola-aura/include/Escola/Package/Web/Home/HomePage.php
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')
];
}
Ação de gravação
/escola-aura/include/Escola/Package/Web/Home/HomePage.php
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'));
Definição de rota de exclusão
/escola-aura/config/default.php

// a route named 'delete'
'delete' => [
'path' => '/escola-aura/delete/{:matricula}',
'values' => [
'controller' => 'home',
'action' => 'delete',
'matricula' => 0
],
'params' => [
'matricula' => '(d+)'
]
]
Geração de rota de exclusão
/escola-aura/include/Escola/Package/Web/Home/views/index.php
<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>
<?php
foreach ($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>
<?php
endforeach;
?>
</table>
Ação de exclusão
/escola-aura/include/Escola/Package/Web/Home/HomePage.php
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'));
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?

2008

Zend Framework 1

Zend Framework 2
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 on
RewriteRule .* web/index.php
Criando o controlador
Criando o controlador
Criando o controlador

<?php
namespace EscolaPackageWebHome;
use AuraFrameworkWebControllerAbstractPage;
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 AuraFrameworkSystem $system Aura system directories; when cast to
* a string, the Aura system root directory.
*
* @var AuraAutoloadLoader $loader The autoloader for the system.
*
* @var AuraDiContainer $di The DI container for the system.
*
*/
// attach the path for a route named 'home' to the controller and action
$di->params ['AuraRouterMap'] ['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 ['AuraFrameworkWebControllerFactory'] ['map'] ['home'] =
'EscolaPackageWebHomeHomePage';
?>
Nosso alô mundo
http://localhost/escola-aura/

Cadastro de Alunos
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
/escola-aura/config/default.php

// a route named 'edit'
'edit' => [
'path' => '/escola-aura/edit/{:matricula}',
'values' => [
'controller' => 'home',
'action' => 'edit',
'matricula' => 0
],
'params' => [
'matricula' => '(d+)'
]
],
Controle de edição

public function actionEdit()
{
$this->view = 'layout';
$this->data = [
'content' => 'edit',
'action' => $this->router->generate('save')
];
}
Visão de edição
/escola-aura/include/Escola/Package/Web/Home/views/edit.php

<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>
Nossa tabela

Banco de dados "escola-aura"

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 ;
Definição de rota de inclusão
/escola-aura/config/default.php

// a route named 'save'
'save' => [
'path' => '/escola-aura/save',
'values' => [
'controller' => 'home',
'action' => 'save'
]
],
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
/escola-aura/config/default.php
$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;
Listagem de registros
/escola-aura/include/Escola/Package/Web/Home/HomePage.php
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)
];
Listagem de registros
/escola-aura/include/Escola/Package/Web/Home/views/index.php

<a href="<?php echo $this->url?>">Incluir aluno</a>
<table>
<thead>
<tr>
<th>Matrícula</th>
<th>Nome</th>
</tr>
</thead>
<?php
foreach ($this->list as $item):
?>
<tr>
<td><?=$item['matricula']?></td>
<td><?=$item['nome']?></td>
</tr>
<?php
endforeach;
?>
</table>
Listagem de registros
Geração de rota de alteração
/escola-aura/include/Escola/Package/Web/Home/views/index.php
<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>
<?php
foreach ($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>
<?php
endforeach;
?>
</table>
Ação de alteração
/escola-aura/include/Escola/Package/Web/Home/HomePage.php
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')
];
}
Ação de gravação
/escola-aura/include/Escola/Package/Web/Home/HomePage.php
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'));
}
Definição de rota de exclusão
/escola-aura/config/default.php

// a route named 'delete'
'delete' => [
'path' => '/escola-aura/delete/{:matricula}',
'values' => [
'controller' => 'home',
'action' => 'delete',
'matricula' => 0
],
'params' => [
'matricula' => '(d+)'
]
]
Geração de rota de exclusão
/escola-aura/include/Escola/Package/Web/Home/views/index.php
<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>
<?php
foreach ($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>
<?php
endforeach;
?>
</table>
Ação de exclusão
/escola-aura/include/Escola/Package/Web/Home/HomePage.php
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'));
Você pode ainda...
●

Definir regras para entrada de dados

●

Criar formulários programaticamente

●

Gerenciar a sessão com objetos
Perguntas?
Obrigado!

Weitere ähnliche Inhalte

Was ist angesagt?

Perl Moderno, dia3
Perl Moderno, dia3Perl Moderno, dia3
Perl Moderno, dia3garux
 
Perl Moderno, dia5
Perl Moderno, dia5Perl Moderno, dia5
Perl Moderno, dia5garux
 
PHP Jedi - Boas Práticas e Alta Performance
PHP Jedi - Boas Práticas e Alta PerformancePHP Jedi - Boas Práticas e Alta Performance
PHP Jedi - Boas Práticas e Alta PerformanceFelipe Ribeiro
 
modernizando a arquitertura de sua aplicação
modernizando a arquitertura  de sua aplicaçãomodernizando a arquitertura  de sua aplicação
modernizando a arquitertura de sua aplicaçãoAntonio Spinelli
 
Perl Moderno, dia2
Perl Moderno, dia2Perl Moderno, dia2
Perl Moderno, dia2garux
 
Geolocalização em PHP - Google Places, Maps e Routes
Geolocalização em PHP - Google Places, Maps e RoutesGeolocalização em PHP - Google Places, Maps e Routes
Geolocalização em PHP - Google Places, Maps e RoutesLuis Gustavo Almeida
 
Aula 01 PHP+MySQL - LabMM4
Aula 01 PHP+MySQL - LabMM4Aula 01 PHP+MySQL - LabMM4
Aula 01 PHP+MySQL - LabMM4Carlos Santos
 
Crawling - Coleta de dados na Web com PHP
Crawling - Coleta de dados na Web com PHP Crawling - Coleta de dados na Web com PHP
Crawling - Coleta de dados na Web com PHP Luis Gustavo Almeida
 
Hooks, o condimento mágico e escondido do WordPress
Hooks, o condimento mágico e escondido do WordPressHooks, o condimento mágico e escondido do WordPress
Hooks, o condimento mágico e escondido do WordPressZé Fontainhas
 
Prog web 02-php-primeiros-passos
Prog web 02-php-primeiros-passosProg web 02-php-primeiros-passos
Prog web 02-php-primeiros-passosRegis Magalhães
 
Perl Moderno, dia4
Perl Moderno, dia4Perl Moderno, dia4
Perl Moderno, dia4garux
 
Arrays PHP - Criação de sites II
Arrays PHP - Criação de sites IIArrays PHP - Criação de sites II
Arrays PHP - Criação de sites IIinfo_cimol
 
Aula 5 PHP - Criação de sites II
Aula 5 PHP - Criação de sites IIAula 5 PHP - Criação de sites II
Aula 5 PHP - Criação de sites IIinfo_cimol
 

Was ist angesagt? (19)

NotORM
NotORMNotORM
NotORM
 
Perl Moderno, dia3
Perl Moderno, dia3Perl Moderno, dia3
Perl Moderno, dia3
 
Perl Moderno, dia5
Perl Moderno, dia5Perl Moderno, dia5
Perl Moderno, dia5
 
PHP Jedi - Boas Práticas e Alta Performance
PHP Jedi - Boas Práticas e Alta PerformancePHP Jedi - Boas Práticas e Alta Performance
PHP Jedi - Boas Práticas e Alta Performance
 
modernizando a arquitertura de sua aplicação
modernizando a arquitertura  de sua aplicaçãomodernizando a arquitertura  de sua aplicação
modernizando a arquitertura de sua aplicação
 
Perl Moderno, dia2
Perl Moderno, dia2Perl Moderno, dia2
Perl Moderno, dia2
 
Geolocalização em PHP - Google Places, Maps e Routes
Geolocalização em PHP - Google Places, Maps e RoutesGeolocalização em PHP - Google Places, Maps e Routes
Geolocalização em PHP - Google Places, Maps e Routes
 
Aula 01 PHP+MySQL - LabMM4
Aula 01 PHP+MySQL - LabMM4Aula 01 PHP+MySQL - LabMM4
Aula 01 PHP+MySQL - LabMM4
 
Crawling - Coleta de dados na Web com PHP
Crawling - Coleta de dados na Web com PHP Crawling - Coleta de dados na Web com PHP
Crawling - Coleta de dados na Web com PHP
 
Hooks, o condimento mágico e escondido do WordPress
Hooks, o condimento mágico e escondido do WordPressHooks, o condimento mágico e escondido do WordPress
Hooks, o condimento mágico e escondido do WordPress
 
Prog web 02-php-primeiros-passos
Prog web 02-php-primeiros-passosProg web 02-php-primeiros-passos
Prog web 02-php-primeiros-passos
 
Php 02 Primeiros Passos
Php 02 Primeiros PassosPhp 02 Primeiros Passos
Php 02 Primeiros Passos
 
Perl Moderno, dia4
Perl Moderno, dia4Perl Moderno, dia4
Perl Moderno, dia4
 
Pdo do PHP Palestra
Pdo do PHP PalestraPdo do PHP Palestra
Pdo do PHP Palestra
 
Arrays PHP - Criação de sites II
Arrays PHP - Criação de sites IIArrays PHP - Criação de sites II
Arrays PHP - Criação de sites II
 
Palestra de PDO
Palestra de PDOPalestra de PDO
Palestra de PDO
 
Aula 5 PHP - Criação de sites II
Aula 5 PHP - Criação de sites IIAula 5 PHP - Criação de sites II
Aula 5 PHP - Criação de sites II
 
PHP FrameWARks - FISL
PHP FrameWARks - FISLPHP FrameWARks - FISL
PHP FrameWARks - FISL
 
Introdução ao Apache Ant
Introdução ao Apache AntIntrodução ao Apache Ant
Introdução ao Apache Ant
 

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

Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkPablo Dall'Oglio
 
Lampada Php Conference Brasil 2007 Palestra
Lampada Php Conference Brasil 2007 PalestraLampada Php Conference Brasil 2007 Palestra
Lampada Php Conference Brasil 2007 PalestraDavid O'Keefe
 
Cakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHPCakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHPArlindo Santos
 
Zend Framework - PHPSP - 2009
Zend Framework - PHPSP - 2009Zend Framework - PHPSP - 2009
Zend Framework - PHPSP - 2009silva.edgar
 
Ecommerce, mais simples do que parece
Ecommerce, mais simples do que pareceEcommerce, mais simples do que parece
Ecommerce, mais simples do que pareceImpacta Eventos
 
Oficina postgresql avançado_consegi2010
Oficina postgresql avançado_consegi2010Oficina postgresql avançado_consegi2010
Oficina postgresql avançado_consegi2010Fabrízio Mello
 
Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Elton Minetto
 
PHP like a super hero
PHP like a super heroPHP like a super hero
PHP like a super heroElton Minetto
 
Ferramentas para Automação de Datacenter
Ferramentas para Automação de DatacenterFerramentas para Automação de Datacenter
Ferramentas para Automação de DatacenterWilson Lopes
 
Ferramentas para Automação de Datacenter - GTER 37
Ferramentas para Automação de Datacenter - GTER 37Ferramentas para Automação de Datacenter - GTER 37
Ferramentas para Automação de Datacenter - GTER 37Wilson Lopes
 

Ähnlich wie PHP Conference Brasil 2013 - Aplicações PHP 5.4 com componentes Aura (20)

Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um Framework
 
Zend Framework
Zend FrameworkZend Framework
Zend Framework
 
Php FrameWARks - sem CakePHP
Php FrameWARks - sem CakePHPPhp FrameWARks - sem CakePHP
Php FrameWARks - sem CakePHP
 
Php 07 Cakephp
Php 07 CakephpPhp 07 Cakephp
Php 07 Cakephp
 
Lampada Php Conference Brasil 2007 Palestra
Lampada Php Conference Brasil 2007 PalestraLampada Php Conference Brasil 2007 Palestra
Lampada Php Conference Brasil 2007 Palestra
 
Doctrine for dummies
Doctrine for dummiesDoctrine for dummies
Doctrine for dummies
 
Cakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHPCakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHP
 
Migrando para o PHP 5
Migrando para o PHP 5Migrando para o PHP 5
Migrando para o PHP 5
 
Zend Framework - PHPSP - 2009
Zend Framework - PHPSP - 2009Zend Framework - PHPSP - 2009
Zend Framework - PHPSP - 2009
 
Ecommerce, mais simples do que parece
Ecommerce, mais simples do que pareceEcommerce, mais simples do que parece
Ecommerce, mais simples do que parece
 
Zend Framework
Zend FrameworkZend Framework
Zend Framework
 
Oficina postgresql avançado_consegi2010
Oficina postgresql avançado_consegi2010Oficina postgresql avançado_consegi2010
Oficina postgresql avançado_consegi2010
 
PHP MySQL Aula 07
PHP MySQL Aula 07PHP MySQL Aula 07
PHP MySQL Aula 07
 
Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Introdução ao Zend Framework 2
Introdução ao Zend Framework 2
 
PHP like a super hero
PHP like a super heroPHP like a super hero
PHP like a super hero
 
Ferramentas para Automação de Datacenter
Ferramentas para Automação de DatacenterFerramentas para Automação de Datacenter
Ferramentas para Automação de Datacenter
 
Ferramentas para Automação de Datacenter - GTER 37
Ferramentas para Automação de Datacenter - GTER 37Ferramentas para Automação de Datacenter - GTER 37
Ferramentas para Automação de Datacenter - GTER 37
 
Crud
CrudCrud
Crud
 
Api usando Silex
Api usando SilexApi usando Silex
Api usando Silex
 
PHP 5.3 - Funções
PHP 5.3 - FunçõesPHP 5.3 - Funções
PHP 5.3 - Funções
 

Mehr von Flávio Lisboa

Criando testes integrados de APIs com PHP
Criando testes integrados de APIs com PHPCriando testes integrados de APIs com PHP
Criando testes integrados de APIs com PHPFlávio Lisboa
 
Cooperativas de Software Livre: Uma comparação entre Brasil e Argentina
Cooperativas de Software Livre: Uma comparação entre Brasil e ArgentinaCooperativas de Software Livre: Uma comparação entre Brasil e Argentina
Cooperativas de Software Livre: Uma comparação entre Brasil e ArgentinaFlávio Lisboa
 
Aprenda a afiar suas garras com Laminas
Aprenda a afiar suas garras com LaminasAprenda a afiar suas garras com Laminas
Aprenda a afiar suas garras com LaminasFlávio Lisboa
 
Ciência e software livre: desenvolvendo com método
Ciência e software livre: desenvolvendo com métodoCiência e software livre: desenvolvendo com método
Ciência e software livre: desenvolvendo com métodoFlávio Lisboa
 
Turbinando microsserviços em PHP
Turbinando microsserviços em PHPTurbinando microsserviços em PHP
Turbinando microsserviços em PHPFlávio Lisboa
 
O que esperar do framework Laminas
O que esperar do framework LaminasO que esperar do framework Laminas
O que esperar do framework LaminasFlávio Lisboa
 
PHP Conference Brazil - What can we expect about framework Laminas?
PHP Conference Brazil - What can we expect about framework Laminas?PHP Conference Brazil - What can we expect about framework Laminas?
PHP Conference Brazil - What can we expect about framework Laminas?Flávio Lisboa
 
Algoritmos Genéticos em PHP - PHP Conference Brasil 2019
Algoritmos Genéticos em PHP - PHP Conference Brasil 2019Algoritmos Genéticos em PHP - PHP Conference Brasil 2019
Algoritmos Genéticos em PHP - PHP Conference Brasil 2019Flávio Lisboa
 
Criando microsserviços em PHP
Criando microsserviços em PHPCriando microsserviços em PHP
Criando microsserviços em PHPFlávio Lisboa
 
Como se tornar o pior programador PHP do mundo
Como se tornar o pior programador PHP do mundoComo se tornar o pior programador PHP do mundo
Como se tornar o pior programador PHP do mundoFlávio Lisboa
 
A demanda da santa entrega Batman: bugs e gargalos em aplicações PHP
A demanda da santa entrega Batman: bugs e gargalos em aplicações PHPA demanda da santa entrega Batman: bugs e gargalos em aplicações PHP
A demanda da santa entrega Batman: bugs e gargalos em aplicações PHPFlávio Lisboa
 
Comunicação e padrões em código aberto: quando convergente e divergente cooperam
Comunicação e padrões em código aberto: quando convergente e divergente cooperamComunicação e padrões em código aberto: quando convergente e divergente cooperam
Comunicação e padrões em código aberto: quando convergente e divergente cooperamFlávio Lisboa
 
Criação de robôs em PHP para raspagem de dados
Criação de robôs em PHP para raspagem de dadosCriação de robôs em PHP para raspagem de dados
Criação de robôs em PHP para raspagem de dadosFlávio Lisboa
 
Estudo de Caso: Utilização de PHP no Serviço Federal de Processamento de Dados
Estudo de Caso: Utilização de PHP no Serviço Federal de Processamento de DadosEstudo de Caso: Utilização de PHP no Serviço Federal de Processamento de Dados
Estudo de Caso: Utilização de PHP no Serviço Federal de Processamento de DadosFlávio Lisboa
 
Arquitetura PHP para um mundo orientado a microsserviços
Arquitetura PHP para um mundo orientado a microsserviçosArquitetura PHP para um mundo orientado a microsserviços
Arquitetura PHP para um mundo orientado a microsserviçosFlávio Lisboa
 
Semeando Liberdade: Como (e onde) o software livre inclui as pessoas
Semeando Liberdade: Como (e onde) o software livre inclui as pessoasSemeando Liberdade: Como (e onde) o software livre inclui as pessoas
Semeando Liberdade: Como (e onde) o software livre inclui as pessoasFlávio Lisboa
 
O que é programação de computadores
O que é programação de computadoresO que é programação de computadores
O que é programação de computadoresFlávio Lisboa
 
Economia em rede (comunidade)
Economia em rede (comunidade)Economia em rede (comunidade)
Economia em rede (comunidade)Flávio Lisboa
 
Aplicações Corporativas em PHP (CRM e ERP)
Aplicações Corporativas em PHP (CRM e ERP)Aplicações Corporativas em PHP (CRM e ERP)
Aplicações Corporativas em PHP (CRM e ERP)Flávio Lisboa
 

Mehr von Flávio Lisboa (20)

Criando testes integrados de APIs com PHP
Criando testes integrados de APIs com PHPCriando testes integrados de APIs com PHP
Criando testes integrados de APIs com PHP
 
Cooperativas de Software Livre: Uma comparação entre Brasil e Argentina
Cooperativas de Software Livre: Uma comparação entre Brasil e ArgentinaCooperativas de Software Livre: Uma comparação entre Brasil e Argentina
Cooperativas de Software Livre: Uma comparação entre Brasil e Argentina
 
Aprenda a afiar suas garras com Laminas
Aprenda a afiar suas garras com LaminasAprenda a afiar suas garras com Laminas
Aprenda a afiar suas garras com Laminas
 
Ciência e software livre: desenvolvendo com método
Ciência e software livre: desenvolvendo com métodoCiência e software livre: desenvolvendo com método
Ciência e software livre: desenvolvendo com método
 
Turbinando microsserviços em PHP
Turbinando microsserviços em PHPTurbinando microsserviços em PHP
Turbinando microsserviços em PHP
 
O que esperar do framework Laminas
O que esperar do framework LaminasO que esperar do framework Laminas
O que esperar do framework Laminas
 
PHP Conference Brazil - What can we expect about framework Laminas?
PHP Conference Brazil - What can we expect about framework Laminas?PHP Conference Brazil - What can we expect about framework Laminas?
PHP Conference Brazil - What can we expect about framework Laminas?
 
Algoritmos Genéticos em PHP - PHP Conference Brasil 2019
Algoritmos Genéticos em PHP - PHP Conference Brasil 2019Algoritmos Genéticos em PHP - PHP Conference Brasil 2019
Algoritmos Genéticos em PHP - PHP Conference Brasil 2019
 
Criando microsserviços em PHP
Criando microsserviços em PHPCriando microsserviços em PHP
Criando microsserviços em PHP
 
Como se tornar o pior programador PHP do mundo
Como se tornar o pior programador PHP do mundoComo se tornar o pior programador PHP do mundo
Como se tornar o pior programador PHP do mundo
 
A demanda da santa entrega Batman: bugs e gargalos em aplicações PHP
A demanda da santa entrega Batman: bugs e gargalos em aplicações PHPA demanda da santa entrega Batman: bugs e gargalos em aplicações PHP
A demanda da santa entrega Batman: bugs e gargalos em aplicações PHP
 
Comunicação e padrões em código aberto: quando convergente e divergente cooperam
Comunicação e padrões em código aberto: quando convergente e divergente cooperamComunicação e padrões em código aberto: quando convergente e divergente cooperam
Comunicação e padrões em código aberto: quando convergente e divergente cooperam
 
Criação de robôs em PHP para raspagem de dados
Criação de robôs em PHP para raspagem de dadosCriação de robôs em PHP para raspagem de dados
Criação de robôs em PHP para raspagem de dados
 
Amanhecer esmeralda
Amanhecer esmeraldaAmanhecer esmeralda
Amanhecer esmeralda
 
Estudo de Caso: Utilização de PHP no Serviço Federal de Processamento de Dados
Estudo de Caso: Utilização de PHP no Serviço Federal de Processamento de DadosEstudo de Caso: Utilização de PHP no Serviço Federal de Processamento de Dados
Estudo de Caso: Utilização de PHP no Serviço Federal de Processamento de Dados
 
Arquitetura PHP para um mundo orientado a microsserviços
Arquitetura PHP para um mundo orientado a microsserviçosArquitetura PHP para um mundo orientado a microsserviços
Arquitetura PHP para um mundo orientado a microsserviços
 
Semeando Liberdade: Como (e onde) o software livre inclui as pessoas
Semeando Liberdade: Como (e onde) o software livre inclui as pessoasSemeando Liberdade: Como (e onde) o software livre inclui as pessoas
Semeando Liberdade: Como (e onde) o software livre inclui as pessoas
 
O que é programação de computadores
O que é programação de computadoresO que é programação de computadores
O que é programação de computadores
 
Economia em rede (comunidade)
Economia em rede (comunidade)Economia em rede (comunidade)
Economia em rede (comunidade)
 
Aplicações Corporativas em PHP (CRM e ERP)
Aplicações Corporativas em PHP (CRM e ERP)Aplicações Corporativas em PHP (CRM e ERP)
Aplicações Corporativas em PHP (CRM e ERP)
 

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

  • 1. Aplicações PHP 5.4 com componentes Aura Flávio Gomes da Silva Lisboa @fgsl
  • 6. Quem sou eu? 2008 Zend Framework 1 Zend Framework 2
  • 9. O projeto Aura Código limpo; ●Bibliotecas fracamente acopladas; ●Pacotes independentes; ●Em conformidade com os padrões PHP-FIG. ●
  • 10. 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?
  • 13. Padrões “Eu penso em padrões como algo que pode ajudar pessoas a pensarem de modo orientado a objetos” Erich Gamma
  • 14. O caso de uso ● Um cadastro de alunos. ● Matrícula e nome. ● Inclusão, alteração, exclusão e recuperação. ● Apache + PHP + MySQL
  • 19. Instalando o Composer php -r "eval('?>'.file_get_contents('https://getcomposer.org/installer'));" No webroot...
  • 20. Criando um projeto Aura com Composer
  • 21. Criando um projeto Aura com Composer
  • 22. Criando um projeto Aura com Composer
  • 32. Criando o controlador <?php namespace EscolaPackageWebHome; use AuraFrameworkWebControllerAbstractPage; class HomePage extends AbstractPage { public function actionIndex() { $this->view = 'index'; } }
  • 35. Configurando a rota <?php /** * * Overrides for 'default' config mode. * * @var AuraFrameworkSystem $system Aura system directories; when cast to * a string, the Aura system root directory. * * @var AuraAutoloadLoader $loader The autoloader for the system. * * @var AuraDiContainer $di The DI container for the system. * */ // attach the path for a route named 'home' to the controller and action $di->params ['AuraRouterMap'] ['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 ['AuraFrameworkWebControllerFactory'] ['map'] ['home'] = 'EscolaPackageWebHomeHomePage'; ?>
  • 37. 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>
  • 38. Criando um layout único /escola-aura/include/Escola/Package/Web/Home/views/index.php <a href="<?php echo $this->url?>">Incluir aluno</a>
  • 39. Gerando rotas public function actionIndex() { $this->view = 'layout'; $this->data = [ 'content' => 'index', 'url' => $this->router->generate('edit') ]; }
  • 40. Definindo rotas /escola-aura/config/default.php // a route named 'edit' 'edit' => [ 'path' => '/escola-aura/edit/{:matricula}', 'values' => [ 'controller' => 'home', 'action' => 'edit', 'matricula' => 0 ], 'params' => [ 'matricula' => '(d+)' ] ],
  • 41. Controle de edição public function actionEdit() { $this->view = 'layout'; $this->data = [ 'content' => 'edit', 'action' => $this->router->generate('save') ]; }
  • 42. Visão de edição /escola-aura/include/Escola/Package/Web/Home/views/edit.php <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>
  • 43. Nossa tabela Banco de dados "escola-aura" 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 ;
  • 44. Definição de rota de inclusão /escola-aura/config/default.php // a route named 'save' 'save' => [ 'path' => '/escola-aura/save', 'values' => [ 'controller' => 'home', 'action' => 'save' ] ],
  • 45. 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'));
  • 46. Conexão com banco de dados /escola-aura/config/default.php $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;
  • 47. Listagem de registros /escola-aura/include/Escola/Package/Web/Home/HomePage.php 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) ];
  • 48. Listagem de registros /escola-aura/include/Escola/Package/Web/Home/views/index.php <a href="<?php echo $this->url?>">Incluir aluno</a> <table> <thead> <tr> <th>Matrícula</th> <th>Nome</th> </tr> </thead> <?php foreach ($this->list as $item): ?> <tr> <td><?=$item['matricula']?></td> <td><?=$item['nome']?></td> </tr> <?php endforeach; ?> </table>
  • 50. Geração de rota de alteração /escola-aura/include/Escola/Package/Web/Home/views/index.php <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> <?php foreach ($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> <?php endforeach; ?> </table>
  • 51. Ação de alteração /escola-aura/include/Escola/Package/Web/Home/HomePage.php 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') ]; }
  • 52. Ação de gravação /escola-aura/include/Escola/Package/Web/Home/HomePage.php 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'));
  • 53. Definição de rota de exclusão /escola-aura/config/default.php // a route named 'delete' 'delete' => [ 'path' => '/escola-aura/delete/{:matricula}', 'values' => [ 'controller' => 'home', 'action' => 'delete', 'matricula' => 0 ], 'params' => [ 'matricula' => '(d+)' ] ]
  • 54. Geração de rota de exclusão /escola-aura/include/Escola/Package/Web/Home/views/index.php <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> <?php foreach ($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> <?php endforeach; ?> </table>
  • 55. Ação de exclusão /escola-aura/include/Escola/Package/Web/Home/HomePage.php 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'));
  • 56. Você pode ainda... ● Definir regras para entrada de dados ● Criar formulários programaticamente ● Gerenciar a sessão com objetos
  • 59. Aplicações PHP 5.4 com componentes Aura Flávio Gomes da Silva Lisboa @fgsl
  • 64. Quem sou eu? 2008 Zend Framework 1 Zend Framework 2
  • 67. O projeto Aura Código limpo; ●Bibliotecas fracamente acopladas; ●Pacotes independentes; ●Em conformidade com os padrões PHP-FIG. ●
  • 68. 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?
  • 71. Padrões “Eu penso em padrões como algo que pode ajudar pessoas a pensarem de modo orientado a objetos” Erich Gamma
  • 72. O caso de uso ● Um cadastro de alunos. ● Matrícula e nome. ● Inclusão, alteração, exclusão e recuperação. ● Apache + PHP + MySQL
  • 77. Instalando o Composer php -r "eval('?>'.file_get_contents('https://getcomposer.org/installer'));" No webroot...
  • 78. Criando um projeto Aura com Composer
  • 79. Criando um projeto Aura com Composer
  • 80. Criando um projeto Aura com Composer
  • 90. Criando o controlador <?php namespace EscolaPackageWebHome; use AuraFrameworkWebControllerAbstractPage; class HomePage extends AbstractPage { public function actionIndex() { $this->view = 'index'; } }
  • 93. Configurando a rota <?php /** * * Overrides for 'default' config mode. * * @var AuraFrameworkSystem $system Aura system directories; when cast to * a string, the Aura system root directory. * * @var AuraAutoloadLoader $loader The autoloader for the system. * * @var AuraDiContainer $di The DI container for the system. * */ // attach the path for a route named 'home' to the controller and action $di->params ['AuraRouterMap'] ['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 ['AuraFrameworkWebControllerFactory'] ['map'] ['home'] = 'EscolaPackageWebHomeHomePage'; ?>
  • 95. 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>
  • 96. Criando um layout único /escola-aura/include/Escola/Package/Web/Home/views/index.php <a href="<?php echo $this->url?>">Incluir aluno</a>
  • 97. Gerando rotas public function actionIndex() { $this->view = 'layout'; $this->data = [ 'content' => 'index', 'url' => $this->router->generate('edit') ]; }
  • 98. Definindo rotas /escola-aura/config/default.php // a route named 'edit' 'edit' => [ 'path' => '/escola-aura/edit/{:matricula}', 'values' => [ 'controller' => 'home', 'action' => 'edit', 'matricula' => 0 ], 'params' => [ 'matricula' => '(d+)' ] ],
  • 99. Controle de edição public function actionEdit() { $this->view = 'layout'; $this->data = [ 'content' => 'edit', 'action' => $this->router->generate('save') ]; }
  • 100. Visão de edição /escola-aura/include/Escola/Package/Web/Home/views/edit.php <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>
  • 101. Nossa tabela Banco de dados "escola-aura" 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 ;
  • 102. Definição de rota de inclusão /escola-aura/config/default.php // a route named 'save' 'save' => [ 'path' => '/escola-aura/save', 'values' => [ 'controller' => 'home', 'action' => 'save' ] ],
  • 103. 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'));
  • 104. Conexão com banco de dados /escola-aura/config/default.php $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;
  • 105. Listagem de registros /escola-aura/include/Escola/Package/Web/Home/HomePage.php 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) ];
  • 106. Listagem de registros /escola-aura/include/Escola/Package/Web/Home/views/index.php <a href="<?php echo $this->url?>">Incluir aluno</a> <table> <thead> <tr> <th>Matrícula</th> <th>Nome</th> </tr> </thead> <?php foreach ($this->list as $item): ?> <tr> <td><?=$item['matricula']?></td> <td><?=$item['nome']?></td> </tr> <?php endforeach; ?> </table>
  • 108. Geração de rota de alteração /escola-aura/include/Escola/Package/Web/Home/views/index.php <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> <?php foreach ($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> <?php endforeach; ?> </table>
  • 109. Ação de alteração /escola-aura/include/Escola/Package/Web/Home/HomePage.php 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') ]; }
  • 110. Ação de gravação /escola-aura/include/Escola/Package/Web/Home/HomePage.php 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')); }
  • 111. Definição de rota de exclusão /escola-aura/config/default.php // a route named 'delete' 'delete' => [ 'path' => '/escola-aura/delete/{:matricula}', 'values' => [ 'controller' => 'home', 'action' => 'delete', 'matricula' => 0 ], 'params' => [ 'matricula' => '(d+)' ] ]
  • 112. Geração de rota de exclusão /escola-aura/include/Escola/Package/Web/Home/views/index.php <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> <?php foreach ($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> <?php endforeach; ?> </table>
  • 113. Ação de exclusão /escola-aura/include/Escola/Package/Web/Home/HomePage.php 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'));
  • 114. Você pode ainda... ● Definir regras para entrada de dados ● Criar formulários programaticamente ● Gerenciar a sessão com objetos