Jak dostat připojení do modelu se statickými metodami a Nette\DB

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

V tuhle chvíli mám (funkční) následující model:

//PostsModel.php
class PostsModel extends Nette\Object
{
    public $db;

    public function __construct(Nette\Database\Connection $db)
    {
        $this->db = $db;
    }

    public function fetchSingleBySlug($slug)
    {
        return $this->db->table('posts')->where('slug', $slug)->limit(1)->select('*')->fetch();
    }

    //další metody
}

V presenteru dostanu model pomocí getService() do proměnný a pak metody volam operátorem ->. Já bych ale chtěl mít metody statický jako tady. Jenže jak dostanu připojení k DB pro Nette\Database do toho modelu?

Editoval David Klouček (25. 8. 2012 19:34)

pg
Člen | 8
+
0
-

V uvedeném tutoriálu je pro práci s databází používáno dibi, které umožňuje statické volání (př. dibi::query()). A díky tomu se nemusí modelu předávat instance dibi.

Řekl bych, že s Nette\Database to nepůjde – ale možná se mýlím, s Nette\Database nepracuji.

Editoval pg (25. 8. 2012 21:07)

ViPEr*CZ*
Člen | 817
+
0
-

Řekl bych, že pokud k tomu není dobrý důvod, pak bych se static metodám vyhnul :-)

Editoval ViPEr*CZ* (25. 8. 2012 21:09)

Filip Procházka
Moderator | 4668
+
0
-

Ne, nechceš statické metody. A jestli ti někdo poradí jak to udělat, půjde klečet do kouta a dostane čapku s nápisem „ostuda“.

Ten tutorial je zastaralý, měl by se přepsat.

Editoval HosipLan (25. 8. 2012 21:51)

pekelnik
Člen | 462
+
0
-

>> Já bych ale chtěl mít metody statický jako tady…

Proboha proc?

Kaiz
Člen | 25
+
0
-

Dobrý den, mohli by jste mi někdo vyvrátit proč je špatný nápad mít statické metody?

Přijde mi to vhodné řešení pro situace stylu

<?php
Class Člověk {
	private $id;

	public function __construct($id){
		$this->id = $id;
	}

	public static function getByMail($mail){
		// tady ho najdu a získám si ID
		return new Člověk($nalezeneId);
	}
}
?>

V tomhle mi vyhovuje Dibi s Dibi::query, protože netuším jak bych psal modely tohoto typu bez neustálého posílání si v proměnné připojení k DB

David Matějka
Moderator | 6445
+
0
-

Kaiz:
https://doc.nette.org/…introduction a hledej ‚zlo‘ :)

jednoduse receno – tridy by mely jasne definovat svoje zavislosti a ne je cucat z prstu :)

v tvem pripade bys mel tridu (v nette nejlepe registrovanou jako sluzbu) ClovekRepository, ktera by jako zavislost mela pripojeni k databazi a ty bys nad instanci repository zavolal nestatickou metodu getByMail a ta by provedla dotaz nad pripojenim a vratila naplnenou instanci Cloveka

Kaiz
Člen | 25
+
0
-

no dobře, tak řekněme, že bych si to udělat přes Mapper a člověka neinstancoval podlě ID, nechal DI mu dát připojení, tak mu to ID budu muset setnout nějakou metodou a zase musím spoléhat na správné volání metod. Což mi taky nepřijde jako výhra