Autor Zpráva
HoneyBunny
Profil
Dobrý den, pokousil jsem se vytvořit jednoduchý DDD model a jelikož jsem začátečník v Nette, tak by mě zajímalo, jestli jsem ho udělal správně. Omlouvám se, pokud Vám příjde můj příspěvek hloupý, ale chtěl jsem to raději s někým probrat než ho v praxi využiju.

config.neon:
  services:
    users: Users(UsersDAO)
    usersDatabaseMapper: UsersDatabaseMapper

  factories:
    usersDAO: UsersDAO

Users.php:
<?php

class Users
{
    private $dao;
    
    public function __construct($dao)
    {
        $this->dao = $dao;
    }
    
    public function getUsername()
    {
        return $this->dao->username;
    }
}

UsersDAO.php:
<?php

class UsersDAO
{
    private $mapper;

    public function __construct(IUserMapper $mapper)
    {
        $this->mapper = $mapper;
    }
    
    public function find($id)
    {
        return new Users($this->mapper->find($id));

    }
}

<?php

use Nette\Database\Connection,
    Nette\Database\Table\Selection;


class UsersDatabaseMapper extends Selection implements IMapper, IUserMapper
{
    
    public function __construct(Connection $connection)
    {
        parent::__construct('users', $connection);
    }
    
    public function find($id)
    {
        return $this->where(array('id' => $id))->fetch();
    }
}

Použití:
<?php
$dao = $this->context->createUsersDAO($this->context->usersDatabaseMapper);
$user = $dao->find(1); //získání dat uživatele s id 1
dump($user->getUsername()); //vrátí: admin
Nox
Profil
Přijde mi zvláštní, že Users a UsersDAO mají stejně pojmenovanou závislost, ale pokaždé jde o něco jiného. Třída by asi měla být User, ne Users, pokud nejde o kolekci (což tu nejde). Navíc Users je ve finále vlastně dvojobalem nad určitými daty, kde v tomto konkrétním zápisu ani jeden nepřidává žádnou hodnotu.

S tímto řešením taky předpokládej tuny opakujícího se kódu, ono to asi bude vypadat hezky a čistě, ale toho psaní navíc bude kopec. Co objekt to zvláštní mapper, interface pro mapper, dao, entita + gettery... taky jsem párkrát takto jel, ale je to na mašli... Pokud to má být k něčemu většímu a fakt bys to takto chtěl dělat, tak určitě doporučuju si na začátku napsat nějaké generátory kódu

Jinak ... má jít vlastně o ORM? Vyrábíš to protože chceš/tě to baví/na vyzkoušení, nebo čistě účelně? Protože pak prostě použil Doctrine2, pokud teda chceš něco takového
HoneyBunny
Profil
Děkuji za odpověď. Hledám náhradu za Active Record, kterou jsem v Nette používal, ale časté upravy a nepořádek v kódu mě donutil vyskoušet něco jiného. Na Doctrine2 jsem koukal, ale nevím jak dlouho bych strávil učením se něčeho nového (zrovna teď nemám moc času nazbyt), takže proto jsem skusil takovýto přístup. Mimochodem, co jste myslel generátorem kódu (případně co by měl generovat)?
Nox
Profil
Jestli budeš mít takových entit jako User víc, budeš pořád muset zakládat všechny ty soubory a psát všechny getXYZ funkce, to je šílená zdržovačka (a taky nuda), tak si prostě napsat něco co to udělá za tebe

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0