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

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.

RSS tématu Téma zavřeno