Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save iannsp/3739124 to your computer and use it in GitHub Desktop.
Save iannsp/3739124 to your computer and use it in GitHub Desktop.
Factories e Interfaces no Respect\Config

Factories e Interfaces no Respect\Config

Oi de novo! Dia produtivo. Temos novas funcionalidades no Respect\Config também:

Factories e Builders

O Respect\Config gerencia as configurações de seus objetos, incluindo quem depende de quem.

Algumas vezes, nessa bagunça toda, queremos muitos objetos similares. Da mesma classe ou construídos da mesma maneira. Por isso existem padrões específicos pra esses casos.

Instâncias persistidas no Respect\Config se parecem com algo assim no arquivo INI:

[agora DateTime]
time = now

Já mencionamos que essas instâncias são sempre Lazy Loaded? Ou seja, só são instanciadas quando necessário.

<?php
$container->agora; // que dia é hoje?

Um vez usada, a instância de DateTime é criada e mantida no container. Isso significa que as próximas vezes que a instância agora for utilizada, a informação contida será a mesma da criada. Precisamos arrumar isso:

[agora new DateTime]
time = now

A palavra-chave new irá dizer ao Respect\Config que queremos uma nova instância toda vez formos utilizá-la, corrigindo o nosso problema. Note que essa factory pode também ser utilizada em objetos que não sejam estáticos.

Espera que tem mais =D:

Dependency Injection de Interfaces

Essa é nossa favorita. Há um bom tempo temos utilizado algo parecido com o código abaixo para manter nossas classes a partir da interface delas, soou complicado mas é simples assim:

[PDO PDO]
dsn = sqlite::memory:

Utilizando a instância da PDO:

<?php
$pdo = $container->PDO;

Isso continua funcionando, mas agora podemos fazer algo "um pouquinho" melhor:

nota 1: A instancia de um Objeto PDO pode ser acessada atraves da propriedade chamada PDO do container([PDO PDO])

[instanceof PDO] ;equivalente ao [PDO PDO]

nota 2: Esta evolução da sintaxe permite uma conexão inteligente entre o Objeto e sua localização no container, tornando o container mais dinâmico. De maneira que qualquer instancia de PDO que seja injetada no container seja armazenada na propriedade chamada PDO do container.

No lado do PHP, o código para injetar a instância desse objeto seria assim:

<?php
$container(new PDO('sqlite::memory:'));

nota 3: O efeito dessa nova sintaxe é permitir utilizar o nome do tipo como nome único dentro do container.

Além de instâncias, o container pode receber funções, você consegue reutilizar as instâncias tipando os argumentos dessa função. Você pode também querer utilizar mais de um argumento ou uma instância de classe que implemente o método mágico __invoke():

<?php
$pdo = $container(function(PDO $conn) {
    $conn->exec('SET NAMES UTF8');
    return $conn;
});

Esperamos que você já sabia que o Respect\Config é uma opção bem bacana para gerir dependências =D

Essas funcionalidades citadas estarão disponíveis em breve na PEAR e no Composer. Por enquanto, você pode testá-las diretamente da fonte ou pedir que publiquemos logo elas pelo @phprespect.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment