V presenteru je $this->context = null; jak se dostat k databázi?

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

Mám presenter, kterým obsluhuju paypal IPN. Chci v něm updatovat databázi, a do té přistupuji skrze context, ale ten je prázdný.

class IpnPresenter extends BasePresenter {

    /** @var Nette\DI\Container */
    private $context;

    public function __construct(Nette\DI\Container $context = NULL){
        parent::__construct($context);
        $this->context = $context;

        if($this->context==null){
            $this->logErr("context is NULL");
        }else{
            $this->logErr("context is ok");
        }
	...

log: [06-Jun-2013 22:30:09 UTC] context is NULL

Celé to pak logicky padá zde:

	$byArr = array("txn_id"=>$txn_id);
	$this->context->transactions->findOneBy($byArr);

Snažil sem se nějak zběžně hledat, ale nenašel jsem nic relevantního. Pravděpodobně jde o tak triviální záležitost, že se ani nikde neřeší.

Co teda dělat s nulovým contextem. Mám si ho nějak sám vytvářet, nebo přistupovat k databázi jinak? Potřebuji ověřit, zda záznam s určitým atributem neexistuje (viz kód) a případně poté tento záznam vytvořit.

Vojtěch Dobeš
Gold Partner | 1316
+
0
-
  1. Nedoporučuji přepisovat konstruktor presenteru. Navíc v tomto případě zcela zbytečně, $context se presenteru doručuje zcela automaticky. Prostě ten konstruktor smaž, a bude to fungovat.
  2. Nebylo by lepší si doručit jen tu službu transactions? Stačí si napsat v presenteru takovýto kód (za předpokladu, že je to jediná služba dané třídy – že nemáš více služeb stejné třídy):
private $transactions;

public function injectTransactions(...typehint té služby... $transactions)
{
	$this->transactions = $transactions;
}
Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Btw pokud máš v konstruktoru ještě nějaký „startovací“ kód, a nevíš kam s ním, umístí ho do protected metody startup.

tesarst2
Člen | 2
+
0
-

Díky za rady.
Konstruktor jsem smazal, a logiku přehodil do renderDefault:

public function renderDefault() {

        if($this->context==null){
            $this->logErr("context is NULL");
        }else{
            $this->logErr("context is ok");
        }
	...

Bohužel bez změny: [07-Jun-2013 09:44:44 UTC] context is NULL

Service injection sice funguje, ale stále mi to padá při volání metody té služby, takže bude zřejmě problém ještě jinde.
Díky za rady.

David Matějka
Moderator | 6445
+
0
-

a asi tomu taky skodi ten private $context, ten si taky smazal?

ale stejne bude lepsi si injectnout tu sluzbu samotnou pres inject*