我试图找出如何在我的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中这样做。可能吗?我该如何设计呢?
答案 0 :(得分:12)
在你的应用程序/ 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”的新文件夹:
然后只需将您的界面添加到“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;
}
...
}