Apresentação feita no Latinoware 2010 apresentando o conceito de Dependency Injection no PHP 5.3.
Esta palestra é uma tradução e simplificação da palestra Dependency Injection in PHP 5.3 de Fabien Potencier.
Guilherme Blanco, Lead Architect da Carmigo, fez a palestra "Keynote: PHP-7", no PHP Experience 2016.
O iMasters PHP Experience 2016 aconteceu nos dias 21 e 22 de Março de 2015, no Hotel Tivoli em São Paulo-SP
http://phpexperience2016.imasters.com.br/
Código sujo, código ruim, código feio, código mal-feito, código não orientado a objetos, código rebuscado, espaguete de código. Em duas simples palavras: código legado. Algumas dicas simples de como melhorar o seu dia-a-dia e como ganhar a confiança do seu chefe para tomar decisões nos projetos.
Link dos slides: https://viniciuscampitelli.com/slides/php-fora-da-web
O PHP foi inicialmente feito para a Web, mas também podemos utilizá-lo para criar CLI scripts e até mesmo daemons. É lógico que existem linguagens focadas para isso, mas em alguns cenários podemos aproveitar os códigos PHP já existentes no backend e também a experiência dos programadores da equipe. Iremos ver como lidar com argumentos para scripts e roteá-los para comandos, como criar mecanismos de controle e execução de processos externos e em background e ter códigos que sejam reaproveitáveis entre ambientes.
Talk que aborda alguns pontos da programação como SOLID, STUPID, clean code, object calisthenics, composer e algumas dicas pessoais.
Feita para o flisol 2017.
Guilherme Blanco, Lead Architect da Carmigo, fez a palestra "Keynote: PHP-7", no PHP Experience 2016.
O iMasters PHP Experience 2016 aconteceu nos dias 21 e 22 de Março de 2015, no Hotel Tivoli em São Paulo-SP
http://phpexperience2016.imasters.com.br/
Código sujo, código ruim, código feio, código mal-feito, código não orientado a objetos, código rebuscado, espaguete de código. Em duas simples palavras: código legado. Algumas dicas simples de como melhorar o seu dia-a-dia e como ganhar a confiança do seu chefe para tomar decisões nos projetos.
Link dos slides: https://viniciuscampitelli.com/slides/php-fora-da-web
O PHP foi inicialmente feito para a Web, mas também podemos utilizá-lo para criar CLI scripts e até mesmo daemons. É lógico que existem linguagens focadas para isso, mas em alguns cenários podemos aproveitar os códigos PHP já existentes no backend e também a experiência dos programadores da equipe. Iremos ver como lidar com argumentos para scripts e roteá-los para comandos, como criar mecanismos de controle e execução de processos externos e em background e ter códigos que sejam reaproveitáveis entre ambientes.
Talk que aborda alguns pontos da programação como SOLID, STUPID, clean code, object calisthenics, composer e algumas dicas pessoais.
Feita para o flisol 2017.
Lightning talk apresentada no MeetUp PHPRS subseção Canela/Gramado no dia 26/11/2016 - hotel Klein Ville de Canela (RS):
http://www.meetup.com/pt-BR/PHP-RS/events/234978772/
PHP Experience 2016 - [Palestra] Rumo à Certificação PHPiMasters
Ari Stopassola Jr, Analista de Sistemas do perito.inf.br, fez a palestra "Rumo à Certificação PHP", no PHP Experience 2016.
O iMasters PHP Experience 2016 aconteceu nos dias 21 e 22 de Março de 2015, no Hotel Tivoli em São Paulo-SP
http://phpexperience2016.imasters.com.br/
Doctrine é uma ferramenta de ORM (mapeamento objeto-relacional) para
PHP que sobrepõe a poderosa DBAL (camada de abstração de Banco de
Dados) PDO do PHP.
Um de seus principais recursos é a possibilidade adicional de escrever
consultas à base de dados através de um dialeto-SQL OO (orientado à
objeto) chamado DQL inspirado no HQL do Hibernate. Isto provê aos
desenvolvedores uma alternativa poderosa ao SQL que mantém o máximo de
flexibilidade sem qualquer necessidade de duplicação de código.
O tema da palestra é apresentar a ferramenta como uma solução ágil
para problemas recorrentes.
Última aula do curso de Python, aqui mostramos de forma superficial como fazer a integração do Django com Adobe Flex, como utilizar o módulo do PagSeguro, PyGame e como integrar sua aplicação com o Apache
Descreve a biblioteca CherryPy do Python e mostra uma aplicação WEB usando CherryPy, Mysql, arquivos tipo texto, envio de dados e formulários pelo net. Uma complementação do texto Servidor CherryPy.
PHP na Tela Escura: Aplicações Poderosas em Linha de ComandoRafael Jaques
A linguagem PHP é conhecida por ser utilizada no desenvolvimento de aplicações web. Essa palestra visa apresentar o outro lado do desenvolvimento. Poucos sabem que é possível utilizar a linguagem para desenvolver tarefas agendadas, ferramentas multi-thread e diversas outras aplicações que rodam em terminal. Nessa palestra exploraremos o mundo do PHP-CLI.
Palestra de Rafael Jaques (@rafajaques)
O objetivo desta apresentação é passar informações básicas sobre injeção de dependência, bem como alguns frameworks PHP existentes que nos trazem containers de injeção de depência.
Lightning talk apresentada no MeetUp PHPRS subseção Canela/Gramado no dia 26/11/2016 - hotel Klein Ville de Canela (RS):
http://www.meetup.com/pt-BR/PHP-RS/events/234978772/
PHP Experience 2016 - [Palestra] Rumo à Certificação PHPiMasters
Ari Stopassola Jr, Analista de Sistemas do perito.inf.br, fez a palestra "Rumo à Certificação PHP", no PHP Experience 2016.
O iMasters PHP Experience 2016 aconteceu nos dias 21 e 22 de Março de 2015, no Hotel Tivoli em São Paulo-SP
http://phpexperience2016.imasters.com.br/
Doctrine é uma ferramenta de ORM (mapeamento objeto-relacional) para
PHP que sobrepõe a poderosa DBAL (camada de abstração de Banco de
Dados) PDO do PHP.
Um de seus principais recursos é a possibilidade adicional de escrever
consultas à base de dados através de um dialeto-SQL OO (orientado à
objeto) chamado DQL inspirado no HQL do Hibernate. Isto provê aos
desenvolvedores uma alternativa poderosa ao SQL que mantém o máximo de
flexibilidade sem qualquer necessidade de duplicação de código.
O tema da palestra é apresentar a ferramenta como uma solução ágil
para problemas recorrentes.
Última aula do curso de Python, aqui mostramos de forma superficial como fazer a integração do Django com Adobe Flex, como utilizar o módulo do PagSeguro, PyGame e como integrar sua aplicação com o Apache
Descreve a biblioteca CherryPy do Python e mostra uma aplicação WEB usando CherryPy, Mysql, arquivos tipo texto, envio de dados e formulários pelo net. Uma complementação do texto Servidor CherryPy.
PHP na Tela Escura: Aplicações Poderosas em Linha de ComandoRafael Jaques
A linguagem PHP é conhecida por ser utilizada no desenvolvimento de aplicações web. Essa palestra visa apresentar o outro lado do desenvolvimento. Poucos sabem que é possível utilizar a linguagem para desenvolver tarefas agendadas, ferramentas multi-thread e diversas outras aplicações que rodam em terminal. Nessa palestra exploraremos o mundo do PHP-CLI.
Palestra de Rafael Jaques (@rafajaques)
O objetivo desta apresentação é passar informações básicas sobre injeção de dependência, bem como alguns frameworks PHP existentes que nos trazem containers de injeção de depência.
O mercado de segurança de aplicações PHP vem passando por importantes mudanças. Veremos as mudanças mais importantes e como melhorar a segurança de sua aplicação.
Aula teórica 2 da unidade (disciplina) de Programação Orientada por Objectivos para os cursos de LIGE, LEI e LETI no ISCTE-IUL no 2.º semestre do ano lectivo de 2009/2010.
Presentation gave at ConFoo 2012 (2012-03-01)
As soon as you decide to use an ORM tool, one of the biggest factors is Rapid Application Development.
Everything is wonderful during development phase, but when it hits production, performance doesn't work like you expect.
You may think it's ORM's fault, your expected it to write as efficient queries as you manually do, but like guns, ORMs don't kill your database, developers do!
This talk will go deep into Doctrine 2 ORM by exploring performance tips that can save your application from its deepest nightmare.
Presentation made at GTA meetup in 2012-02-07.
Object Calisthenics is a set of exercise rules to reach better code, maintainable, testable and readable.
Apresentação ministrada em 27/09/2011 no Tribeca Pub em São Paulo.
Object Calisthenics são exercícios que podem ser praticados com o objetivo de melhor
Doctrine 2.0 Enterprise Persistence Layer for PHPGuilherme Blanco
One area that was mostly abandoned in applications is the Model layer. Doctrine is a project that brings enterprise support this layer through a powerful ORM implementation.
Allied with new support introduced in PHP 5.3, Doctrine 2.0 brings the concept of ORM in PHP to the next level. It introduces a couple of concepts known from other languages and areas, like Annotations, Object Query Languages and Parsers. This talk will introduce these new concepts as well as explain most of its architecture.
2. 2
Guilherme Blanco
● 10+ anos como desenvolvedor
● Evangelista Open Source
● Trabalha para Yahoo!
● Contribui para Doctrine, Zend Framework, Symfony e
PHP
● No Twitter: @guilhermeblanco
● No GitHub: http://github.com/guilhermeblanco
3. 3
Dependency Injection no PHP 5.3
Um exemplo real na web
Esta palestra é uma tradução de: Dependency Injection in PHP 5.3
Concedida pelo autor Fabien Potencier
4. 4
Dependency Injection no PHP 5.3
● Na maioria das aplicações web, você precisa
gerenciar as preferências do usuário:
● A linguagem do usuário
● Se o usuário está autenticado ou não
● As credenciais do usuário
● ...
5. 5
Dependency Injection no PHP 5.3
● Isto pode ser feito no objeto User (Usuário):
● setLanguage(), getLanguage()
● setAuthenticated(), getAuthenticated()
● addCredential(), hasCredential()
● ...
6. 6
Dependency Injection no PHP 5.3
● As informações do Usuário precisam ser persistidas
entre requisições HTTP
● Nós usamos sessões em PHP para Storage
(Armazenagem)
7. 7
Dependency Injection no PHP 5.3
<?php
class SessionStorage
{
function __construct($cookieName = 'PHP_SESS_ID')
{
session_name($cookieName);
session_start();
}
function set($key, $value)
{
$_SESSION[$key] = $value;
}
// ...
}
8. 8
Dependency Injection no PHP 5.3
Muito difícil
de
customizar
Muito fácil
de
usar
<?php
class User
{
protected $storage;
function __construct()
{
$this>storage = new SessionStorage();
}
function setLanguage($language)
{
$this>storage>set('language', $language);
}
// ...
}
$user = new User();
9. 9
Dependency Injection no PHP 5.3
Muito fácil
de
customizar
Um pouco
mais difícil
de usar
<?php
class User
{
protected $storage;
function __construct($storage)
{
$this>storage = $storage;
}
}
$storage = new SessionStorage();
$user = new User($storage);
10. 10
Dependency Injection no PHP 5.3
● Isto é Dependency Injection (Injeção de Dependência)
● Nada além disso...
11. 11
Dependency Injection no PHP 5.3
● Vamos entender porque o primeiro exemplo não é
uma boa idéia...
● Quero mudar o nome do cookie da sessão do usuário
12. 12
Dependency Injection no PHP 5.3
Hardcode
na classe
do Usuário
<?php
class User
{
protected $storage;
function __construct()
{
$this>storage = new SessionStorage('SESSION_ID');
}
function setLanguage($language)
{
$this>storage>set('language', $language);
}
// ...
}
$user = new User();
13. 13
Dependency Injection no PHP 5.3
Adicionar
uma variável
global?
<?php
class User
{
protected $storage;
function __construct()
{
$this>storage = new SessionStorage(STORAGE_SESSION_NAME);
}
}
define('STORAGE_SESSION_NAME', 'SESSION_ID');
$user = new User();
14. 14
Dependency Injection no PHP 5.3
Configurar
via
Usuário?
<?php
class User
{
protected $storage;
function __construct($sessionName)
{
$this>storage = new SessionStorage($sessionName);
}
}
$user = new User('SESSION_ID');
15. 15
Dependency Injection no PHP 5.3
Configurar
com um
Array?
<?php
class User
{
protected $storage;
function __construct($storageOptions)
{
$this>storage = new SessionStorage($storageOptions['session_name']);
}
}
$user = new User(array('session_name' => 'SESSION_ID'));
16. 16
Dependency Injection no PHP 5.3
● Eu quero mudar a implementação de armazenamento
da sessão
● Sistema de Arquivos
● MySQL
● Memcached
● etc
17. 17
Usar uma
instância no
Registro global?
<?php
class User
{
protected $storage;
function __construct()
{
$this>storage = Registry::get('session_storage');
}
}
$storage = new SessionStorage();
Registry::set('session_storage', $storage);
$user = new User();
Dependency Injection no PHP 5.3
18. 18
Agora, o Usuário (User) depende do Registro
Dependency Injection no PHP 5.3
19. 19
Dependency Injection no PHP 5.3
● Ao invés da dependência do Storage estar
“hardcoded” no construtor da classe Usuário
● Injete a dependência de Storage no objeto Usuário
20. 20
Dependency Injection no PHP 5.3
<?php
class User
{
protected $storage;
function __construct($storage)
{
$this>storage = $storage;
}
}
$storage = new SessionStorage('SESSION_ID');
$user = new User($storage);
23. 23
Uso de uma
estratégia diferente
de Storage
Dependency Injection no PHP 5.3
<?php
class User
{
protected $storage;
function __construct($storage)
{
$this>storage = $storage;
}
}
$storage = new MySQLSessionStorage('SESSION_ID');
$user = new User($storage);
27. 27
Adiciona
uma interface
Dependency Injection no PHP 5.3
<?php
class User
{
protected $storage;
function __construct(SessionStorageInterface $storage)
{
$this>storage = $storage;
}
}
interface SessionStorageInterface
{
function get($key);
function set($key, $value);
}
29. 29
Dependency Injection no PHP 5.3
Mock de uma
Session
class User
{
protected $storage;
function __construct(SessionStorageInterface $storage)
{
$this>storage = $storage;
}
}
class SessionStorageForTests implements SessionStorageInterface
{
protected $data = array();
public function set($key, $value)
{
$this>data[$key] = $value;
}
public function get($key)
{
return $this>data[$key];
}
}
30. 30
Dependency Injection no PHP 5.3
● Uso de diferentes estratégias de Storage
● Configuração fica natural
● Engloba classes de terceiros (Adapter/Interface)
● Mock do objeto Storage (para testes)
● Fácil sem alterar a classe Usuário (User)
31. 31
Dependency Injection no PHP 5.3
“Dependency Injection é onde os objetos obtém
suas dependências através do construtor,
métodos ou diretamente nas propriedades”
http://www.picocontainer.org/injection.html
32. 32
Dependency Injection no PHP 5.3
<?php
$storage = new SessionStorage();
// constructor injection
$user = new User($storage);
// setter injection
$user = new User();
$user>setStorage($storage);
// property injection
$user = new User();
$user>storage = $storage;
34. 34
Dependency Injection no PHP 5.3
<?php
$request = new Request();
$response = new Response();
$storage = new FileSessionStorage('SESSION_ID');
$user = new User($storage);
$cache = new FileCache(
array('dir' => dirname(__FILE__) . '/cache')
);
$routing = new Routing($cache);
35. 35
Dependency Injection no PHP 5.3
<?php
class Application
{
function __construct()
{
$this>request = new WebRequest();
$this>response = new WebResponse();
$storage = new FileSessionStorage('SESSION_ID');
$this>user = new User($storage);
$cache = new FileCache(
array('dir' => dirname(__FILE__).'/cache')
);
$this>routing = new Routing($cache);
}
}
$application = new Application();
37. 37
Dependency Injection no PHP 5.3
<?php
class Application
{
function __construct()
{
$this>request = new WebRequest();
$this>response = new WebResponse();
$storage = new FileSessionStorage('SESSION_ID');
$this>user = new User($storage);
$cache = new FileCache(
array('dir' => dirname(__FILE__).'/cache')
);
$this>routing = new Routing($cache);
}
}
$application = new Application();
38. 38
Dependency Injection no PHP 5.3
● Nós precisamos de um Container
● Descreve objetos e suas dependências
● Instancia e configura objetos sob demanda
39. 39
Dependency Injection no PHP 5.3
● Um Container DEVE ser capaz de gerenciar
QUALQUER objeto PHP (POPO)
● Os objetos NÃO DEVEM saber que são gerenciados
por um Container
40. 40
Dependency Injection no PHP 5.3
● Parâmetros
● A implementação de SessionStorageInterface que
queremos usar (o nome da classe)
● O nome da sessão
● Objetos
● SessionStorage
● User
● Dependências
● Usuário depende de uma implementação de
SessionStorageInterface
45. 45
Dependency Injection no PHP 5.3
<?php
class Container
{
protected $parameters = array();
public function __set($key, $value)
{
$this>parameters[$key] = $value;
}
public function __get($key)
{
return $this>parameters[$key];
}
}
46. 46
Dependency Injection no PHP 5.3
<?php
$container = new Container();
$container>session_name = 'SESSION_ID';
$container>storage_class = 'SessionStorage';
$sessionStorage = new $container>storage_class($container>session_name);
$user = new User($sessionStorage);
Interface é
mais limpa
48. 48
Dependency Injection no PHP 5.3
● Precisamos de uma forma para descrever como criar
objetos, sem na realidade instanciar qualquer coisa!
● Funções anônimas existem para nos salvar!
49. 49
Funções anônimas / Lambdas
● Função anônima é uma função definida diretamente e
sem um nome
<?php
function () { echo 'Hello World'; };
50. 50
Funções anônimas / Lambdas
● Uma lambda pode ser armazenado em uma variável
<?php
$hello = function () { echo 'Hello World'; };
51. 51
Funções anônimas / Lambdas
● E depois podem ser usadas como qualquer
executável PHP
<?php
$hello();
call_user_func($hello);
52. 52
Funções anônimas / Lambdas
● Você também pode passar uma lambda como um
argumento de uma função ou método
<?php
function foo(Closure $func)
{
$func();
}
foo($hello);
55. 55
Armazene um lambda
capaz de criar objetos
sob demanda
Dependency Injection no PHP 5.3
Notifique a closure
para criar um objeto
passando um Container
class Container
{
protected $parameters = array();
protected $objects = array();
public function __set($key, $value)
{
$this>parameters[$key] = $value;
}
public function __get($key)
{
return $this>parameters[$key];
}
public function setService($key, Closure $service)
{
$this>objects[$key] = $service;
}
public function getService($key)
{
return $this>objects[$key]($this);
}
}
56. 56
Dependency Injection no PHP 5.3
<?php
$container = new Container();
$container>session_name = 'SESSION_ID';
$container>storage_class = 'SessionStorage';
$container>setService('user', function ($c)
{
return new User($c>getService('storage'));
});
$container>setService('storage', function ($c)
{
return new $c>storage_class($c>session_name);
});
<?php
$user = $container>getService('user');
61. 61
Dependency Injection no PHP 5.3
● Para alguns tipos de objetos, como o Usuário, o
Container sempre deve retornar a mesma instância
<?php
spl_object_hash($container>user) !== spl_object_hash($container>user);
62. 62
Dependency Injection no PHP 5.3
<?php
$container>user = function ($c)
{
static $user;
if (is_null($user))
{
$user = new User($c>storage);
}
return $user;
};
66. 66
Dependency Injection no PHP 5.3
<?php
class Article
{
public function __construct($title)
{
$this>title = $title;
}
public function getTitle()
{
return $this>title;
}
}
$articles = array(
new Article('Title 1'),
new Article('Title 2'),
);
67. 67
Dependency Injection no PHP 5.3
<?php
$mapper = function ($article)
{
return $article>getTitle();
};
$titles = array_map($mapper, $articles);
71. 71
Dependency Injection no PHP 5.3
<?php
$container>user = $container>asShared(function ($c)
{
return new User($c>storage);
});
72. 72
Dependency Injection no PHP 5.3
<?php
function asShared(Closure $lambda)
{
return function ($container) use ($lambda)
{
static $object;
if (is_null($object))
{
$object = $lambda($container);
}
return $object;
};
}
73. 73
Dependency Injection no PHP 5.3
Gerenciamento
de erros
class Container
{
protected $values = array();
function __set($id, $value) {
$this>values[$id] = $value;
}
function __get($id) {
if ( ! isset($this>values[$id])) {
throw new InvalidArgumentException(sprintf('Value "%s" is not defined.', $id));
}
if (is_callable($this>values[$id])) {
return $this>values[$id]($this);
} else {
return $this>values[$id];
}
}
function asShared($callable) {
return function ($c) use ($callable) {
static $object;
if (is_null($object)) {
$object = $callable($c);
}
return $object;
};
}
}
74. 74
Dependency Injection no PHP 5.3
NÃO estou afirmando para usarem lambdas em
todos os lugares
Esta apresentação tem o intuito de mostrar como
elas funcionam em exemplos práticos
83. 83
Dependency Injection no PHP 5.3
● Symfony Components DependencyInjection
● Usado no core do Symfony 2 (uma das mais rápidas
frameworks)
● Flexível (YAML, XML, INI and PHP)