PHP OOP :: передача ключа сеанса между классами

Я пытаюсь разработать наиболее подходящий дизайн для передачи ключа сеанса между классами в PHP 5.3.

Ключ сеанса извлекается из стороннего API, и мое приложение выполняет различные вызовы API, которые все требуют, чтобы этот ключ сеанса был передан.

Я создал классы для хранения связанных вызовов API egClass cart содержит методы, которые при вызове будут отсылать запрос API для возврата данных от таких вызовов, как API_GetCart (), API_AddItem () и т. Д.

Я сохраняю ключ сеанса в одном cookie (единственном cookie, который когда-либо требуется), и вам нужно сделать значение этого файла cookie доступным для всех моих классов. Я не могу использовать базу данных или $ _SESSION для хранения данных сеанса. Сторонний API ищет управление сеансом для таких вещей, как содержимое корзины и т. Д.

Когда пользователь достигает моего приложения в первый раз, не будет никакого значения cookie, поэтому мне нужно иметь возможность назначить новый ключ сеанса новому куки-файлу, а также передать это значение (пока он недоступен как файл cookie, так как мы все еще обрабатывая тот же HTTP-запрос) другим классам.

Одна из моих идей заключалась в том, чтобы создать класс 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 } } 

Затем на всех страницах просмотра я создавал экземпляр нового экземпляра сеанса, а затем передавал этот объект в каждый класс, который требует его (почти все), либо в качестве аргумента для конструктора классов, либо как аргумент метода.

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(); 

Я новичок в ООП, поэтому некоторые рекомендации будут очень оценены.

Вы можете использовать Factory Pattern. Объекты корзины, биллинга и доставки должны создаваться классом обертки 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(); 

Лучший способ подключить класс «Корзина», «Биллинг» и «Доставка» с API – это хранить ссылку на класс API, тогда они могут вызывать любой метод, а не только getSession ().

Другим преимуществом является то, что если у вас есть идентифицированный объект, например пользователь, то класс-оболочка может предоставить вам, что в сцене не будет двойных объектов.

Если основная программа создает пользователей, должны быть разные объекты с одним и тем же пользователем, что неверно:

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

VS, если оболочка API создает их, класс-оболочка должен хранить «кеш» пользователей и возвращаться с тем же объектом пользователя для одного и того же запроса:

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

(Может быть, это не лучший пример, если программа создает дважды того же пользователя, это означает, что программа имеет серьезный дефект дизайна.)

ОБНОВЛЕНИЕ: объяснение класса 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()