b2Core は軽量の php MVC フレームワークで、一般的な CRUD やその他の実用的な機能をカプセル化する 300 行のコードを備えています。
最新バージョンのコードをご覧ください。
http://b2core.b24.cn、批判や提案は歓迎です。
このページには、コードの各部分に関する詳細なコメントが含まれています。
フロントエンドリクエストの形式は次のとおりです
http://domain/index.php/controller/method/param1/param2/
または
http://domain/controller/method/param1/param2/
- /**
- * B2Core は、Brant (brantx@gmail.com) によって開始された PHP ベースの MVC アーキテクチャです
- * 中心的なアイデアは、MVC フレームワークに基づいて PHP の柔軟性を最大限に維持することです
- * Vision 2.0 (20120515)
- **/
-
- define('VERSION','2.0');
- // 設定ファイルをロードします: データベース、URL ルーティングなど。
- require(APP. 'config.php');
- //データベースが構成されている場合は、データベースをロードします
- if(isset($db_config)) $db = new db($db_config);
- // SAE と互換性のある要求されたアドレスを取得します
- $uri = '';
- if(isset($_SERVER['PATH_INFO'])) $uri = $_SERVER['PATH_INFO'];
- if(isset($_SERVER['ORIG_PATH_INFO'])) $uri = $_SERVER [' ORIG_PATH_INFO'];
- if(isset($_SERVER['SCRIPT_URL'])) $uri = $_SERVER['SCRIPT_URL'];
- // Magic_Quotes を削除します
- if(get_magic_quotes_gpc()) // おそらく削除されるでしょうphp6 で
- {
- 関数tripslashes_deep($value)
- {
- $value = is_array($value) ? array_map('stripslashes_deep', $value) : (isset($value) ?tripslashes($value) : null);
- return $ value;
- }
- $_POST = ストリップスラッシュ_ディープ($_POST);
- $_GET = ストリップスラッシュ_ディープ($_GET);
- $_COOKIE = ストリップスラッシュ_ディープ($_COOKIE);
- }
- // config で設定された URL ルーティングを実行します。 php
- foreach ($route_config as $key => $val)
- {
- $key = str_replace(':any', '([^/.]+)', str_replace(':num', '([0 -9 ]+)', $key));
- if (preg_match('#^'.$key.'#', $uri))$uri = preg_replace('#^'.$key.'#', $val , $uri);
- }
-
- // URL 内の各セグメントのパラメータを取得します
- $uri = rtrim($uri,'/');
- $seg =explode('/',$uri);
- $des_dir = $dir = '';
-
- /* コントローラーの上のすべてのディレクトリのアーキテクチャ ファイル __construct.php を順番にロードします
- * アーキテクチャ ファイルには、現在のディレクトリにあるすべてのコントローラーの親クラスと関数を含めることができます呼び出す必要があります
- */
-
- foreach($seg as $cur_dir)
- {
- $des_dir.=$cur_dir."/";
- if(is_file(APP.'c'.$des_dir.'__construct.php) ')) {
- require(APP .'c'.$des_dir.'__construct.php');
- $dir .=array_shift($seg).'/';
- }
- else {
- Break;
- }
- }
-
- /* URLに基づいて制御を呼び出します コンテナ内のメソッドが存在しない場合は、404エラーが返されます
- * デフォルトのリクエストクラス home->index()
- */
-
- $dir = $dir ? :'/';
- array_unshift($seg,NULL);
- $class = isset($seg[1])?$seg[1]:'home';
- $method = isset($seg[2])? $seg[2]:'index';
- if(! is_file(APP.'c'.$dir.$class.'.php'))show_404();
- require(APP.'c'.$dir. $class.'.php');
- if(!class_exists ($class))show_404();
- if(!method_exists($class,$method))show_404();
- $B2 = new $class();
- call_user_func_array(array(&$B2, $method), array_slice ($seg, 3));
-
- /* B2 システム関数
- * load($path,$instantiate) は、コントローラー、モデル、ライブラリクラスなど
- * $path はクラスファイルの相対アプリです アドレス
- * $instantiate が False の場合、ファイルのみが参照され、オブジェクトはインスタンス化されません
- * $instantiate が配列の場合、配列の内容はパラメータとしてオブジェクトに渡されます
- */
- function &load($path, $instantiate = TRUE )
- {
- $param = FALSE;
- if(is_array($instantiate)) {
- $param = $instantiate;
- $インスタンス化 = TRUE;
- }
- $file =explode('/',$path);
- $class_name = array_pop($file);
- $object_name = md5($path);
-
- static $objects = array();
- if (isset($objects[$object_name])) return $objects[$object_name];
- require( APP.$path.'.php');
- if ($instantiate == FALSE) $objects[$object_name] = TRUE;
- if($param)$objects[$object_name] = new $class_name($param);
- else $objects[$object_name] = new $class_name();
- return $objects[$object_name];
- }
-
- /* ビュー ファイルを呼び出します
- * 関数 view($view,$param = array(),$cache = FALSE)
- * $view は、app/v/ ディレクトリを基準としたテンプレート ファイルのアドレスです。 .php ファイルのサフィックスを削除します
- * $param 配列内の変数はテンプレート ファイルに渡されます
- * $cache = TRUE の場合、ブラウジングとは異なり、出力結果は代わりに string の形式で返されます
- */
- function view($view,$param = array(),$cache = FALSE)
- {
- if(!empty($param))extract($param) ;
- ob_start();
- if(is_file(APP.$view) .'.php')) {
- require APP.$view.'.php';
- }
- else {
- echo 'view '.$view.' desn't exit';
- return false;
- }
- //要求された場合はファイルデータを返します
- if ($cache === TRUE)
- {
- $buffer = ob_get_contents();
- @ob_end_clean();
- return $buffer;
- }
- }
-
- // URL のフラグメントを取得たとえば、URL は /abc/def/g/ seg(1) = abc
- function seg($i)
- {
- global $seg;
- return isset($ seg[$i])?$seg[$ i]:false;
- }
-
- // ログを書き込む
- function write_log($level = 0 ,$content = 'none')
- {
- file_put_contents(APP.'log /'.$level.'-'.date( 'Y-m-d').'.log', $content , FILE_APPEND );
- }
-
- //404 エラーを表示
- function show_404() //404 エラーを表示
- {
- header("HTTP/1.1 404 Not Found" );
- // テンプレート v/404.php を呼び出します
- view('v/404');
- exit(1);
- }
-
- /* B2Core システム クラス*/
- // 抽象コントローラー クラス。すべてのコントローラーはこのクラスまたはこのクラスのサブクラスに基づくことをお勧めします
- class c {
- functionindex()
- {
- echo "Based on B2 v ".VERSION.";
- }
- }
-
- // データベース操作クラス
- class db {
- var $link;
- var $last_query;
- function __construct($conf)
- {
- $this->link = mysql_connect($conf['host'],$conf['user'], $conf['password']);
- if (!$this->link) {
- die('接続できません: ' . mysql_error( ));
- return FALSE;
- }
- $db_selected = mysql_select_db($conf['default_db']);
- if (!$db_selected) {
- die('使用できません: ' . mysql_error());
- }
- mysql_query ('set names utf8',$this->link);
- }
-
- //クエリクエリを実行し、結果が配列の場合、配列データを返す
- function query($query)
- {
- $ret = array() ;
- $this->last_query = $query;
- $result = mysql_query($query,$this->link);
- if (!$result) {
- echo "DB エラー、クエリできませんでしたデータベース";
- echo 'MySQL エラー: ' . mysql_error();
- echo 'エラー クエリ: ' . $query;
- exit;
- }
- if($result == 1 )return TRUE;
- while($record = mysql_fetch_assoc($result ))
- {
- $ret[] = $record;
- }
- return $ret;
- }
-
- function insert_id() {return mysql_insert_id();}
-
- // 複数の SQL ステートメントを実行します
- function muti_query ($query )
- {
- $sq =explode(";n",$query);
- foreach($sq as $s){
- if(trim($s)!= '')$this->query ($s );
- }
- }
- }
-
- // モジュール クラスは、共通の CURD モジュール操作をカプセル化します。すべてのモジュールがこのクラスを継承することをお勧めします。
- class m {
- var $db;
- var $table;
- var $fields;
- var $key;
- function __construct()
- {
- global $db;
- $this->db = $db;
- $this ->key = 'id';
- }
-
- public function __call($name, $arg) {
- return call_user_func_array(array($this, $name), $arg);
- }
-
- // データベースに挿入配列形式のデータ
- function add($elem = FALSE)
- {
- $query_list = array();
- if(!$elem)$elem = $_POST;
- foreach($this->fields as $f) {
- if(isset($elem[$f])){
- $elem[$f] =addslashes($elem[$f]);
- $query_list[] = "`$f` = '$elem[$f] '";
- }
- }
- $this->db->query("insert into `$this->table` set ".implode(',',$query_list));
- return $this-> ;db->insert_id();
- }
-
- // 特定のデータを削除します
- function del($id)
- {
- $this->db->query("delete from `$this-> ;table ` where ".$this->key."='$id'");
- }
-
- // データを更新
- 関数 update($id , $elem = FALSE)
- {
- $query_list = array( );
- if(!$elem)$elem = $_POST;
- foreach($this->fields as $f) {
- if(isset($elem[$f])){
- $elem[$f] = addlashes ($elem[$f]);
- $query_list[] = "`$f` = '$elem[$f]'";
- }
- }
- $this->db->query(" update ` $this->table` set ".implode(',',$query_list)." where ".$this->key." ='$id'" );
- }
-
- // 数量をカウントします
- function count($where='')
- {
- $res = $this->db->query("select count(*) as a from `$this->table` where 1 $where") ;
- return $res[0]['a'];
- }
-
- /* get($id) で 1 つのデータを取得する または
- * get($postquery = '',$cur = 1,$psize = 30) 複数のデータを取得するには
- */
- function get()
- {
- $args = func_get_args();
- if(is_numeric($args[0])) return $this->__call('get_one', $ args);
- return $ this->__call('get_many', $args);
- }
-
- function get_one($id)
- {
- $id = is_numeric($id)?$id:0;
- $res = $this->db->query("select * from `$this->table` where ".$this->key."='$id'");
- if(isset($res) [0]))return $res[0];
- return false;
- }
-
- function get_many($postquery = '',$cur = 1,$psize = 30)
- {
- $cur = $cur > ?$cur:1;
- $start = ($cur - 1) * $psize;
- $query = "select * from `$this->table` where 1 $postquery limit $start , $psize";
- return $this->db ->query($query);
- }
- }
-
コードをコピー
- // すべての設定内容はこのファイルに保持できます
- error_reporting(E_ERROR);
- if(file_exists(APP.'config_user.php')) require(APP.'config_user.php') ;
- //URL ルーティングを設定します
- $route_config = array(
- '/reg/'=>'/user/reg/',
- '/logout/'=>'/user/logout/',
- );
-
- define('BASE','/');
-
- /* データベースはデフォルトで SAE に従って構成されます*/
- $db_config = array(
- 'host'=>SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,
- 'user' =>SAE_MYSQL_USER,
- 'password'=>SAE_MYSQL_PASS,
- 'default_db'=>SAE_MYSQL_DB
-
-
コードをコピー
|