dependecy injection – připojení databáze
- batko
- Člen | 219
Ahoj,
nemohu získat databázi ve své třídě.
Můžete prosím poradit?
mám svou třídu
<?php
class Basket extends Nette\Object {
public $conection;
public $idUser;
public $idBasket;
function __construct(Nette\Database\Connection $connection) {
$this->connection = $connection;
}
}
?>
vytvářím objekt (kod je zkrácen)
<?php
/** @var Nette\Database\Connection @inject */
public $connection;
$this->basket = new \Basket($this->connection);
?>
a hází mi to chybu
Argument 1 passed to Basket::__construct() must be an instance of Nette\Database\Connection, null given, called in C:\xampp\htdocs\Shoplando\app\components\Form\FormToBasket.php on line 32 and defined
- Michal Vyšinský
- Člen | 608
Jseš si jist, že v $this->connection je v tu chvíli opravdu služba databáze? Podle všeho je v tu chvíli $this->connection null.
Editoval CherryBoss (16. 5. 2013 9:05)
- Petr Hudík
- Člen | 49
Ahoj, v místě, kde vytváříš objekt basket
nemáš
připojení connection
k dispozici. Můžeš vyzkoušet to v tu
chvíli dumpnout. Zaměř se na to, jakým způsobem vytváříš objekt
FormToBasket.
Editoval Petr Hudík (16. 5. 2013 9:05)
- David Matějka
- Moderator | 6445
Jde nějak udělat to abych k DB mohl přistoupit ODKUDKOLIV z celé aplikace?
ano, ale nepokousej se o to :) DI je tu od toho, aby se ti postaralo o predani zavislosti tam, kde je to potreba
FormToBasket je komponenta.
ale ja jsem mluvil o Basket (jak tam mas
new Basket($this->connection);
)
basket si registruj jako sluzbu v configu
services:
basket: Basket
(nette se ti postara o predani zavislosti)
potom musis nejak predat ten Basket do FormToBasket, @inject ti v komponente fungovat nebude. ale jelikoz ho pouzivas, tak predpokladam, ze pouzivas dev verzi nette. nejlepsi tedy bude vytvorit si DI tovarnicku pro FormToBasket, priklad:
tovarnicka:
interface FormToBasketFactory
{
/**
* @return FormToBasket
*/
public function create();
}
komponenta:
class FormToBasket extends Control /* nebo to je primo form? ten ale nedoporucuju dedit*/
{
protected $basket;
public function __construct(Basket $basket)
{
$this->basket = $basket;
}
}
v presenteru pri vytvareni komponenty:
class FooPresenter extends BasePresenter
{
/**
* @var FormToBasketFactory
*/
public $formToBasketFactory;
...
protected function createComponentFormToBasket()
{
return $this->formToBasketFactory->create();
}
}
a do configu:
factories:
formToBasketFactory:
implement: FormToBasketFactory