>  기사  >  백엔드 개발  >  b2Core: 300줄의 PHP MVC 아키텍처

b2Core: 300줄의 PHP MVC 아키텍처

WBOY
WBOY원래의
2016-07-25 09:07:021213검색
b2Core는 일반적인 CRUD 및 기타 실용적인 기능을 캡슐화하는 300줄의 코드가 포함된 경량 PHP MVC 프레임워크입니다.
최신 버전의 코드를 확인하세요. 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. * Vison 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. function Stripslashes_deep($value)
  20. {
  21. $value = is_array($value) ? array_map('stripslashes_deep', $value) : (isset($value) ? Stripslashes($value) : null);
  22. $value 반환;
  23. }
  24. $_POST = Stripslashes_deep($_POST);
  25. $_GET = Stripslashes_deep($_GET);
  26. $_COOKIE = Stripslashes_deep($_COOKIE);
  27. }
  28. // config.php에 구성된 URL 경로 실행
  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 = 폭발('/',$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. * 기본 요청은 class home->index()
  54. */
  55. $dir = $dir ? $dir:'/';
  56. array_unshift($seg,NULL);
  57. $class = isset($seg[1])?$seg[ 1]:'집';
  58. $method = isset($seg[2])?$seg[2]:'index'; >if(!is_file(APP.'c'.$dir.$ class.'.php'))show_404();
  59. require(APP.'c'.$dir.$class.'.php') ;
  60. if(!class_exists($class))show_404() ;
  61. if(!method_exists($class,$method))show_404();
  62. $B2 = new $class();
  63. call_user_func_array(array(&$B2, $method), array_slice($ seg, 3));
  64. /* B2 시스템 함수
  65. * load($path,$instantiate)는 동적으로 객체를 로드할 수 있습니다. 컨트롤러, 모델, 라이브러리 클래스 등
  66. * $ path는 앱을 기준으로 한 클래스 파일의 주소입니다.
  67. * $instantiate가 False인 경우 파일만 참조하고 객체는 인스턴스화하지 않습니다.
  68. * $instantiate가 배열인 경우 배열 내용이 매개변수로 객체에 전달됩니다.
  69. */
  70. function &load($path, $instantiate = TRUE )
  71. {
  72. $param = FALSE;
  73. if(is_array($instantiate)) {
  74. $param = $instantiate;
  75. $ instantiate = TRUE;
  76. }
  77. $file =explod('/',$path );
  78. $class_name = array_pop($file);
  79. $object_name = md5($path);
  80. static $objects = array();
  81. if (isset($objects[ $object_name])) return $objects[$object_name];
  82. require(APP.$path.'.php') ;
  83. if ($instantiate == FALSE) $objects[$object_name] = TRUE;
  84. if($param)$objects[$object_name] = new $class_name($param);
  85. else $objects [$object_name] = new $class_name();
  86. return $objects[$object_name];
  87. }
  88. /* 뷰 파일 호출
  89. * function view($view,$param = array(),$cache = FALSE)
  90. * $view는 템플릿 파일의 주소입니다. app/v/ 디렉토리에 상대적입니다. 주소는 .php 파일 접미사를 제거해야 합니다
  91. * $param 배열의 변수는 템플릿 파일로 전달됩니다.
  92. * $cache = TRUE인 경우 브라우저 출력과 달리 결과는 문자열
  93. */
  94. function view($view,$param = array(),$cache = FALSE)
  95. {
  96. if(!empty($param) 형식으로 반환됩니다. ))extract($param);
  97. ob_start();
  98. if(is_file(APP.$view.'.php')) {
  99. require APP.$view.'.php';
  100. }
  101. else {
  102. echo 'view '.$view.' desn't exsit';
  103. return false;
  104. }
  105. // 요청하면 파일 데이터를 반환합니다
  106. if ($cache === TRUE)
  107. {
  108. $buffer = ob_get_contents();
  109. @ob_end_clean();
  110. return $buffer
  111. }
  112. }
  113. // URL 조각을 가져옵니다. 예를 들어 URL은 /abc/def/g/ seg(1) = abc
  114. function seg($i)
  115. {
  116. global $seg;
  117. return isset($seg[$i])?$seg[$i]:false;
  118. }
  119. // 로그 쓰기
  120. function write_log ($level = 0 ,$content = ' 없음')
  121. {
  122. file_put_contents(APP.'log/'.$level.'-'.date('Y-m-d').'.log', $content , FILE_APPEND );
  123. }
  124. //404 오류 표시
  125. function show_404() //404 오류 표시
  126. {
  127. header("HTTP/1.1 404 Not Found" );
  128. // 템플릿 v 호출 /404.php
  129. view('v/404');
  130. 종료(1);
  131. }
  132. /* B2Core 시스템 클래스*/
  133. // 추상 컨트롤러 클래스, 모든 컨트롤러는 이 클래스 또는 이 클래스의 하위 클래스를 기반으로 하는 것이 좋습니다.
  134. class c {
  135. 함수 인덱스 ()
  136. {
  137. echo "B2 v".VERSION."을 기반으로 생성됨.";
  138. }
  139. }
  140. // 데이터베이스 작업 클래스
  141. class db {
  142. var $link;
  143. var $last_query;
  144. function __construct($conf)
  145. {
  146. $this->link = mysql_connect($conf['host'],$conf['user' ], $conf['password']);
  147. if (!$this->link) {
  148. die('연결할 수 없습니다: ' . mysql_error());
  149. return FALSE;
  150. }
  151. $db_selected = mysql_select_db($conf['default_db']);
  152. if (!$db_selected) {
  153. die('사용할 수 없습니다: ' . mysql_error());
  154. }
  155. mysql_query('set names utf8',$this->link);
  156. }
  157. //쿼리 쿼리 실행, 결과가 배열이면 배열 데이터 반환
  158. 함수 쿼리 ($query )
  159. {
  160. $ret = array();
  161. $this->last_query = $query;
  162. $result = mysql_query($query,$this->link);
  163. if (!$result) {
  164. echo "DB 오류, 데이터베이스를 쿼리할 수 없습니다.";
  165. echo 'MySQL 오류: ' . mysql_error();
  166. echo '오류 쿼리: ' $. 쿼리;
  167. 종료;
  168. }
  169. if($result == 1 )return TRUE;
  170. while($record = mysql_fetch_assoc($result))
  171. {
  172. $ret[] = $record ;
  173. }
  174. return $ret;
  175. }
  176. function insert_id() {return mysql_insert_id();}
  177. // 여러 SQL 문 실행
  178. function muti_query($query)
  179. {
  180. $sq =explod(";n",$query);
  181. foreach($sq를 $s로){
  182. if(trim($s) != '')$this->query($s);
  183. }
  184. }
  185. }
  186. // 모듈 클래스는 일반적인 CURD 모듈 작업을 캡슐화하는 것이 좋습니다. 이런 종류를 상속받습니다.
  187. class m {
  188. var $db;
  189. var $table;
  190. var $fields;
  191. var $key;
  192. function __construct()
  193. {
  194. 전역 $ db;
  195. $this->db = $db;
  196. $this->key = 'id';
  197. }
  198. 공개 함수 __call($name, $arg) {
  199. return call_user_func_array(array($this, $name), $arg);
  200. }
  201. // 배열 형식 데이터를 데이터베이스에 삽입
  202. function add($elem = FALSE)
  203. {
  204. $query_list = array();
  205. if(!$elem)$elem = $_POST;
  206. foreach($this->fields as $f) {
  207. if(isset ( $elem[$f])){
  208. $elem[$f] = addlashes($elem[$f]);
  209. $query_list[] = "`$f` = '$elem[$f ] '";
  210. }
  211. }
  212. $this->db->query("`$this->table` 세트에 삽입 ".implode(',',$query_list)) ;
  213. return $this->db->insert_id();
  214. }
  215. // 특정 데이터 삭제
  216. function del($id)
  217. {
  218. $ this->db->query("delete from `$this->table` where ".$this->key."='$id'");
  219. }
  220. //데이터 업데이트
  221. function update($id , $elem = FALSE)
  222. {
  223. $query_list = array();
  224. if(!$elem)$elem = $_POST;
  225. foreach($this->fields as $f) {
  226. if(isset($elem[$f])){
  227. $elem[$f] = addlashes($elem[$f] );
  228. $query_list[] = "`$f` = '$elem[$f]'";
  229. }
  230. }
  231. $this->db->query("업데이트 `$this ->table`은 ".implode(',',$query_list)."를 설정합니다. 여기서 ".$this->key." );
  232. }
  233. // Count count
  234. function count($where='')
  235. {
  236. $res = $this->db->query("`$this에서 count(*)를 선택하세요. -> table` where 1 $where");
  237. return $res[0]['a'];
  238. }
  239. /* get($id) 데이터 조각 가져오기 또는
  240. * get ($postquery = '',$cur = 1,$psize = 30) 여러 데이터 조각 가져오기
  241. */
  242. function get()
  243. {
  244. $args = func_get_args ();
  245. if(is_numeric($args[0])) return $this->__call('get_one', $args);
  246. return $this->__call('get_many', $args );
  247. }
  248. 함수 get_one($id)
  249. {
  250. $id = is_numeric($id)?$id:0;
  251. $res = $this-> db->query( "select * from `$this->table` where ".$this->key."='$id'");
  252. if(isset($res[0]) )return $res[0 ];
  253. return false;
  254. }
  255. function get_many($postquery = '',$cur = 1,$psize = 30)
  256. {
  257. $cur = $cur > 0 ?$cur:1;
  258. $start = ($cur - 1) * $psize;
  259. $query = "`$this->table`에서 * 선택 $postquery 제한 $start , $psize";
  260. return $this->db->query($query);
  261. }
  262. }
복사 코드
  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
  16. )
코드 복사


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.