PDO Proxy เป็น wrapper 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 Class Method
<?php
namespace PDOProxy ;
interface PDOStatementCommandInterface extends PDOCommandInterface
{
public function getParentArgs () : array ;
public function setParentArgs ( array $ args );
public function getParentMethodName () : string ;
} วิธี getParentArgs() และ setParentArgs() อนุญาตให้ดึงและแก้ไขพารามิเตอร์อินพุตที่ส่งผ่านไปยังวิธี PDOProxyPDO ที่สร้างวัตถุ PDOProxyPDOStatement ที่ PDO ในขณะที่ getParentMethodName()
กิจกรรม PDO ทั้งหมดขยายอินเทอร์เฟซเหตุการณ์ทั่วไปต่อไปนี้:
<?php
namespace PDOProxy ;
interface EventInterface
{
public function stopPropagation ();
public function isPropagationStopped () : bool ;
} เมธอด stopPropagation() หยุดการแพร่กระจายเหตุการณ์เพิ่มเติม (ส่งผลให้ผู้ฟังเหตุการณ์อื่นไม่ถูกดำเนินการสำหรับประเภทเหตุการณ์ที่กำหนด) ในกรณีที่ชื่อเหตุการณ์ต่อท้ายด้วยประโยค "#Pre" (เช่น "Query#pre") วิธี PDO/PDOstatement ดั้งเดิมจะไม่ถูกดำเนินการในฐานข้อมูลในกรณีดังกล่าวจะต้องล้อเลียนโดยการดำเนินการวิธี setResult()
พร็อกซีต้องได้รับการกำหนดค่าโดยการจัดทำอินสแตนซ์ของวิธี PDOProxyEventManager กับวิธีการคง init() ของคลาส PDOProxyProxyConfiguration (ดูตัวอย่างด้านบน)
โปรดจำไว้ว่าการสร้างอินสแตนซ์ PDOProxyPDO คลาสก่อนที่จะกำหนดค่าพร็อกซีใน LogicException