11.2 Repository definition

The Repository is a singleton capable to manage all model instances. We have to define a Repository for each Model.
Let's image we have our User and Group models in myproject/model directory:

  • context.xml
  • Group.php
  • User.php

Inside our context.xml we can define our models Repositories:

<?xml version="1.0" encoding="UTF-8"?>
<context namespace="myproject.model">
	<objects>
		<object id="myproject.model.GroupsRepository" class="metadigit\core\db\orm\Repository">
			<constructor>
				<arg name="class">myproject\model\Group</arg>
			</constructor>
		</object>
		<object id="myproject.model.UsersRepository" class="metadigit\core\db\orm\Repository">
			<constructor>
					<arg name="class">myproject\model\User</arg>
			</constructor>
		</object>
	</objects>
</context>

Now we can inject our Repositories inside a Controller and use its CRUD methods.

<?xml version="1.0" encoding="UTF-8"?>
<context namespace="myproject.apps.web">
	<objects>
		<object id="myproject.apps.web.UsersController" class="myproject\apps\web\UsersController">
			<properties>
				<property name="UsersRepository" type="object">myproject.model.UsersRepository</property>
			</properties>
		</object>
	</objects>
</context>
<?php
namespace myproject\apps\web;
use metadigit\core\http\Request,
	metadigit\core\http\Response;

class UsersController extends \metadigit\core\web\controller\ActionController {

	/** UsersRepository
	 * @var \metadigit\core\db\orm\Repository */
	protected $UsersRepository;

	/**
	 * @param Request $Req
	 * @param Response $Res
	 * @param integer $id
	 * @param boolean $star
	 */
	function listAction(Request $Req, Response $Res, $id, $star) {
			$usersArray = $this->UsersRepository->fetchAll();
      $Res->set('users', $usersArray)
      		->setView('users-list');
	}
  
  /**
	 * @param Request $Req
	 * @param Response $Res
	 * @param integer $id
	 */
	function detailAction(Request $Req, Response $Res, $id) {
		$User = $this->UsersRepository->fetch($id);
      $Res->set('User', $User)
      		->setView('users-detail');
   }
}