PDO Proxy -это простая обертка PDO, управляемая событиями, которая позволяет перехватывать и изменять выполнение всех методов PDO.
Такая функция может быть использована для:
Классы PDOProxyPDO и PDOProxyPDOStatement расширяют классы PDO и PDOStatement , поэтому они совместимы с любым методом, ожидающим регулярных объектов PDO .
После установки этой библиотеки вы должны предоставить конфигурацию прокси, например:
<?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 );Теперь вы можете инициализировать Pdoproxy, как обычный объект PDO:
<?php
use PDOProxy PDO ;
$ pdo = new PDO ( " dsn " , " user " , " password " , [ " option1 " => 1 , " option2 " => 2 ]);
$ result = $ pdo -> query ( " SELECT 2 " );
// [...]Прокси может быть установлен двумя разными способами:
user@host:/directory$ composer require pdo-proxy/pdo-proxy
Исходные коды можно найти в zip-файле под следующим URL: https://github.com/artur-graniszewski/pdo-proxy/archive/master.zip
Как показано в коде выше, каждый обработчик событий получает доступ к двум параметрам: конкретный объект Event и имя события (как строка).
Вот обзор двух типов событий, поднятых PDO Proxy:
Он поднимается при каждом выполнении метода класса 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 );
} Методы getArgs() и setArgs() позволяют получать и изменять входные параметры, передаваемые в метод PDOProxyPDO , в то время как getMethodName() позволяет проверять, какой метод PDO был выполнен.
Методы события getResult() и setResult() позволяют получить доступ и изменять результат, которые будут возвращены конкретным методом PDO .
Он поднимается при каждом выполнении метода класса PDOProxyPDOStatement
<?php
namespace PDOProxy ;
interface PDOStatementCommandInterface extends PDOCommandInterface
{
public function getParentArgs () : array ;
public function setParentArgs ( array $ args );
public function getParentMethodName () : string ;
} Методы getParentArgs() и setParentArgs() позволяют получать и изменять входные параметры, передаваемые методу PDOProxyPDO , который создал заданный объект PDOProxyPDOStatement , в то время как getParentMethodName() позволяет проверять, какой метод PDO был выполнен в первом месте.
Все события PDO расширяют следующий, общий интерфейс событий:
<?php
namespace PDOProxy ;
interface EventInterface
{
public function stopPropagation ();
public function isPropagationStopped () : bool ;
} Метод stopPropagation() останавливает дальнейшее распространение событий (в результате чего другие слушатели событий не выполняются для данного типа события). В случае имен событий, представленных суффиксом с предложением «#PRE» (например, «запрос#pre»), исходный метод PDO/PdoStatement не будет выполнен в базе данных, в таком случае результат должен быть высмечен, выполняя метод setResult() .
Прокси должен быть настроен, предоставляя экземпляр PDOProxyEventManager для статического init() метода PDOProxyProxyConfiguration (см. Пример выше).
Пожалуйста, имейте в виду, что создание инстанции PDOProxyPDO -класса до привода конфигурации прокси -конфигурации в LogicException