在Codeigniter中使用PHP接口

时间:2010-05-16 14:12:27

标签: php oop codeigniter

我试图找出如何在我的MVC设计中使用PHP接口。我想确保设计强制执行一个接口,以便任何新模块都遵循该接口。

例如:

<?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 个答案:

答案 0 :(得分:12)

以下是如何使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”文件夹中,您就可以像平常一样使用它们。

答案 1 :(得分:4)

我在我的codeigniter项目中使用接口。我就是这样做的:

有些类需要扩展个人控制器,所以我创建了名为Module_Controller的图书馆扩展控制器。这个库是自动加载的。

在同一个文件中,我已经被声明为接口。因此,我的文件库/ Module_Controller.php具有以下代码:

class Module_Controller extends Controller{
...
}

interface modular{
...
}

通过这种方式,当加载此文件时,将为每个人声明该接口。

答案 2 :(得分:3)

您可以在应用程序/核心中创建MY_Loader类扩展CI_Loader并加载您的接口。

以下是一个示例:http://heatherevens.me.uk/2013/11/11/interfaces-in-codeigniter/

答案 3 :(得分:2)

取决于你的要求。如果你问你是否可以使用Code Igniter框架跟随你的接口,你可以,但它需要在他们的框架中进行大量的重构,并且可能不值得工作。

如果您在使用Code Igniter时询问是否可以为自定义类添加接口,当然可以。 CI并不限制您创建自定义代码的能力,实际上这就是它的用途。我想真正的答案是“你到底在问什么?”。

答案 4 :(得分:0)

你的界面工作得很好......只需要在控制器上方使用它,然后在控制器中声明一个新的实例...

控制器文件:

require_once( "Models/ServiceApi" );

class HomeController extends Controller
{
    private $repository;

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

    ...
}

老实说,你可能希望能够进行某种依赖注入,但考虑到我不使用codeigniter,我不确定模拟工厂对依赖调用接口是多么容易上课。

让我举个例子:

依赖注入:

工厂档案

// 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很好
  • 虽然您的架构会紧密结合,但在控制器中声明模型的新实例并非完全是坏消息。
  • 要将文件放入控制器文件中,只需将其强制在控制器上方即可。