4

PHP 5.3 のクラス間でセッション キーを渡すための最も適切な設計を考え出そうとしています。

セッション キーはサードパーティの API から取得され、私のアプリケーションは、このセッション キーを渡す必要があるさまざまな API 呼び出しを行います。

関連する API 呼び出しを保持するクラスを作成しました。egClass cart は、呼び出されたときに API への要求を開始して、API_GetCart()、API_AddItem() などの呼び出しからデータを返すメソッドを保持します。

セッション キーを 1 つの Cookie (これまでに必要な唯一の Cookie) に保存しており、その Cookie の値をほぼすべてのクラスで利用できるようにする必要があります。データベースまたは $_SESSION を使用してセッション データを保持できません。サードパーティ API は、バスケット コンテンツなどのセッション管理を処理します。

ユーザーが初めてアプリにアクセスしたとき、Cookie の値がないため、新しいセッション キーを新しい Cookie に割り当て、その値を渡すことができる必要があります (まだ Cookie として使用できないため、まだ同じ HTTP リクエストを処理しています) を他のクラスに送信します。

私が持っていた 1 つのアイデアは、このような Session クラスを作成し、コンストラクターにセッション グラブ/チェック コードを配置することでした。

class Session {
    public $sk;
    function __construct() {
        //code to check if user has sessionkey (sk) in cookie
        //if not, grab new sessionkey from 3rd party API and assign to new cookie
        // $sk = 'abcde12345'; //example $sk value
    }
}

次に、すべてのビュー ページで、Session の新しいインスタンスをインスタンス化し、そのオブジェクトを、クラス コンストラクターへの引数またはメソッド引数として、それを必要とする各クラスに渡します (ほとんどすべてのクラスで行います)。

orderSummary.php

$s = new Session;

//$s currently would only hold one variable, $sk = "abcde12345"
//but in the future may hold more info or perform more work

// what is best approach to making the sessionkey 
// available to all classes? arg to constructor or method... or neither :)

$basket = new Basket;
$baskSumm = $basket->getBasketSummary();

$billing = new Billing;
$billSumm = $billing->getBillingSummary();

$delivery = new Delivery;
$delSumm = $delivery->getDeliverySummary();

//code to render as HTML the customer's basket details
//as well as their billing and delivery details 

Session クラス (実際には単一の値しか保持しない) を作成するのが最善のアイデアですか? より多くの値を保持し、より多くのチェックを実行する必要があるかもしれないことを考えると、それをクラスにするのは「正しい」と感じました。その値をさまざまなクラスに渡すという点では、Session オブジェクトをコンストラクターに渡すのが最善でしょうか。

$se = new Session;
$basket = new Basket($se);
$baskSumm = $basket->getBasketSummary();

私はOOPが初めてなので、いくつかのガイダンスをいただければ幸いです。

4

1 に答える 1

3

ファクトリパターンを使用できます。バスケット、請求、および配信オブジェクトは、サードパーティのサービスAPIラッパークラスによって作成する必要があります。

$svc = new The3rdPartyServiceApiWrapper();
$svc->init();  // connect, get session etc.
if ($svc->fail()) die("halp! error here!");

$basket = $svc->createBasket();
$baskSumm = $basket->getBasketSummary();

$billing = $svc->createBilling();
$billSumm = $billing->getBillingSummary();

$delivery = $svc->createDelivery();
$delSumm = $delivery->getDeliverySummary();

Basket、Billing、DeliveryクラスをAPIに接続する最良の方法は、APIクラスへの参照を保存することです。そうすれば、getSession()だけでなく、その任意のメソッドを呼び出すことができます。

もう1つの利点は、Userなどの識別されたエンティティがある場合、ラッパークラスは、シーン内に二重オブジェクトがないことを許可できることです。

メインプログラムがユーザーを作成する場合、同じユーザーを持つ異なるオブジェクトが存在する必要がありますが、これは誤りです。

$user1 = new User("fred12");
$user2 = new User("fred12");

VS APIラッパーがそれらを作成する場合、ラッパークラスはユーザーの「キャッシュ」を保持し、同じリクエストに対して同じUserオブジェクトを返す必要があります。

$user1 = $svc->createUser("fred12");
$user2 = $svc->createUser("fred12");  // $user2 will be the same object

(おそらく、これは最良の例ではありません。プログラムが同じユーザーを2回作成する場合、そのプログラムの主要な設計に欠陥があることを意味します。)

更新: svcクラスの説明

The3rdPartyServiceApiWrapperは次のようになります。

 function getSessionId() {
   return $this->sessionId;  // initialized by constructor
 } // getSessionId()

 function createBasket() {
   $basket = new Basket($this);
   return $basket;
 } // createBasket()

バスケット:

 function Basket($s) {  // constructor of Basket class

   $this->svc = $s;

   //... the rest part of constructor

 } // Basket() constructor

function doSomethingUseful() {

  // if you wanna use the session:
  $sess = $this->svc->getSessionId();
  echo("doing useful with session $session");

  // you may access other api functions, I don't know what functions they provide
  $this->svc->closeSession();

} // doSomethingUseful()
于 2011-01-04T09:46:32.033 に答える