b2Core는 일반적인 CRUD 및 기타 실용적인 기능을 캡슐화하는 300줄의 코드가 포함된 경량 PHP MVC 프레임워크입니다.
최신 버전의 코드를 확인하세요.
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의 유연성을 최대한 유지하는 것이 핵심 아이디어입니다.
- * Vison 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에서는 제거될 수도 있습니다
- {
- function Stripslashes_deep($value)
- {
- $value = is_array($value) ? array_map('stripslashes_deep', $value) : (isset($value) ? Stripslashes($value) : null);
- $value 반환;
- }
- $_POST = Stripslashes_deep($_POST);
- $_GET = Stripslashes_deep($_GET);
- $_COOKIE = Stripslashes_deep($_COOKIE);
- }
- // config.php에 구성된 URL 경로 실행
- 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 = 폭발('/',$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 오류를 반환합니다.
- * 기본 요청은 class home->index()
- */
-
- $dir = $dir ? $dir:'/';
- array_unshift($seg,NULL);
- $class = isset($seg[1])?$seg[ 1]:'집';
- $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;
- $ instantiate = TRUE;
- }
- $file =explod('/',$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];
- }
-
- /* 뷰 파일 호출
- * function view($view,$param = array(),$cache = FALSE)
- * $view는 템플릿 파일의 주소입니다. app/v/ 디렉토리에 상대적입니다. 주소는 .php 파일 접미사를 제거해야 합니다
- * $param 배열의 변수는 템플릿 파일로 전달됩니다.
- * $cache = TRUE인 경우 브라우저 출력과 달리 결과는 문자열
- */
- 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 exsit';
- 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 = ' 없음')
- {
- 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');
- 종료(1);
- }
-
- /* B2Core 시스템 클래스*/
- // 추상 컨트롤러 클래스, 모든 컨트롤러는 이 클래스 또는 이 클래스의 하위 클래스를 기반으로 하는 것이 좋습니다.
- class c {
- 함수 인덱스 ()
- {
- echo "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);
- }
-
- //쿼리 쿼리 실행, 결과가 배열이면 배열 데이터 반환
- 함수 쿼리 ($query )
- {
- $ret = array();
- $this->last_query = $query;
- $result = mysql_query($query,$this->link);
- if (!$result) {
- echo "DB 오류, 데이터베이스를 쿼리할 수 없습니다.";
- echo 'MySQL 오류: ' . mysql_error();
- echo '오류 쿼리: ' $. 쿼리;
- 종료;
- }
- 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 =explod(";n",$query);
- foreach($sq를 $s로){
- if(trim($s) != '')$this->query($s);
- }
- }
- }
-
- // 모듈 클래스는 일반적인 CURD 모듈 작업을 캡슐화하는 것이 좋습니다. 이런 종류를 상속받습니다.
- class m {
- var $db;
- var $table;
- var $fields;
- var $key;
- function __construct()
- {
- 전역 $ db;
- $this->db = $db;
- $this->key = 'id';
- }
-
- 공개 함수 __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] = addlashes($elem[$f]);
- $query_list[] = "`$f` = '$elem[$f ] '";
- }
- }
- $this->db->query("`$this->table` 세트에 삽입 ".implode(',',$query_list)) ;
- return $this->db->insert_id();
- }
-
- // 특정 데이터 삭제
- function del($id)
- {
- $ this->db->query("delete from `$this->table` where ".$this->key."='$id'");
- }
-
- //데이터 업데이트
- function 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("업데이트 `$this ->table`은 ".implode(',',$query_list)."를 설정합니다. 여기서 ".$this->key." );
- }
-
- // Count count
- function count($where='')
- {
- $res = $this->db->query("`$this에서 count(*)를 선택하세요. -> table` where 1 $where");
- return $res[0]['a'];
- }
-
- /* get($id) 데이터 조각 가져오기 또는
- * 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 );
- }
-
- 함수 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 > 0 ?$cur:1;
- $start = ($cur - 1) * $psize;
- $query = "`$this->table`에서 * 선택 $postquery 제한 $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
- )
-
코드 복사
|