O PDO Proxy é um invólucro de PDO simples e orientado a eventos que permite interceptar e alterar a execução de todos os métodos de PDO.
Esse recurso pode ser usado para:
As classes PDOProxyPDO e PDOProxyPDOStatement estendem as classes nativas PDO e PDOStatement , portanto, são compatíveis com qualquer método que espere objetos PDO regulares.
Depois de instalar esta biblioteca, você deve fornecer a configuração de proxy, assim:
<?php
use PDOProxy EventManager ;
use PDOProxy ProxyConfiguration ;
use PDOProxy PDOCommand ;
$ ev = new EventManager ();
// you can alter the output of any method, like "__construct", "query", "prepare"...
// in order to do so, you must pass method name as an event name
// please note: multiple event listeners may be attached to a single event type
$ ev -> addEventListener ( " query " , function ( PDOCommand $ command , string $ eventName ) {
// you can alter the result of any PDO method
$ event -> setResult ( new PDOMockStatement ( " query " , " SELECT 1 " );
$ command -> stopPropagation ();
});
// you can intercept any method, like "__construct", "query", "prepare"...
// to do so, you must add "#pre" suffix to the event name
$ ev -> addEventListener ( " query#pre " , function ( PDOCommand $ command , string $ eventName ) {
// if you stop event propagation, the real PDO method won't be executed and the result will be taken from this callback
if ( $ command -> getArgs ()[ 0 ] == " SELECT 1 " ) {
$ command -> stopPropagation ();
}
});
ProxyConfiguration:: init ( $ ev );Agora, você pode inicializar o PdoProxy, como o objeto PDO comum:
<?php
use PDOProxy PDO ;
$ pdo = new PDO ( " dsn " , " user " , " password " , [ " option1 " => 1 , " option2 " => 2 ]);
$ result = $ pdo -> query ( " SELECT 2 " );
// [...]O proxy pode ser instalado de duas maneiras diferentes:
user@host:/directory$ composer require pdo-proxy/pdo-proxy
Os códigos de origem podem ser encontrados no arquivo zip no seguinte URL: https://github.com/artur-graniszewski/pdo-proxy/archive/master.zip
Conforme demonstrado no código acima, cada manipulador de eventos ganha acesso a dois parâmetros, objeto Event específico e nome do evento (como string).
Aqui está uma visão geral de dois tipos de eventos levantados pelo PDO Proxy:
É levantado em todas as execuções do método da classe PDOProxyPDO
<?php
namespace PDOProxy ;
interface PDOCommandInterface
{
public function getArgs () : array ;
public function setArgs ( array $ args );
public function getMethodName () : string ;
public function getResult ();
public function setResult ( $ result );
} Os métodos getArgs() e setArgs() permitem buscar e alterar os parâmetros de entrada passados para o método PDOProxyPDO , enquanto getMethodName() permite verificar qual método PDO foi executado.
Os métodos de eventos getResult() e setResult() permitem acessar e alterar o resultado que será retornado pelo método PDO específico.
É levantado em todas as execuções do método da classe de PDOProxyPDOStatement
<?php
namespace PDOProxy ;
interface PDOStatementCommandInterface extends PDOCommandInterface
{
public function getParentArgs () : array ;
public function setParentArgs ( array $ args );
public function getParentMethodName () : string ;
} Os métodos getParentArgs() e setParentArgs() permitem buscar e alterar os parâmetros de entrada passados para o método PDOProxyPDO que criou o objeto PDOProxyPDOStatement fornecido, enquanto getParentMethodName() permite verificar qual método PDO foi executado em primeiro lugar.
Todos os eventos da PDO estendem o seguinte interface de eventos genéricos:
<?php
namespace PDOProxy ;
interface EventInterface
{
public function stopPropagation ();
public function isPropagationStopped () : bool ;
} O método stopPropagation() interrompe a propagação de eventos adicionais (resultando em outros ouvintes que não estão sendo executados para um determinado tipo de evento). No caso de nomes de eventos sufixados com a frase "#pre" (como "consulta#pre"), o método original de PDO/pdostatement não será executado no banco de dados, nesse resultado o resultado deve ser ridicularizado pela execução do método setResult() .
O proxy deve ser configurado fornecendo uma instância do método PDOProxyEventManager ao estático init() de uma classe PDOProxyProxyConfiguration (veja o exemplo acima).
Lembre -se de que instantando a classe PDOProxyPDO antes da configuração do proxy resulta em LogicException