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
+
0
-

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
+
+1
-

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