PDO Proxy est un simple wrapper PDO, motivé par des événements, qui permet d'intercepter et de modifier l'exécution de toutes les méthodes APD.
Une telle fonctionnalité peut être utilisée pour:
Les classes PDOProxyPDO et PDOProxyPDOStatement étendent les classes PDO et PDOStatement natives, elles sont donc compatibles avec n'importe quelle méthode s'attendant à des objets PDO réguliers.
Après avoir installé cette bibliothèque, vous devez fournir la configuration de proxy, comme ainsi:
<?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 );Maintenant, vous pouvez initialiser pdoproxy comme un objet PDO ordinaire:
<?php
use PDOProxy PDO ;
$ pdo = new PDO ( " dsn " , " user " , " password " , [ " option1 " => 1 , " option2 " => 2 ]);
$ result = $ pdo -> query ( " SELECT 2 " );
// [...]Le proxy peut être installé de deux manières différentes:
user@host:/directory$ composer require pdo-proxy/pdo-proxy
Les codes source peuvent être trouvés dans le fichier zip sous l'URL suivante: https://github.com/artur-graniszewski/pdo-proxy/archive/master.zip
Comme démontré dans le code ci-dessus, chaque gestionnaire d'événements a accès à deux paramètres, un objet Event spécifique et un nom d'événement (en tant que chaîne).
Voici un aperçu de deux types d'événements soulevés par le proxy PDO:
Il est soulevé sur chaque exécution de la méthode de la 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 );
} Les méthodes getArgs() et setArgs() permettent de récupérer et de modifier les paramètres d'entrée transmis à la méthode PDOProxyPDO , tandis que getMethodName() permet de vérifier quelle méthode PDO a été exécutée.
Les méthodes d'événement getResult() et setResult() permettent d'accéder et de modifier les résultats qui seront renvoyés par la méthode PDO spécifique.
Il est soulevé sur chaque exécution de la méthode de la classe PDOProxyPDOStatement
<?php
namespace PDOProxy ;
interface PDOStatementCommandInterface extends PDOCommandInterface
{
public function getParentArgs () : array ;
public function setParentArgs ( array $ args );
public function getParentMethodName () : string ;
} Les méthodes getParentArgs() et setParentArgs() permettent de récupérer et de modifier les paramètres d'entrée transmis à la méthode PDOProxyPDO qui a créé l'objet PDOProxyPDOStatement donné, tandis que getParentMethodName() permet de vérifier quelle méthode PDO a été exécutée en premier lieu.
Tous les événements PDO étendent l'interface d'événement générique suivante:
<?php
namespace PDOProxy ;
interface EventInterface
{
public function stopPropagation ();
public function isPropagationStopped () : bool ;
} La méthode stopPropagation() arrête une propagation supplémentaire des événements (ce qui entraîne d'autres écouteurs d'événements qui ne sont pas exécutés pour un type d'événement donné). En cas de noms d'événements suffixés avec une phrase "#pre" (comme "Query # pre"), la méthode d'origine PDO / PDOSTATATION ne sera pas exécutée sur la base de données, dans ce résultat de cas, il faut se moquer de l'exécution de la méthode setResult() .
Le proxy doit être configuré en fournissant une instance de PDOProxyEventManager à la méthode statique init() d'une classe PDOProxyProxyConfiguration (voir l'exemple ci-dessus).
Veuillez garder à l'esprit que l'instanciation de la classe PDOProxyPDO avant les résultats de la configuration proxy dans LogicException