dependecy injection – připojení databáze

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

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

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

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

a basket bude nejlepsi registrovat jako sluzbu.

batko
Člen | 219
+
0
-

FormToBasket je komponenta.

Jde nějak udělat to abych k DB mohl přistoupit ODKUDKOLIV z celé aplikace?

David Matějka
Moderator | 6445
+
0
-

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