Připojení k databázi na základě údajů ze session proměnné

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

Ahoj,

mám takový problém, který bych potřeboval vyřešit. Jedná se o to, že mám formulář, do kterého zadávám údaje pro připojení k databázi. Tyto údaje bych potřeboval při odeslání formuláře uložit do session proměnné a poté na základě údajů uložených v session proměnné vytvořit připojení k databázi.

V prezenteru Homepage mám funkci, která je voláná při odeslání fomuláře

<?php
	public function signConnectDatabaseSubmitted(Form $form)
	{
		//údaje z formuláře
		$values = $form->getValues();

		/*
		* zde bych potřeboval uložit data do session a předat je do modelu, kde bych vytvořit
		* připojení k databázi
		*/

		$this->flashMessage('Připojení k databázi bylo úspěšné.', 'success');
		$this->redirect('Database:');
	}
?>

A zde bych potřeboval vytvořit připojení k databázi na základě hodnot v session proměnné

<?php
abstract class Repository extends Nette\Object
{
    /** @var Nette\Database\Connection */
    protected $connection;

    public function __construct()
    {
	    $dsn = 'mysql:host=HODNOTA_ZE_SESSION;dbname=HODNOTA_ZE_SESSION';
	    $this->connection = new Nette\Database\Connection($dsn, HODNOTA_ZE_SESSION, HODNOTA_ZE_SESSION);
    }
}
?>

Nevím si rady s tím, jak správně pracovat se zmiňovanými session proměnnými a jak je předávat mezi presenterem a modelem. Dík za radu.

Editoval James (1. 4. 2013 10:25)

mkoubik
Člen | 728
+
0
-

Session nemusíš získávat z presenteru, je to služba zaregistrovaná v DIC, takže si stačí injectnout Nette\Http\Session (ideálně do nějaké factory na Nette\Database\Connection).

class ConnectionFactory {
    private $session;

    public function __construct(\Nette\Http\Session $session) {
        $this->session = $session;
    }

    public function createConnection() {
        $section = $this->session->getSection('db');
        // ...
        return new \Nette\Database\Connection(...);
    }
}

Editoval mkoubik (1. 4. 2013 14:28)

James
Člen | 54
+
0
-

Chápu to správně, že tímto si vyrobím přístup k proměnné?

<?php
public function __construct(\Nette\Http\Session $session) {
	$this->session = $session;
}
?>

Jak potom budu zacházet se session proměnnou, když jí budu chtít někde v presenteru naplnit a někde jinde potom zase použít, přesně nevím jak to v Nette funguje. Pochopil jsem, že se proměnné dělí do sekcí kvůli případným kolizím názvů, a když chci pracovat s proměnnou tak se musím pokaždé dostat do dané sekce, kde najdu požadovanou proměnnou a nebo přímo pracuji s proměnnou? Pár maličkostí, které my nejsou zcela jasné.

thunderbuff
Člen | 164
+
0
-

K proměnné se dostaneš takto:

<?php

$section = $session->getSection('mojeSekce');
$section->dsn = 'mojeDSN';
$section->user = 'root';
$section->pass = 'heslo';

?>

Použiješ to tak, že sesstion předáš do formuláře a naplníš, jak je ukázáno výše. Pak ve službě ConnectionFactory použiješ tak, že session opět injectneš a zavoláš:

<?php

$section = $session->getSection('mojeSekce');
$connection = new Connection($section->dsn, $section->user, $section->pass);

?>

Editoval thunderbuff (2. 4. 2013 12:59)

echo
Člen | 134
+
0
-

thunderbuff napsal(a):

K proměnné se dostaneš takto:

<?php

$section = $session->getSection('mojeSekce');
$section->dsn = 'mojeDSN';
$section->user = 'root';
$section->pass = 'heslo';

?>

Použiješ to tak, že sesstion předáš do formuláře a naplníš, jak je ukázáno výše. Pak ve službě ConnectionFactory použiješ tak, že session opět injectneš a zavoláš:

<?php

$section = $session->getSection('mojeSekce');
$connection = new Connection($section->dsn, $section->user, $section->pass);

?>

To není zrovna ideální. Takto bude mít název sekce na 2 místech. Daleko lepší je vytvořit novou třídu (třeba ConnectionDataStorage), která bude pracovat se session jako jediná.

Když pak bude třeba uložit data z formuláře nebo je načíst, nainjectuješ právě tuto třídu.

James
Člen | 54
+
0
-

Díky, moc. Rozhodně souhlasím s vytvořením jednotné třídy pro práci se session, kde je vše přehledně pohromadě. Moc jste mi pomohli.

Majkl578
Moderator | 1364
+
0
-

Pozor na to, že session se ukládají nešifrovaně na disku, na sdíleném hostingu využívajícím sdílenou session.save_path tak může potenciálně vzniknout bezpečnostní díra, kdy se jiný uživatel dostane k tvé session obsahující heslo.

thunderbuff
Člen | 164
+
0
-

Možná by bylo lepší mít přístupy k serverům uložené v configu a formulářem odesílat pouze název konfigurace. Něco jako:

parameters:
	connections:
		connection1:
			dsn: aabbb
			user: xxx
			pass: xxx
		connection2:
			...

..tedy pokud je to možné a připojuješ se k nějakým předem známým serverům.

Editoval thunderbuff (2. 4. 2013 20:18)

James
Člen | 54
+
0
-

Je mi jasné že přístup k předem známým serverům je rozhodně lepší a daleko bezpečnější, ale zrovna tento přístup se mi nehodí. Právě že dopředu nevím, ke kterým serverům se mám připojovat. Jinak bych to samozřejmě řešil přes config soubor.