El proxy PDO es un envoltorio PDO simple y basado en eventos que permite interceptar y alterar la ejecución de todos los métodos PDO.
Dicha característica se puede usar para:
Las clases PDOProxyPDO y PDOProxyPDOStatement extienden las clases nativas PDO y PDOStatement , por lo tanto, son compatibles con cualquier método que espera objetos PDO regulares.
Después de instalar esta biblioteca, debe proporcionar la configuración de proxy, como así:
<?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 );Ahora, puede inicializar PDOPROXY al igual que el objeto PDO normal:
<?php
use PDOProxy PDO ;
$ pdo = new PDO ( " dsn " , " user " , " password " , [ " option1 " => 1 , " option2 " => 2 ]);
$ result = $ pdo -> query ( " SELECT 2 " );
// [...]El proxy se puede instalar de dos maneras diferentes:
user@host:/directory$ composer require pdo-proxy/pdo-proxy
Los códigos de origen se pueden encontrar en el archivo zip bajo la siguiente URL: https://github.com/artur-graniszewski/pdo-proxy/archive/master.zip
Como se demuestra en el código anterior, cada controlador de eventos tiene acceso a dos parámetros, objeto Event específico y nombre de evento (como cadena).
Aquí hay una descripción general de dos tipos de eventos planteados por PDO proxy:
Se plantea en cada ejecución del método de clase 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 );
} Los métodos getArgs() y setArgs() permiten obtener y alterar los parámetros de entrada pasados al método PDOProxyPDO , mientras que getMethodName() permite verificar qué método PDO se ejecutó.
Los métodos de eventos getResult() y setResult() permiten acceder y alterar el resultado que será devuelto por un método PDO específico.
Se plantea en cada ejecución del método de clase PDOProxyPDOStatement
<?php
namespace PDOProxy ;
interface PDOStatementCommandInterface extends PDOCommandInterface
{
public function getParentArgs () : array ;
public function setParentArgs ( array $ args );
public function getParentMethodName () : string ;
} Los métodos getParentArgs() y setParentArgs() permiten obtener y alterar los parámetros de entrada pasados al método PDOProxyPDO que creó el objeto PDOProxyPDOStatement , mientras que getParentMethodName() permite verificar qué método PDO se ejecutó en el primer lugar.
Todos los eventos PDO extienden la siguiente interfaz de eventos genéricos:
<?php
namespace PDOProxy ;
interface EventInterface
{
public function stopPropagation ();
public function isPropagationStopped () : bool ;
} El método stopPropagation() detiene una mayor propagación de eventos (lo que resulta en que otros oyentes de eventos no se ejecuten para un tipo de evento dado). En el caso de los nombres de eventos sufijo con la oración "#Pre" (como "Consulta#pre"), el método original de PDO/PDostatement no se ejecutará en la base de datos, en tal caso el resultado debe burlarse ejecutando el método setResult() .
El proxy debe configurarse proporcionando una instancia de PDOProxyEventManager al método static init() de una clase PDOProxyProxyConfiguration (ver ejemplo arriba).
Tenga en cuenta que instanciar la clase PDOProxyPDO antes de la configuración del proxy da como resultado LogicException