V presenteru je $this->context = null; jak se dostat k databázi?
- tesarst2
- Člen | 2
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
- 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. - 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
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
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
a asi tomu taky skodi ten private $context
, ten si taky
smazal?
ale stejne bude lepsi si injectnout tu sluzbu samotnou pres inject*