Я пытаюсь разработать наиболее подходящий дизайн для передачи ключа сеанса между классами в 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();
Я новичок в ООП, поэтому некоторые рекомендации будут очень признательны.