Úvahy nad použitím Dependency injection

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

Zdravím,
Podle dokumentace lze DI použít ke komunikaci s databází. V dokumentaci je příklad třídy Article obsahující metodu save, která provádí insert do db:

<?php
function save() {
	$this->connection->query('INSERT INTO articles', array(
		'title' => $this->title,
		'content' => $this->content,
	));
}
?>

kerou potom použiji takto:

<?php
$article = new Article($connection);
$article->title = ...
$article->content = ...
$article->save();
?>

To je jasné. Ale:

  1. V jednom z mých prvních dotazů tady jsem byl upozorněn, že query je skoro jako sprosté slovo ;-)
  2. Jakou to má vlastně výhodu proti přístupu, který jsem pochytil v tutoriálu, kdy mám model a v něm metodu:
<?php
public function createArticle ($title, $content) {
	return = $this->getTable()->insert(array(
		'title'       =>$title,
		'content' =>$content));
}
?>

a použiji ji v presenteru:

<?php
$return = $this->context->article->createArticle('title of the article', 'content of the article');
?>

Mám dojem, že v tomto případě DI není to pravé ořechové. Nebo se mýlím? Kde vlastně hledat využití?

Šaman
Člen | 2666
+
0
-

DI řeší jen jakým způsobem se dostane databáze ($connection) do třídy modelu (Article). U tvého řešení není jasné, kde se ti ta databáze vzala, resp. vypadá to, že přímo dědíš od Connection, nebo Selection a to není dobré.

Query není sprosté slovo v Dibi, nebo Nette\Database, ale mnoho lidí používá Nette\Databese\Table, což je nadstavba, kde se už query nepoužívá.

Zato návrh modelových tříd metodou ActiveRecord, což je ten první případ, není úplně vhodný. Jakmile se projekt trochu rozroste, mohou s ním být problémy.