Session vytvořená na subdoméně
- JaroslavRamba
- Člen | 20
Zdravím,
potřebuji si předávat mezi subdoménami session:
Projekt1 neběží na nette a session tam vytvářím pod nastavením session_set_cookie_params( 60 * 60 * 24, ‚/‘, ‚.domain.cz‘ );
Pokud si nechám vypsat session na indexu nette Projektu2, tak vše funguje v pořádku
<?php
session_start();
var_dump($_SESSION);
die();
// Uncomment this line if you must temporarily take down your site for maintenance.
// require '.maintenance.php';
// Let bootstrap create Dependency Injection container.
$container = require __DIR__ . '/../../../private/app/bootstrap.php';
// Run application.
$container->application->run();
ale pokud si nechám vypsat obsah session v presenteru, tak se předávaná data nevypíší
abstract class BasePresenter extends Nette\Application\UI\Presenter {
protected function startup() {
parent::startup();
$session = $this->getSession();
Nette\Diagnostics\Debugger::dump($session);
die();
pokud udělám výpis, vypíšou se samozřejmě obě, ale jejich obsah je rozdílný
protected function startup() {
parent::startup();
$session = $this->getSession();
Nette\Diagnostics\Debugger::dump($session);
Nette\Diagnostics\Debugger::dump($_SESSION);
die();
→ proměnné uložené do nette objektu session se promítnou i do $_SESSSION, obráceně ne. Jak mám zařídit, aby to fungovalo na obě strany?
Díky za rady
Editoval JaroslavRamba (23. 8. 2013 15:19)
- frosty22
- Člen | 373
To bude tím, že Nette si rozděluje SESSION na jednotlivé sekce a jejich
názvy si i prefixuje:
https://api.nette.org/…ion.php.html#61
čili když v projektu 1 vytvoříš $_SESSION[„foo“] .. tak Nette tohle ignoruje, protože to není platná sekce.
Pokud bys vytvořiš v Nette:
$section = $this->session->getSection("mojesekce");
$section->foo = "bar";
Potom v projektu 1 se k němu dostaneš:
echo $_SESSION['__NF']['DATA']['mojesekce']['foo']; // Snad "bar"
Pokud náhodou tedy ani toto neuvidíš, pak si musíš nastavit ten cookie_param i zde, což uděláš v neonu v sekci:
common:
nette:
session:
cookie_domain: '.domena.cz'
A jinak tedy, máš vesměs dvě možnosti – buď v projektu 1 budeš přistupovat k tomu poli, tak jako Nette – čili přes ty klíče NF, DATA, …
A nebo holt si uděláš nějaký vlastní objekt SessionSection, kde ty klíče si budeš řešit jak potřebuješ ty a budeš v něm přistupovat k $_SESSION. A potom tedy při vytváření Session budeš používat:
$section = $this->session->getSection("mojesekce", "Moje\MujSessionSection");
$section = // instance Moje\MujSessionSection
Jen tedy tady je trošku nepraktické, že nelze volat metody hasSection, a používat iterator nad Session, jelikož ty přistupují přímo k těm klíčům NF.
Případně tedy ještě hezčí je tedy napsat celé Session vlastní v tomto případě, ale tedy to by se mi nechtělo.