Velký počet služeb v configu při přechodu na Nette a DI

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

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
+
0
-

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
+
0
-

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
+
+3
-

myslím, že @kzk_cz naráží na tuhle diskuzi: https://forum.nette.org/…-config-neon

artemevsin
Člen | 61
+
0
-

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