Codeigeniterフレームワークに基づいてプラグイン構造を実現


プラグインの构造の利点はプロジェクトの挿抜性を実现して、私は私のプロジェクトに1つのプラグインを追加して、私はこのプラグインの机能を使うことができて、私はこのプラグインを削除して、インタフェースももうこのプラグインの関连する情报を表示しません.
プロジェクト構造について説明します.
プロジェクトはCIフレームワークを使用し、
application
|--plugin(pluginフォルダを追加し、pluginInterfaceインタフェースを実装するファイルを配置)
| |--pluginInterface.php(インタフェース)
|--controllers
||--plugin(pluginフォルダを追加し、プラグインのコントロールを配置)
|--views
||--plugin(プラグインのビューを配置)
まず、プラグインの管理を容易にするために、すべてのプラグインプロバイダがインタフェースによって独自のプラグインを実現するインタフェースを提供します.
たとえば、次のインタフェースを提供します.
<?php

interface pluginInterface {
	function getLevel();
	function getName();
	function getMenus();
	function getDescription();
	function getVersion();
	function getReleaseDate();
	function getProviderName();
	
}

?>

プラグインプロバイダがインタフェースを実装
<?php
require_once dirname(dirname(dirname(__FILE__)))."/plugin/pluginInterface.php";
class xxxx  implements pluginInterface{
	
	function __construct()
	{
	}
	
	
	function getLevel(){
		
		return 1;
		
	}
	function getName(){
		return 'xxx';
	}
	function getMenus(){
		   $sideBars ="<h3>xxx</h3>
            <ul class='toggle'>
                <li class='icn_my_application'>
                    <a href='".site_url()."/plugin/xx/xxx' class='colorMediumBlue bold spanHover'>xx  </a>
                </li>
               
                <li class='icn_add_apps'>

               <a href='".site_url()."/plugin/xxxxx/xxxx' class='colorMediumBlue bold spanHover'> xxxx</a></li>
               
            </ul>";
        return $sideBars;
	}
	function getDescription(){}
	function getVersion(){}
	function getReleaseDate(){}
	function getProviderName(){}
}

?>

アプリケーション/プラグインディレクトリを巡り、上記のインタフェースを実現したすべてのクラスを検索し、反射メカニズムでgetMenusメソッドを呼び出し、プラグインの機能リストを取得するプラグイン管理クラスが必要です.
プラグイン管理クラス:pluginM.php
<?php

class pluginM extends CI_Model {
	function __construct()
	{
		parent::__construct();
		$this->load->helper('file');
		$this->load->helper('path');
	}

	 function traverse($path ,$returnarr) {
	 	
	 		$entity = array();
			$classname=array();
                $current_dir = opendir($path);    //opendir()        ,    false
                while(($file = readdir($current_dir)) !== false) {    //readdir()              
                   $sub_dir = $path.  $file;    //       

                    if($file == '.' || $file == '..') {
                        continue;
                    } else {if(is_dir($sub_dir)) {    //     ,    
                     $returnarr=$this->traverse($sub_dir."/",$returnarr);
                   } else {    //     
                       	$index=strrpos ($file,".");
						$filename=substr($file,0,$index);
                      
                       	$entity=array(
                       		'classpath'=>$path  . $file,
							'classname'=>$filename);
                       	array_push($returnarr, $entity);
                   }}
               }
               return $returnarr;
           }
  
	
	function run($functionname,$par){
		$dir=dirname(dirname(__FILE__))."/plugin/";
		$returnarr=array();
		$arr=$this->traverse($dir,$returnarr);
		
		for($i=0;$i<count($arr);$i++){
			$classpat =  $arr[$i]['classpath'];
			require_once ($classpat);
			$classname=$arr[$i]['classname'];
			if($classname=="pluginInterface"){
				continue;
			}
			$reflectionClass = new ReflectionClass($classname);
			if ($reflectionClass->implementsInterface('pluginInterface')) {
				try {
					$cla= $reflectionClass->newInstance();
				} catch (Exception $e) {
					continue;
				}
				
				if(method_exists($cla, $functionname)){
					$function=	$reflectionClass->getmethod($functionname);
// 					$this->runfunction($classname,$classpat, "getName", $par);
					$str=$function->invoke($cla,$par);
					echo $str;
				}
			}
		}
	}
   }
?>

ビューでは
<?php $this->pluginM->run("getMenus","");?>

すべてのプラグインの機能リストを取得します.