Připojení k databázi na základě údajů ze session proměnné
- James
- Člen | 54
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
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
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
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
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.
- thunderbuff
- Člen | 164
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)