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
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
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
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)