Session vytvořená na subdoméně

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
JaroslavRamba
Člen | 20
+
0
-

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
+
0
-

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.