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
$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();
}
$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; }
}
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);
}
}
}
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; }
}
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();
}
$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();
}