Velký počet služeb v configu při přechodu na Nette a DI
- artemevsin
- Člen | 61
Ahoj,
začínám s Nette a mám menší problém s návrhem modelu. Předtím
v čistém PHP jsem to řešil nějak podobně:
Message.php
<?php
namespace Model\Message;
use Model\Attachment;
class Message
{
private $id;
private $to;
private $subject;
private $body;
/**
* @var \Model\Attachment\AttachmentCollection
*/
private $attachments;
/**
* @param Attachment\Attachment $attachment
*/
public function addAttachment(Attachment\Attachment $attachment) {
if (!isset($this->attachments)) {
$this->attachments = Attachment\AttachmentFactory::createCollection();
}
$this->attachments->addItem($attachment);
}
/**
* @return Attachment\AttachmentCollection
*/
public function getAttachments() {
if (!isset($this->attachments)) {
$this->attachments = Attachment\AttachmentRepository::findByMessage($this);
}
return $this->attachments;
}
}
?>
AttachmentRepository.php
<?php
namespace Model\Attachment;
use Model\Message;
class AttachmentRepository {
/**
* @param Message\Message $message
* @return AttachmentCollection
*/
public static function findByMessage(Message\Message $message) {
$result = \dibi::select('*')->from('attachment')->where('message_id=%i', $message->getId())->fetchAll();
if(empty($result)) {
return;
}
$attachmentCollection = AttachmentFactory::createCollection();
foreach ($result as $row) {
$attachment = AttachmentFactory::createFromDibiRow($row);
$attachmentCollection->addItem($attachment);
}
return $attachmentCollection;
}
}
?>
AttachmentFactory.php
<?php
namespace Model\Attachment;
class AttachmentFactory {
/**
* @return Attachment
*/
public static function create() {
return new Attachment();
}
/**
* @return AttachmentCollection
*/
public static function createCollection() {
return new AttachmentCollection();
}
/**
* @param \DibiRow $row
* @return Attachment
*/
public static function createFromDibiRow(\DibiRow $row){
$attachment = self::create();
$attachment->setId($row->id);
$attachment->setPath($row->path);
return $attachment;
}
}
?>
Používal jsem opravdu hodně statiky (já vím fuj), ale tenkrát mně to přišlo jako celkem správné řešení. S odstupem času zjišťuji, že nikoli.
Když jsem podobný návrh modelu chtěl přenést do Nette s použitím DI, tak jsem narazil jednak na zacyklení závislosti a hlavně na to, že pokud budu předávat závislosti jako služby, tak za chvíli budu mít v configu zaregistrován obrovský počet služeb – skoro každá entita má vlastní repository, factory, collection a většina i nějakou service třídu. Entit je cca 30. Takže ve výsledku zhruba 100 služeb v configu.
Mám natolik neefektivní návrh nebo je normální mít tolik zaregistrovaných služeb?
Díky moc z názory a rady
- Pavel Kravčík
- Člen | 1196
Já tedy používám YetORM a rozsekané config.neon. S tím, že se mi těch 100 služeb rozběhne do configů třeba po 10ti. Takže je to relativně dobře spravovatelné.
Hlavním rozhraním je pro mě model, ten obsahuje třeba 10 repository. V komponentách a presenterech pak injectuju jen ten jeden model a volám metody jako smlouvaSave() apod. Takže to můžeš udělat podobně, že to načítání jednotlivých repositářů někde dáš do „modelu“.
A normální to myslím je. Jestli jsem to dobře pochytil – DámeJídlo jich má mnohem víc. :)
- tweak
- Člen | 9
Nebo použít https://doc.nette.org/…n/extensions
ale spíš bych to viděl na použití hotového ORM, než psát znovu
kolo? :)
- David Kudera
- Člen | 455
myslím, že @kzk_cz naráží na tuhle diskuzi: https://forum.nette.org/…-config-neon
- artemevsin
- Člen | 61
Už jsem začal pokukovat po Kdyby\Doctrine a vypadá moc dobře. A z té
diskuze evidentně plyne, že i stovky služeb není zlo :)
Díky všem za pomoc