ホームページ >バックエンド開発 >PHPチュートリアル >b2Core: 300 行の php MVC アーキテクチャ

b2Core: 300 行の php MVC アーキテクチャ

WBOY
WBOYオリジナル
2016-07-25 09:07:021246ブラウズ
b2Core は軽量の php MVC フレームワークで、一般的な CRUD やその他の実用的な機能をカプセル化する 300 行のコードを備えています。
最新バージョンのコードをご覧ください。 http://b2core.b24.cn、批判や提案は歓迎です。

このページには、コードの各部分に関する詳細なコメントが含まれています。
フロントエンドリクエストの形式は次のとおりです

http://domain/index.php/controller/method/param1/param2/
または
http://domain/controller/method/param1/param2/
  1. /**
  2. * B2Core は、Brant (brantx@gmail.com) によって開始された PHP ベースの MVC アーキテクチャです
  3. * 中心的なアイデアは、MVC フレームワークに基づいて PHP の柔軟性を最大限に維持することです
  4. * Vision 2.0 (20120515)
  5. **/
  6. define('VERSION','2.0');
  7. // 設定ファイルをロードします: データベース、URL ルーティングなど。
  8. require(APP. 'config.php');
  9. //データベースが構成されている場合は、データベースをロードします
  10. if(isset($db_config)) $db = new db($db_config);
  11. // SAE と互換性のある要求されたアドレスを取得します
  12. $uri = '';
  13. if(isset($_SERVER['PATH_INFO'])) $uri = $_SERVER['PATH_INFO'];
  14. if(isset($_SERVER['ORIG_PATH_INFO'])) $uri = $_SERVER [' ORIG_PATH_INFO'];
  15. if(isset($_SERVER['SCRIPT_URL'])) $uri = $_SERVER['SCRIPT_URL'];
  16. // Magic_Quotes を削除します
  17. if(get_magic_quotes_gpc()) // おそらく削除されるでしょうphp6 で
  18. {
  19. 関数tripslashes_deep($value)
  20. {
  21. $value = is_array($value) ? array_map('stripslashes_deep', $value) : (isset($value) ?tripslashes($value) : null);
  22. return $ value;
  23. }
  24. $_POST = ストリップスラッシュ_ディープ($_POST);
  25. $_GET = ストリップスラッシュ_ディープ($_GET);
  26. $_COOKIE = ストリップスラッシュ_ディープ($_COOKIE);
  27. }
  28. // config で設定された URL ルーティングを実行します。 php
  29. foreach ($route_config as $key => $val)
  30. {
  31. $key = str_replace(':any', '([^/.]+)', str_replace(':num', '([0 -9 ]+)', $key));
  32. if (preg_match('#^'.$key.'#', $uri))$uri = preg_replace('#^'.$key.'#', $val , $uri);
  33. }
  34. // URL 内の各セグメントのパラメータを取得します
  35. $uri = rtrim($uri,'/');
  36. $seg =explode('/',$uri);
  37. $des_dir = $dir = '';
  38. /* コントローラーの上のすべてのディレクトリのアーキテクチャ ファイル __construct.php を順番にロードします
  39. * アーキテクチャ ファイルには、現在のディレクトリにあるすべてのコントローラーの親クラスと関数を含めることができます呼び出す必要があります
  40. */
  41. foreach($seg as $cur_dir)
  42. {
  43. $des_dir.=$cur_dir."/";
  44. if(is_file(APP.'c'.$des_dir.'__construct.php) ')) {
  45. require(APP .'c'.$des_dir.'__construct.php');
  46. $dir .=array_shift($seg).'/';
  47. }
  48. else {
  49. Break;
  50. }
  51. }
  52. /* URLに基​​づいて制御を呼び出します コンテナ内のメソッドが存在しない場合は、404エラーが返されます
  53. * デフォルトのリクエストクラス home->index()
  54. */
  55. $dir = $dir ? :'/';
  56. array_unshift($seg,NULL);
  57. $class = isset($seg[1])?$seg[1]:'home';
  58. $method = isset($seg[2])? $seg[2]:'index';
  59. if(! is_file(APP.'c'.$dir.$class.'.php'))show_404();
  60. require(APP.'c'.$dir. $class.'.php');
  61. if(!class_exists ($class))show_404();
  62. if(!method_exists($class,$method))show_404();
  63. $B2 = new $class();
  64. call_user_func_array(array(&$B2, $method), array_slice ($seg, 3));
  65. /* B2 システム関数
  66. * load($path,$instantiate) は、コントローラー、モデル、ライブラリクラスなど
  67. * $path はクラスファイルの相対アプリです アドレス
  68. * $instantiate が False の場合、ファイルのみが参照され、オブジェクトはインスタンス化されません
  69. * $instantiate が配列の場合、配列の内容はパラメータとしてオブジェクトに渡されます
  70. */
  71. function &load($path, $instantiate = TRUE )
  72. {
  73. $param = FALSE;
  74. if(is_array($instantiate)) {
  75. $param = $instantiate;
  76. $インスタンス化 = TRUE;
  77. }
  78. $file =explode('/',$path);
  79. $class_name = array_pop($file);
  80. $object_name = md5($path);
  81. static $objects = array();
  82. if (isset($objects[$object_name])) return $objects[$object_name];
  83. require( APP.$path.'.php');
  84. if ($instantiate == FALSE) $objects[$object_name] = TRUE;
  85. if($param)$objects[$object_name] = new $class_name($param);
  86. else $objects[$object_name] = new $class_name();
  87. return $objects[$object_name];
  88. }
  89. /* ビュー ファイルを呼び出します
  90. * 関数 view($view,$param = array(),$cache = FALSE)
  91. * $view は、app/v/ ディレクトリを基準としたテンプレート ファイルのアドレスです。 .php ファイルのサフィックスを削除します
  92. * $param 配列内の変数はテンプレート ファイルに渡されます
  93. * $cache = TRUE の場合、ブラウジングとは異なり、出力結果は代わりに string の形式で返されます
  94. */
  95. function view($view,$param = array(),$cache = FALSE)
  96. {
  97. if(!empty($param))extract($param) ;
  98. ob_start();
  99. if(is_file(APP.$view) .'.php')) {
  100. require APP.$view.'.php';
  101. }
  102. else {
  103. echo 'view '.$view.' desn't exit';
  104. return false;
  105. }
  106. //要求された場合はファイルデータを返します
  107. if ($cache === TRUE)
  108. {
  109. $buffer = ob_get_contents();
  110. @ob_end_clean();
  111. return $buffer;
  112. }
  113. }
  114. // URL のフラグメントを取得たとえば、URL は /abc/def/g/ seg(1) = abc
  115. function seg($i)
  116. {
  117. global $seg;
  118. return isset($ seg[$i])?$seg[$ i]:false;
  119. }
  120. // ログを書き込む
  121. function write_log($level = 0 ,$content = 'none')
  122. {
  123. file_put_contents(APP.'log /'.$level.'-'.date( 'Y-m-d').'.log', $content , FILE_APPEND );
  124. }
  125. //404 エラーを表示
  126. function show_404() //404 エラーを表示
  127. {
  128. header("HTTP/1.1 404 Not Found" );
  129. // テンプレート v/404.php を呼び出します
  130. view('v/404');
  131. exit(1);
  132. }
  133. /* B2Core システム クラス*/
  134. // 抽象コントローラー クラス。すべてのコントローラーはこのクラスまたはこのクラスのサブクラスに基づくことをお勧めします
  135. class c {
  136. functionindex()
  137. {
  138. echo "Based on B2 v ".VERSION.";
  139. }
  140. }
  141. // データベース操作クラス
  142. class db {
  143. var $link;
  144. var $last_query;
  145. function __construct($conf)
  146. {
  147. $this->link = mysql_connect($conf['host'],$conf['user'], $conf['password']);
  148. if (!$this->link) {
  149. die('接続できません: ' . mysql_error( ));
  150. return FALSE;
  151. }
  152. $db_selected = mysql_select_db($conf['default_db']);
  153. if (!$db_selected) {
  154. die('使用できません: ' . mysql_error());
  155. }
  156. mysql_query ('set names utf8',$this->link);
  157. }
  158. //クエリクエリを実行し、結果が配列の場合、配列データを返す
  159. function query($query)
  160. {
  161. $ret = array() ;
  162. $this->last_query = $query;
  163. $result = mysql_query($query,$this->link);
  164. if (!$result) {
  165. echo "DB エラー、クエリできませんでしたデータベース";
  166. echo 'MySQL エラー: ' . mysql_error();
  167. echo 'エラー クエリ: ' . $query;
  168. exit;
  169. }
  170. if($result == 1 )return TRUE;
  171. while($record = mysql_fetch_assoc($result ))
  172. {
  173. $ret[] = $record;
  174. }
  175. return $ret;
  176. }
  177. function insert_id() {return mysql_insert_id();}
  178. // 複数の SQL ステートメントを実行します
  179. function muti_query ($query )
  180. {
  181. $sq =explode(";n",$query);
  182. foreach($sq as $s){
  183. if(trim($s)!= '')$this->query ($s );
  184. }
  185. }
  186. }
  187. // モジュール クラスは、共通の CURD モジュール操作をカプセル化します。すべてのモジュールがこのクラスを継承することをお勧めします。
  188. class m {
  189. var $db;
  190. var $table;
  191. var $fields;
  192. var $key;
  193. function __construct()
  194. {
  195. global $db;
  196. $this->db = $db;
  197. $this ->key = 'id';
  198. }
  199. public function __call($name, $arg) {
  200. return call_user_func_array(array($this, $name), $arg);
  201. }
  202. // データベースに挿入配列形式のデータ
  203. function add($elem = FALSE)
  204. {
  205. $query_list = array();
  206. if(!$elem)$elem = $_POST;
  207. foreach($this->fields as $f) {
  208. if(isset($elem[$f])){
  209. $elem[$f] =addslashes($elem[$f]);
  210. $query_list[] = "`$f` = '$elem[$f] '";
  211. }
  212. }
  213. $this->db->query("insert into `$this->table` set ".implode(',',$query_list));
  214. return $this-> ;db->insert_id();
  215. }
  216. // 特定のデータを削除します
  217. function del($id)
  218. {
  219. $this->db->query("delete from `$this-> ;table ` where ".$this->key."='$id'");
  220. }
  221. // データを更新
  222. 関数 update($id , $elem = FALSE)
  223. {
  224. $query_list = array( );
  225. if(!$elem)$elem = $_POST;
  226. foreach($this->fields as $f) {
  227. if(isset($elem[$f])){
  228. $elem[$f] = addlashes ($elem[$f]);
  229. $query_list[] = "`$f` = '$elem[$f]'";
  230. }
  231. }
  232. $this->db->query(" update ` $this->table` set ".implode(',',$query_list)." where ".$this->key." ='$id'" )​​;
  233. }
  234. // 数量をカウントします
  235. function count($where='')
  236. {
  237. $res = $this->db->query("select count(*) as a from `$this->table` where 1 $where") ;
  238. return $res[0]['a'];
  239. }
  240. /* get($id) で 1 つのデータを取得する または
  241. * get($postquery = '',$cur = 1,$psize = 30) 複数のデータを取得するには
  242. */
  243. function get()
  244. {
  245. $args = func_get_args();
  246. if(is_numeric($args[0])) return $this->__call('get_one', $ args);
  247. return $ this->__call('get_many', $args);
  248. }
  249. function get_one($id)
  250. {
  251. $id = is_numeric($id)?$id:0;
  252. $res = $this->db->query("select * from `$this->table` where ".$this->key."='$id'");
  253. if(isset($res) [0]))return $res[0];
  254. return false;
  255. }
  256. function get_many($postquery = '',$cur = 1,$psize = 30)
  257. {
  258. $cur = $cur > ?$cur:1;
  259. $start = ($cur - 1) * $psize;
  260. $query = "select * from `$this->table` where 1 $postquery limit $start , $psize";
  261. return $this->db ->query($query);
  262. }
  263. }
コードをコピー
  1. // すべての設定内容はこのファイルに保持できます
  2. error_reporting(E_ERROR);
  3. if(file_exists(APP.'config_user.php')) require(APP.'config_user.php') ;
  4. //URL ルーティングを設定します
  5. $route_config = array(
  6. '/reg/'=>'/user/reg/',
  7. '/logout/'=>'/user/logout/',
  8. );
  9. define('BASE','/');
  10. /* データベースはデフォルトで SAE に従って構成されます*/
  11. $db_config = array(
  12. 'host'=>SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,
  13. 'user' =>SAE_MYSQL_USER,
  14. 'password'=>SAE_MYSQL_PASS,
  15. 'default_db'=>SAE_MYSQL_DB
コードをコピー

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。