Jak vytvořit objekt Nette\Database\Context
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- mrudolf
- Člen | 7
Dle dokumentace na https://doc.nette.org/cs/database se Context vytváří jako:
<?php
$connection = new Connection($dsn, $user, $password, [
'lazy' => FALSE,
'driverClass' => 'App\JmenoVasiVlastniImplementaceOvladace'
]);
$database = new Context($connection);
?>
V aktuální verzi ale Context vyžaduje 2 povinné argumenty:
<?php
public function __construct(Connection $connection, IStructure $structure, IConventions $conventions = NULL, Nette\Caching\IStorage $cacheStorage = NULL)
{
$this->connection = $connection;
$this->structure = $structure;
$this->conventions = $conventions ?: new StaticConventions;
$this->cacheStorage = $cacheStorage;
}
?>
Lze to vyřešit jako:
<?php
/**
* @inject
* @var Nette\Caching\IStorage
*/
public $cache;
...
function db(){
$connection = new Connection($dsn, $user, $password, [
'lazy' => FALSE,
'driverClass' => 'App\JmenoVasiVlastniImplementaceOvladace'
]);
$structure = new Nette\Database\Structure($connection, $this->cache);
$context = new Nette\Database\Context($connection, $structure);
return $context;
}
?>
- Oli
- Člen | 1215
Je to věc, kterou jsem taky musel vstřebat, když jsem začínal s nette.
Context vubec nevytvářej, jen si ho vyžádej. Na to se používá dependecy
injection. Pokud to použiješ v presenteru, tak nikde nic jinýho
nemusíš zadávat a ono se ti to „magicky“ vloží tak jak potřebuješ.
Tzn, vloží se ti instance objektu Context
.
Pokud by jsi to chtěl takhle získat v některé své třídě, tak tu třídu musíš zaregistrovat jako službu