Использование PHP-интерфейсов в Codeigniter - PullRequest
10 голосов
/ 16 мая 2010

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

Например:

<?php

interface BaseAPI {
     public function postMessage($msg);
}

class ServiceAPI implements BaseAPI {
     public function postMessage($msg) { return $msg; }
}

class Service_Two_API implements BaseAPI {
     public function postMessage($msg) { return "can't do this: ".$msg; }
}

?>

Я хочу сделать это в CI. Является ли это возможным? как мне его оформить?

Ответы [ 5 ]

13 голосов
/ 09 февраля 2014

Вот как получить CodeIgniter для правильной загрузки интерфейсов

В вашем приложении / config / autoload.php:

// Add "interface_autoloader" to your models array
$autoload['model'] = array('interface_autoloader');

Теперь создайте новый класс в папке вашего приложения / модели "interface_autoloader.php":

<?php

class Interface_autoloader {

    public function __construct() {
        $this->init_autoloader();
    }

    private function init_autoloader(){
        spl_autoload_register(function($classname){
            if( strpos($classname,'interface') !== false ){
                strtolower($classname);
                require('application/interfaces/'.$classname.'.php');
            }
        });
    }

}

Теперь создайте новую папку в папке вашего приложения под названием "interfaces": Example of Interface Usage with CodeIgniter

Затем просто добавьте свои интерфейсы в папку «interfaces», и вы сможете использовать их как обычно.

4 голосов
/ 06 февраля 2011

Я использую интерфейсы в своем проекте codeigniter. Я просто делаю это:

Некоторые классы должны расширять персональный контроллер, поэтому я создал библиотеку с именем Module_Controller, расширяющий контроллер. Эта библиотека загружается автоматически.

В том же файле мне был объявлен интерфейс. Итак, мой файл библиотеки / Module_Controller.php имеет следующий код:

class Module_Controller extends Controller{
...
}

interface modular{
...
}

Таким образом, когда этот файл будет загружен, интерфейс будет объявлен для всех.

3 голосов
/ 20 февраля 2014

Вы можете создать MY_Loader класс расширений CI_Loader в приложение / ядро ​​и загрузить ваши интерфейсы.

Здесь есть образец: http://heatherevens.me.uk/2013/11/11/interfaces-in-codeigniter/

2 голосов
/ 17 мая 2010

Зависит от того, что вы спрашиваете. Если вы спрашиваете, можете ли вы заставить каркас Code Igniter следовать вашим интерфейсам, вы могли бы, но это потребовало бы большого рефакторинга в их каркасе и, вероятно, не стоило бы работать.

Если вы спрашиваете, можете ли вы добавить интерфейсы для своих пользовательских классов при использовании Code Igniter, конечно, вы можете это сделать. CI не ограничивает вашу способность создавать собственный код, на самом деле это то, для чего он нужен. Я предполагаю, что реальный ответ - «Что именно ты спрашиваешь?».

0 голосов
/ 01 ноября 2013

Ваш интерфейс работает великолепно ... Просто потребуйте его, если он находится над контроллером, который будет его использовать, а затем объявите новый экземпляр из контроллера ...

Файл контроллера:

require_once( "Models/ServiceApi" );

class HomeController extends Controller
{
    private $repository;

    public function __Construct()
    {
        $this->repository = new ServiceApi();
    }

    ...
}

Если честно, вы, вероятно, захотите сделать какое-то внедрение зависимостей, но, учитывая, что я не использую codeigniter, я не уверен в том, насколько легко имитировать Factory для зависимых вызовов Interface на занятия.

Позвольте мне привести вам пример:

Инъекция зависимости:

Заводской файл

// Not sure how this works for code ignite but the idea is like this:

//$repositoryForController = new ServiceAPI();
$repositoryForController = new Service_Two_API();

$controller = new HomeController( $repositoryForController );

Файл контроллера:

require_once( "Models/ServiceApi" );

class HomeController extends Controller
{
    private $repository;

    public function __Construct( BaseAPI $repo )
    {
        $this->repository = $repo;
    }

    ...
}
  • Итак, обзор. Ваш интерфейс и сервис APIS в порядке
  • Несмотря на то, что ваша архитектура будет тесно связана, объявление нового экземпляра вашей модели в контроллере не является абсолютно плохой новостью.
  • Чтобы получить файл в файл вашего контроллера, просто потребуйте его, если он находится над контроллером.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...