Injectování datbáze v modelu
- lukendo
- Člen | 96
Ahoj, vím že tohoto tématu je toho v diskuzi mnoho i celá stránka
s návodem, ale mně z nějakého důvodu nefunguje injecnutí databáze
v modelové třídě (ukázka je v rámci úspor kódu sesmolena do jednoho
souboru). Třída ArticlesModel je v configu, ale z nějkého neznámého
důvodu je $database
null. Přitom by mělo být vše správně a
koretkně? Je něco co jsem přehlédl? Děkuji,
namespace App\Model;
use Nette;
class ArticlesModel {
/** @var \Nette\Database\Context @inject */
public $database;
protected $tableName;
public function __construct() {
$this->tableName = "articles";
}
public function create(array $data) {
try {
return $this->database->table($this->tableName)->insert($data);
} catch (PDOException $e) {
return $e->getMessage();
}
}
}
Editoval lukendo (30. 8. 2018 20:30)
- Šaman
- Člen | 2666
lukendo napsal(a):
Prijde mi že z hlediska OOP by neměl takové věci model přejímat :) ale možná se pletu.
Naopak, injectování do public propery je z hlediska OOP ošklivé hned několikrát. Samotná public property porušuje zapouzdření, závislost na databázi je skrytá a vlastně do ní mohu zapsat cokoliv. O něco lepší by bylo použití setteru (inject metoda), ale to je vhodné jen pro nepovinné závistosti. Pokud model tu databázi životně potřebuje, pak je konstruktor jediná čistá volba.
A proč to v presenterech tak není? O tom se píše tady. Je to starý článek, takže implementace v Nette už je trochu jiná (není to black magic, ale property injection ⇒ property musí být public!), ale princip zůstal stejný. Kromě úvodního příspěvku je hned o pár příspěvků dál popsané, proč to do modelu nepatří. (Mimochodem, rozchodit anotaci inject i v jiných třídách lze. Jen se o tom nemluví, protože fuj. :)
Dodatek: Presentery už nejsou napuchlé, ale stále trvá problém s předáváním parametrů konstruktorem v hiearchické struktuře presenterů (BasePresenter – FrontPresenter – ArticlePresenter). Inject metody, o kterých se v článku píše, už je věc pro pamětníky, přestože jsou stále funkční variantou pro injectování pomocí anotace. Dokonce čistější variantou, ale přesně z důvodu lenosti popsané v článku už není prakticky vůbec používaná.
A mimochodem, v koncových presenterech by bylo čistější používat taky konstruktory. Problém, který anotace řeší, se týká jen abstraktních presenterů, od kterých se bude dále dědit. Ale protože programátoři jsou líní, tak používají anotace všude, kde jsou defaultně zapnuté (a proto nejsou zapnuté v modelech a komponentách… protože jinak by je i tam používali skoro všichni, čistota nečistota…).
Editoval Šaman (31. 8. 2018 14:23)