Jak správně rozšířit Database/Context a přidat do DI

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
vit.peprnicek
Člen | 20
+
0
-

Ahoj, snažím se trochu rozšířit třídu Nette\Database\Context a nacpat ji do DI.

Context.php

class Context extends \Nette\Database\Context
{

	...
	public function __construct(
		\Nette\Database\Connection $connection,
		\Nette\Database\IStructure $structure,
		\Nette\Database\IConventions $conventions = NULL,
		\Nette\Caching\IStorage $cacheStorage = NULL,
		IMapping $databaseMaping
	)
	...

Presenter

abstract class BasePresenter extends Nette\Application\UI\Presenter
{
    protected $db;

    public function __construct(\Murdej\Database\Context $db)
    {
        $this->db = $db; // $this->context->
    }
}

config.neon

...
services:
	- App\Model\UserManager
	- App\Forms\SignFormFactory
	router: App\RouterFactory::createRouter
	databaseMaping: Murdej\Database\MappingSimple
	entities: App\Entities
	database.default.context: Murdej\Database\Context

config.local.neon

database:
	dsn: 'mysql:host=127.0.0.1;dbname=mcms4'
	user: ***
	password: ***
	options:
		lazy: yes`

Při tomto nastavení dostanu chybu Call to a member function getDsn() on a non-object

v souboru …mcms4/vendor/nette/database/src/Database/Table/Selection.php řádek 100

94:        public function __construct(Context $context, IConventions $conventions, $tableName, Nette\Caching\IStorage $cacheStorage = NULL)
 95:        {
 96:            $this->context = $context;
 97:            $this->conventions = $conventions;
 98:            $this->name = $tableName;
 99:
100:            $this->cache = $cacheStorage ? new Nette\Caching\Cache($cacheStorage, 'Nette.Database.' . md5($context->getConnection()->getDsn())) : NULL;
101:            $this->primary = $conventions->getPrimary($tableName);
102:            $this->sqlBuilder = new SqlBuilder($tableName, $context);
103:            $this->refCache = & $this->getRefTable($refPath)->globalRefCache[$refPath];
104:        }

nějaký nápad co je špatně?

Michal Vyšinský
Člen | 608
+
+2
-

voláš v přepsaném konstruktoru parent::__construct()? A IMO dědění je vždy špatný nápad a mělo by se používat jen v nejkrajnějších případech, nelze použít např. dekorátor?

vit.peprnicek
Člen | 20
+
0
-

Bylo to tím, sice jsem zkopíroval konstruktor ale v původní třídě byla pole jako private takže se tam hodnoty nedostaly. Díky

Editoval vit.peprnicek (25. 5. 2015 12:43)