PHP OOP :: передача сеансового ключа между классами - PullRequest
4 голосов
/ 04 января 2011

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

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

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

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

Когда пользователь впервые попадает в мое приложение, значения cookie не будет, поэтому мне нужно иметь возможность как назначить новый ключ сеанса для нового 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
    }
}

Затем на всех страницах просмотра я бы создавал новый экземпляр 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();

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

1 Ответ

3 голосов
/ 04 января 2011

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

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

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

$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

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

ОБНОВЛЕНИЕ: объяснение класса SVC

The3rdPartyServiceApiWrapper should выглядит так:

 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...