Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Pomoć oko pisanja vlastitog PHP MVC-a - problem s Modelom i Mapperom

[es] :: PHP :: Pomoć oko pisanja vlastitog PHP MVC-a - problem s Modelom i Mapperom

[ Pregleda: 2084 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Crazy Man
Web developer
Hrvatska

Član broj: 58703
Poruke: 37
213.147.127.*



+1 Profil

icon Pomoć oko pisanja vlastitog PHP MVC-a - problem s Modelom i Mapperom23.10.2014. u 09:15 - pre 114 meseci
Pozdrav, ljudi

već neko vrijeme učim, pišem, razvijam vlastiti PHP MVC i malo sam zapeo, oko Modela tj. razdvajanje modela na Entity i Data Mapper. Entity bi sadržavao busines logiku modela, a Data Mapper samo čitanje, spremanje i brisanje u bazu, XML ili JSON recimo, znači logika mi ostaje ista a Mappere mijenjam i prilagođavam po potrebi. Taj dio sam čak i solidno razdvojio (ili barem mislim :D ) ali imam problem kada u Modelu imam relacije one-to-many, many-to-one. Npr. jedan blog post može biti u jednoj kategoriji, ali kategorija može sadržavati više blog postova.

PostController.php - Čupanje jednog posta - ovaj dio je ok, bez problema dobijem prikaz jednog posta te parent kategorije ili kategorija ako ih ima više npr. vijesti/europa/hrvatska/naslov-posta/
Code:
$postMapper = new PostMapper();
$post = $postMapper->load($id);
echo $post->getTitle();
echo $post->getText();
echo $post->getCategory()->getName(); // naziv kategorije
echo $post->getCategory()->getCategory->getName(); // naziv podkategorije


CategoryController.php - Čupanje jedne kategorije i svih postova te kategorije - tu nastaje problem jer nikako ne mogu dobiti sve postove iz kategorije - getPosts(), ne znam kako da taj dio povežem
Code:
$categoryMapper = new CategoryMapper();
$category = $categoryMapper->load($id);
echo $category->getName();
foreach ($category->getPosts() as $post) {
    echo $post->getTitle();
    echo $post->getText();
}


PostEntity.php
Code:
class Post extends Entity
{
    protected $title;
    protected $text;
    protected $category;

    public function getTitle() { return $this->title; }
    public function getText() { return $this->text; }
    public function getCategory() { return $this->category; }
}


PostMapper.php
Code:
class PostMapper extends Mapper
{
    protected $table_id;
    protected $table_name;

    public function load($id)
    {
        $data = $this->db->load($this->table_name)->select("post.*, category.name AS category_name, category.description AS category_description")->leftJoin("category ON category.id = post.id_category)->where("id=$id");
        if ($data) {
            $post = new Post($data);
        }
    }
}


CategoryEntity.php
Code:
class Category extends Entity
{
    protected $name;
    protected $posts;

    public function getName() { return $this->name; }
    public function getPosts() { return $this->posts; }
}


S metodom getPosts() bi trebao dobiti sve postove iz kategorije, ali kako da taj dio povežem s ostatakom. Unutar Entityija je sama bussiness logika tako da povezivanje s bazom ne dolazi u obzir. Razmišljao sam da u controlleru napravim ovako (iako mi nije baš najsretnije rješenje):

Code:
$categoryMapper = new CategoryMapper();
$category = $categoryMapper->load($id);
$postMapper = new PostMapper();
$posts = $postMapper->loadAllByCategory($category->getId());

echo $category->getName();
foreach ($posts as $post) {
    echo $post->getTitle();
}
 
Odgovor na temu

Goran Rakić
Beograd

Moderator
Član broj: 999
Poruke: 3766

Sajt: blog.goranrakic.com


+125 Profil

icon Re: Pomoć oko pisanja vlastitog PHP MVC-a - problem s Modelom i Mapperom23.10.2014. u 09:45 - pre 114 meseci
Pitanje koje se nameće je da li zaista želiš da iz baze (XML-a, web servisa) čitaš sve postove i sve komentare, turtles all the way down,... Šta ako imaš cirkularnu vezu da na primer post može imati više kategorija. Sada čitanjem kategorije čitaš post, a onda čitanjem posta čitaš sve druge kategorije i sve druge postove.

Ni jedno rešenje ovde nije sasvim elegantno i primenljivo u svakoj situaciji.

Jedno popularno rešenje je da niz postova u kategoriji bude proxy objekat (omotač kolekcije postova) ili niz proxy objekata (omotač postova) koji mogu sami sebe da učitaju kada im pristupiš (lazy loading). Možeš uvesti određene optimizacije pa da osim pristupa post-po-post učiniš javnim metode koje će jednim pozivom da učitaju sve ili samo neke postove po kriterijumu.

Code:

$mapper = new CategoryMapper;
$category = $mapper->load($id);

echo $category->name;
foreach ($category->posts->all as $post) { // <- trigger lazy loading
    echo $post->title;
}


Dobro bi bilo da stalno u vidu imaš interfejs kako bi koristio API i gde je potrebno da uvodiš proširivost. Uzdrži se od pisanja "univerzalnog" koda koji će raditi "šta god bude trebalo".

BTW, ne znam kako radi where() metoda ali moguće da u "id=$id" imaš SQL injection propust. Jedno rešenje je da osiguraš da je $id ceo broj ($id = (int) $id) ali to ćeš zaboraviti i problem je kada radiš sa stringovima. Bolje rešenje je da koristiš parametre u konstrukciji upita (npr. where("id=%d", $id)...) i slično za sve druge metode gde ubacuješ delove SQL upita.


[Ovu poruku je menjao Goran Rakić dana 23.10.2014. u 10:58 GMT+1]
http://sr.libreoffice.org — slobodan kancelarijski paket, obrada teksta, tablice,
prezentacije, legalno bez troškova licenciranja
 
Odgovor na temu

Crazy Man
Web developer
Hrvatska

Član broj: 58703
Poruke: 37
213.147.127.*



+1 Profil

icon Re: Pomoć oko pisanja vlastitog PHP MVC-a - problem s Modelom i Mapperom23.10.2014. u 10:05 - pre 114 meseci
Nekad mi ta informacija treba, nekad ne tako da bi lazy loading imao smisla. Recimo kod prikaza navigacije mi trebaju samo kategorije, kod prikaza jedne kategorije mi treba ta kategorija i prikaz postova, kod prikaza postova mi trebaju samo postovi, ali kod prikaza jednog posta mi trebaju i komentari i recimo dodatne fotografije...

Našao sam jedan post baš na tu temu, dosta zanimljivo rješenje koje je primjenjivo u mom slučaju - http://verraes.net/2011/05/lazy-loading-with-closures/

Ma znam, jako je teško pisati univerzalan kod, taman kad misliš da si nešto dobro napravio rješio, pojavi se neki problem koji si previdio i moraš prepravljati kod. Hvala na odgovoru !

EDIT: što se tiče where i SQL injectiona, cijela DB klasa je još u izradi tako da će i tu biti izmjena..

[Ovu poruku je menjao Crazy Man dana 23.10.2014. u 11:23 GMT+1]
 
Odgovor na temu

[es] :: PHP :: Pomoć oko pisanja vlastitog PHP MVC-a - problem s Modelom i Mapperom

[ Pregleda: 2084 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.