Как реализовать шаблон репозитория в Codeigniter? - PullRequest
1 голос
/ 17 февраля 2012

Когда я программировал в ASP.NET MVC, был аккуратный шаблон под названием Репозиторий. Я хочу сделать это в Codeigniter, но не знаю как. Вот что я на самом деле хочу:

$mock_repository = new MockRepository();
$mock_repository->add(new Item(‘title1′, ‘description1′, 1));
$mock_repository->add(new Item(‘title2′, ‘description2′, 2));
$mock_repository->add(new Item(‘title3′, ‘description3′, 1));
$controller = new Item_controller($mock_repository);
$items = $controller->get_items_by_user_id(1);
$this->_assert_equals(count($items), 2);

Я использую TOAST для модульного тестирования. Итак, как мне создать экземпляр контроллера в тесте? Тест, конечно, другой контроллер.

Ответы [ 3 ]

2 голосов
/ 30 мая 2015

Из того, что я знаю, для создания универсального шаблона репозитория , как в C #, вам нужно 2 вещи, которых в PHP 5.6 нет:

  1. Перегрузка реальных методов.
  2. Общий интерфейс или Общий абстрактный класс в PHP.

Нажмите здесь , чтобы узнать больше Общего шаблона репозитория в C #.

Однако вы все равно можете создать перегрузку псевдо-метода в PHP с помощью магического метода __call , и мы можем набрать немного больше кода для общей части шаблона.

Примечание: Перед созданием этого шаблона в Codeigniter 3.0 вам нужно будет создать таблицу в базе данных и создать автозагрузчик для приложения / библиотеки папок.

Сначала нам нужно создать Интерфейс в папке application / library:

<?php

interface IRepository
{
    public function getById($id);
    public function select($columns);
    public function delete($id);
}

Seconde нам нужно создать Абстрактный класс , реализующий интерфейс и расширяющий CI_Model , чтобы можно было использовать База данных Библиотека:

<?php

abstract class Base_repository extends CI_Model implements IRepository
{
    /**
     * This must be valid table name in the Database.
     *
     * @var string $table Name of the table.
     */
    protected $table;

    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Pseudo method overloading.
     * It's called when method is not declared in the abstract class.
     *
     * @param string $name      Name of the method
     * @param mixed  $arguments Arguments of the method
     */
    public function __call($name, $arguments)
    {
        switch ($name)
        {
            case 'save':
                if ($arguments[0]->id > 0)
                {
                    $this->update($arguments[0]);
                }
                else
                {
                    $this->insert($arguments[0]);
                }
            break;
        }
    }

    /**
     * Get row with id.
     *
     * @param  integer $id
     * @return mixed
     */
    public function getById($id)
    {
        return $this->db->get_where($this->table, ['id' => $id])->row_array();
    }

    /**
     * Select columns.
     *
     * @param  array $columns
     * @return mixed
     */
    public function select($columns = ['*'])
    {
        $this->db->select($columns);
        return $this->db->get($this->table)->result();
    }

    /**
     * Insert data.
     *
     * @param  object $item
     * @return void
     */
    private function insert($item)
    {
        unset($item->id);
        $this->db->insert($this->table, $item);
    }

    /**
     * Update data.
     *
     * @param  object $item
     * @return void
     */
    private function update($item)
    {
        $this->db->where('id =', $item->id);
        unset($item->id);
        $this->db->update($this->table, $item);
    }

    /**
     * Delete data.
     *
     * @param  integer $id
     * @return void
     */
    public function delete($id)
    {
        $this->db->delete($this->table, ['id' => $id]);
    }

}

Третий проверить хранилище.Создайте новую модель в приложении / модели и расширьте Base_repository, задайте имя таблицы и метод сохранения при перегрузке, создайте объект для этой модели:

<?php

/**
 * The entity class.
 */
class Test
{
    public $id;
    public $info;
}

class Test_model extends Base_repository
{
    /**
     * Tell what table we are using.
     */
    public function __construct()
    {
        parent::__construct();

        $this->table = 'test';
    }

    /**
     * "Overload" save method and call it from the parent.
     * 
     * @param  test $item Make use of the Dependency Injection.
     * @return void
     */
    public function save(Test $item)
    {
        parent::save($item);
    }
}

Попробуйте в контроллере.Загрузите модель и попробуйте получить, вставить, и т. Д ...

Для создания реальных моделей это та же процедура.Если вам нужно добавить больше методов, которые будут одинаковыми для каждой модели, добавьте их в абстрактный класс, если вам нужно создать методы только для конкретной модели, добавьте их только в эту модель.

Я не знаюt Рекомендую свободный кодовый код .Вот несколько шаблонов для PHP CLICK !

0 голосов
/ 26 ноября 2012

Это можно сделать с помощью HMVC.

$result = Modules::run('controller/get_items_by_user_id', $params);

$this->_assert_equals($result, $expected);
0 голосов
/ 31 марта 2012

Вам придется полностью захватить системные файлы, чтобы загрузить контроллер с другого контроллера. Это невозможно сделать, метинкс.

...