Подтвердить что ты не робот

Использование PHP-интерфейсов в Codeigniter

Я пытаюсь выяснить, как использовать 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. Является ли это возможным? как его проектировать?

4b9b3361

Ответ 1

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

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

Ответ 2

Здесь Как получить 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');
            }
        });
    }

}

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

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

Ответ 3

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

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

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

class Module_Controller extends Controller{
...
}

interface modular{
...
}

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

Ответ 5

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

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

require_once( "Models/ServiceApi" );

class HomeController extends Controller
{
    private $repository;

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

    ...
}

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

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

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

Factory Файл

// 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 прекрасны.
  • Хотя ваша архитектура будет тесно связана, объявление нового экземпляра вашей модели в контроллере - не совсем плохая новость.
  • Чтобы получить файл в файл вашего контроллера, просто запустите его над контроллером.