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