超シンプルなPHPMVC

WBOY
リリース: 2016-07-25 08:47:44
オリジナル
1731 人が閲覧しました
ネイティブ PHP 構文を使用してページをレンダリングし、ウィジェット機能を提供します。
  1. /**
  2. * 設定パラメータの取得と設定はバッチ定義をサポートします
  3. * $key が連想配列の場合、設定は K-V の形式で書き込まれます
  4. * $key が数値インデックス配列の場合、対応する設定配列が返されます
  5. * @param string |array $key 設定変数
  6. * @param array|null $value 設定値
  7. * @return array|null
  8. */
  9. function C($key,$value=null){
  10. static $_config = array();
  11. $args = func_num_args();
  12. if( $args == 1){
  13. if(is_string($key)){ //受信キーが文字列の場合
  14. return isset($_config[$key])?$_config[$key]:null;
  15. }
  16. if(is_array($key)){
  17. if(array_keys($key) !== range(0, count($key) - 1)){ //受信キーが連想配列の場合
  18. $_config = array_merge ( $_config, $key);
  19. }else{
  20. $ret = array();
  21. foreach ($key as $k) {
  22. $ret[$k] = isset($_config[$k])?$_config [ $k]:null;
  23. }
  24. return $ret;
  25. }
  26. }
  27. }else{
  28. if(is_string($key)){
  29. $_config[$key] = $value;
  30. }else{
  31. halt( '渡されたパラメータが正しくありません');
  32. }
  33. }
  34. return null;
  35. }
  36. /**
  37. * ウィジェットを呼び出す
  38. * @param string $name ウィジェット名
  39. * @param array $data ウィジェットに渡される変数リスト、キーは変数名、値は変数値です
  40. * @return void
  41. */
  42. function W($name, $data = array()){
  43. $fullName = $name. 'ウィジェット';
  44. if(!class_exists($fullName)){
  45. halt('ウィジェット '.$name.' は存在しません');
  46. }
  47. $widget = new $fullName();
  48. $widget-> invoke ($data);
  49. }
  50. /**
  51. * プログラムの実行を終了します
  52. * @param string $str 終了理由
  53. * @param bool $display コールスタックを表示するかどうか、デフォルトでは表示されません
  54. * @return void
  55. */
  56. function halt($str, $display=false){
  57. Log::fatal($str.' debug_backtrace:'.var_export(debug_backtrace(), true ));
  58. header("Content-Type:text/html; charset=utf-8");
  59. if($display){
  60. echo "
    ";
  61. debug_print_backtrace();
  62. echo "< / pre>";
  63. }
  64. echo $str;
  65. exit;
  66. }
  67. /**
  68. * データベース インスタンスを取得します
  69. * @return DB
  70. */
  71. function M(){
  72. $dbConf = C(array('DB_HOST','DB_PORT','DB_USER ' ,'DB_PWD','DB_NAME','DB_CHARSET'));
  73. return DB::getInstance($dbConf);
  74. }
  75. /**
  76. * ファイルが存在する場合は、それを含めます
  77. * @param string $path ファイルパス
  78. * @return void
  79. */
  80. function includeIfExist($path){
  81. if(file_exists ( $path)){
  82. include $path;
  83. }
  84. }
  85. /**
  86. * 一般管理カテゴリ
  87. */
  88. class SinglePHP {
  89. /**
  90. * コントローラー
  91. * @var string
  92. */
  93. private $c;
  94. /**
  95. * アクション
  96. * @var string
  97. * /
  98. private $a;
  99. /**
  100. * シングルトン
  101. * @var SinglePHP
  102. */
  103. private static $_instance;
  104. /**
  105. * コンストラクター、初期化構成
  106. * @param array $conf
  107. */
  108. private function __construct($conf){
  109. C($conf);
  110. }
  111. private function __clone(){}
  112. /**
  113. * シングルトンを取得します
  114. * @param array $conf
  115. * @return SinglePHP
  116. */
  117. public static function getInstance($conf){
  118. if(!(self::$_instance instanceof self)){
  119. self::$_instance = new self( $ conf);
  120. }
  121. return self::$_instance;
  122. }
  123. /**
  124. * アプリケーションインスタンスを実行します
  125. * @access public
  126. * @return void
  127. */
  128. public function run(){
  129. if(C('USE_SESSION') == true){
  130. session_start() ;
  131. }
  132. C('APP_FULL_PATH', getcwd().'/'.C('APP_PATH').'/');
  133. includeIfExist( C('APP_FULL_PATH').'/common.php');
  134. $ pathMod = C('PATH_MOD');
  135. $pathMod = empty($pathMod)?'NORMAL':$pathMod;
  136. spl_autoload_register(array('SinglePHP', 'autoload'));
  137. if(strcmp(strtoupper($pathMod) ) ,'NORMAL') === 0 || !isset($_SERVER['PATH_INFO'])){
  138. $this->c = isset($_GET['c'])?$_GET['c' ] :'インデックス';
  139. $this->a = isset($_GET['a'])?$_GET['a']:'インデックス';
  140. }else{
  141. $pathInfo = isset($_SERVER[ ' PATH_INFO'])?$_SERVER['PATH_INFO']:'';
  142. $pathInfoArr =explode('/',trim($pathInfo,'/'));
  143. if(isset($pathInfoArr[0]) && $ pathInfoArr[0] !== ''){
  144. $this->c = $pathInfoArr[0];
  145. }else{
  146. $this->c = 'インデックス';
  147. }
  148. if(isset($ pathInfoArr [1])){
  149. $this->a = $pathInfoArr[1];
  150. }else{
  151. $this->a = 'インデックス';
  152. }
  153. }
  154. if(!class_exists($this- > ;c.'コントローラー')){
  155. halt('コントローラー'.$this->c.'存在しません');
  156. }
  157. $controllerClass = $this->c.'コントローラー';
  158. $ controller = new $controllerClass();
  159. if(!method_exists($controller, $this->a.'Action')){
  160. halt('method'.$this->a.'存在しません') ;
  161. }
  162. call_user_func(array($controller,$this->a.'Action'));
  163. }
  164. /**
  165. * 自動読み込み機能
  166. * @param string $class クラス名
  167. */
  168. パブリック静的関数 autoload($class){
  169. if(substr( $class ,-10)=='Controller'){
  170. includeIfExist(C('APP_FULL_PATH').'/Controller/'.$class.'.class.php');
  171. }elseif(substr($class,- 6) =='ウィジェット'){
  172. includeIfExist(C('APP_FULL_PATH').'/Widget/'.$class.'.class.php');
  173. }else{
  174. includeIfExist(C('APP_FULL_PATH').'/Lib/'.$class.'.class.php');
  175. }
  176. }
  177. }
  178. /**
  179. * コントローラークラス
  180. */
  181. クラス コントローラー {
  182. / **
  183. * インスタンスを表示
  184. * @var View
  185. */
  186. プライベート $_view;
  187. /**
  188. * コンストラクター、ビューインスタンスの初期化、フックの呼び出し
  189. */
  190. パブリック関数 __construct(){
  191. $this->_view = new View();
  192. $this->_init() ;
  193. }
  194. /**
  195. * プリフック
  196. */
  197. 保護関数 _init(){}
  198. /**
  199. * テンプレートをレンダリングして出力します
  200. * @param null|string $tpl テンプレート ファイル パス
  201. * パラメータは、App/View/file に対する相対パスであり、index/index などのサフィックス名は含まれません
  202. * Ifパラメータが空の場合、デフォルトで $controller/$action.php が使用されます
  203. * パラメータに「/」が含まれていない場合、デフォルトで $controller/$tpl が使用されます
  204. * @return void
  205. */
  206. 保護関数 display($tpl=''){
  207. if($tpl === ' '){
  208. $trace = debug_backtrace();
  209. $controller = substr($trace[1]['class'], 0, -10);
  210. $action = substr($trace[1]['function'] , 0 , -6);
  211. $tpl = $controller 。 '/' 。 $action;
  212. }elseif(strpos($tpl, '/') === false){
  213. $trace = debug_backtrace();
  214. $controller = substr($trace[1]['class'], 0, - 10);
  215. $tpl = $controller 。 '/' 。 $tpl;
  216. }
  217. $this->_view->display($tpl);
  218. }
  219. /**
  220. * ビューエンジンのテンプレート変数を設定します
  221. * @param string $name テンプレートで使用する変数名
  222. * @parammixed $value テンプレート内の変数名に対応する値
  223. * @return void
  224. */
  225. 保護関数 assign($name,$value){
  226. $this-> _view->assign($name,$value);
  227. }
  228. /**
  229. * データをjson形式でブラウザに出力し、コードの実行を停止します
  230. * @param array $data 出力するデータ
  231. */
  232. 保護関数 ajaxReturn($data){
  233. echo json_encode($data);
  234. exit;
  235. }
  236. /**
  237. * 指定したURLにリダイレクトします
  238. * @param string $url リダイレクト先のURL
  239. * @param void
  240. */
  241. 保護された関数 redirect($url){
  242. header("Location: $url");
  243. exit;
  244. }
  245. }
  246. /**
  247. *クラスを見る
  248. */
  249. class View {
  250. /**
  251. * ファイルディレクトリを表示
  252. * @var string
  253. */
  254. private $_tplDir;
  255. /**
  256. * ファイルパスを表示
  257. * @var string
  258. */
  259. private $_viewPath;
  260. /**
  261. * 変数リストを表示
  262. * @var array
  263. */
  264. private $_data = array();
  265. /**
  266. * tplInclude の変数リスト
  267. * @var array
  268. */
  269. private static $tmpData;
  270. /**
  271. * @パラメータ文字列 $tplDir
  272. */
  273. public function __construct($tplDir=''){
  274. if($tplDir == ''){
  275. $this->_tplDir = './' .C('APP_PATH').'/View/';
  276. }else{
  277. $this->_tplDir = $tplDir;
  278. }
  279. }
  280. /**
  281. * ビューエンジンのテンプレート変数を設定します
  282. * @param string $key テンプレートで使用する変数名
  283. * @parammixed $value テンプレート内の変数名に対応する値
  284. * @return void
  285. */
  286. public function assign($key, $value) {
  287. $this->_data[$key] = $value;
  288. }
  289. /**
  290. * テンプレートをレンダリングして出力します
  291. * @param null|string $tplFile テンプレート ファイル パス、App/View/file への相対パス、index/index などのサフィックス名は含まれません
  292. * @return void
  293. */
  294. public function display($tplFile) {
  295. $this->_viewPath = $this- > _tplDir 。 $tplFile 。 '.php';
  296. unset($tplFile);
  297. extract($this->_data);
  298. include $this->_viewPath;
  299. }
  300. /**
  301. * テンプレート ファイルに他のテンプレートを含めるために使用されます
  302. * @param string $path View ディレクトリへの相対パス
  303. * @param array $data サブテンプレートに渡される変数リスト、キーは変数名、値は変数値
  304. * @return void
  305. */
  306. public static function tplInclude($ path, $data=array()){
  307. self::$tmpData = array(
  308. 'path' => C('APP_FULL_PATH') . '/View/' . $path . '.php',
  309. 'data ' => $data,
  310. );
  311. unset($path);
  312. unset($data);
  313. extract(self::$tmpData['data']);
  314. include self::$tmpData['path' ];
  315. }
  316. }
  317. /**
  318. * Widgetクラス
  319. * 使用する場合は、このクラスを継承し、invokeメソッドをオーバーライドし、invokeメソッド内でdisplayを呼び出す必要があります
  320. */
  321. クラス ウィジェット {
  322. /**
  323. * インスタンスを表示
  324. * @var View
  325. */
  326. protected $_view;
  327. /**
  328. * ウィジェット名
  329. * @var string
  330. */
  331. protected $_widgetName;
  332. /* *
  333. * コンストラクター、ビューインスタンスを初期化します
  334. */
  335. パブリック関数 __construct(){
  336. $this->_widgetName = get_class($this);
  337. $dir = C('APP_FULL_PATH') 。 '/Widget/Tpl/';
  338. $this->_view = new View($dir);
  339. }
  340. /**
  341. * 処理ロジック
  342. * @param 混合 $data パラメーター
  343. */
  344. public function invoke($data){}
  345. /**
  346. * テンプレートをレンダリングします
  347. * @param string $tpl テンプレート パス、空の場合は、クラス名をテンプレート名として使用します
  348. */
  349. 保護された関数 display($tpl=''){
  350. if($tpl == ''){
  351. $tpl = $this->_widgetName;
  352. }
  353. $this->_view->display ($tpl);
  354. }
  355. /**
  356. * ビューエンジンのテンプレート変数を設定します
  357. * @param string $name テンプレートで使用する変数名
  358. * @parammixed $value テンプレート内の変数名に対応する値
  359. * @return void
  360. */
  361. 保護関数 assign($name,$value){
  362. $this->_view->assign($name,$value);
  363. }
  364. }
  365. /**
  366. * データベース操作クラス
  367. * 使用方法:
  368. * DB::getInstance($conf)->query('select * from table');
  369. * $conf は、次のキーを含む必要がある連想配列です。
  370. * DB_HOST DB_USER DB_PWD DB_NAME
  371. * DB_PORT と DB_CHARSET を使用してポートとエンコーディングを指定できます。デフォルトは 3306 と utf8 です。*/
  372. クラス DB {
  373. /**
  374. * データベースリンク
  375. * @var リソース
  376. */
  377. private $_db;
  378. /**
  379. * 最後の SQL を保存します
  380. * @var string
  381. */
  382. private $_lastSql;
  383. /**
  384. * 最後の SQL ステートメントによって影響を受ける行数
  385. * @var int
  386. */
  387. private $_rows;
  388. /**
  389. * 最後の SQL 実行でエラーが発生しました
  390. * @var string
  391. */
  392. private $_error;
  393. /**
  394. * インスタンス配列
  395. * @var 配列
  396. */
  397. private static $_instance = array();
  398. /**
  399. * コンストラクター
  400. * @param array $dbConf 構成配列
  401. */
  402. private 関数__construct($dbConf){
  403. if(!isset($dbConf['DB_CHARSET'])){
  404. $dbConf['DB_CHARSET'] = 'utf8';
  405. }
  406. $this->_db = mysql_connect($dbConf[ 'DB_HOST'].':'.$dbConf['DB_PORT'],$dbConf['DB_USER'],$dbConf['DB_PWD']);
  407. if($this->_db === false){
  408. halt(mysql_error());
  409. }
  410. $selectDb = mysql_select_db($dbConf['DB_NAME'],$this->_db);
  411. if($selectDb === false){
  412. halt(mysql_error());
  413. }
  414. mysql_set_charset($dbConf['DB_CHARSET']);
  415. }
  416. プライベート関数 __clone(){}
  417. /**
  418. * DBクラスを取得
  419. * @param array $dbConf設定配列
  420. * @return DB
  421. */
  422. 静的パブリック関数 getInstance($dbConf){
  423. if(!isset($ dbConf['DB_PORT'])){
  424. $dbConf['DB_PORT'] = '3306';
  425. }
  426. $key = $dbConf['DB_HOST'].':'.$dbConf['DB_PORT'];
  427. if (!isset(self::$_instance[$key]) || !(self::$_instance[$key]instanceofself)){
  428. self::$_instance[$key] = 新しい self($dbConf);
  429. }
  430. return self::$_instance[$key];
  431. }
  432. /**
  433. * エスケープされた文字列
  434. * @param string $str エスケープされる文字列
  435. * @return string エスケープされた文字列
  436. */
  437. public functionescape($str){
  438. return mysql_real_escape_string($str, $this->_db);
  439. }
  440. /**
  441. * クエリ、select ステートメントに使用されます
  442. * @param string $sql クエリ対象の SQL
  443. * @return bool|array クエリが成功した場合は、対応する配列を返し、失敗した場合は false を返します
  444. */
  445. パブリック関数クエリ($sql){
  446. $this->_rows = 0;
  447. $this->_error = '';
  448. $this->_lastSql = $sql ;
  449. $this->logSql();
  450. $res = mysql_query($sql,$this->_db);
  451. if($res === false){
  452. $this->_error = mysql_error($ this->_db);
  453. $this->logError();
  454. return false;
  455. }else{
  456. $this->_rows = mysql_num_rows($res);
  457. $result = array();
  458. if( $this->_rows >0) {
  459. while($row = mysql_fetch_array($res, MYSQL_ASSOC)){
  460. $result[] = $row;
  461. }
  462. mysql_data_seek($res,0);
  463. }
  464. return $result;
  465. }
  466. }
  467. /**
  468. * クエリ、insert/update/delete ステートメントに使用されます
  469. * @param string $sql クエリ対象の SQL
  470. * @return bool|int クエリが成功した場合は影響を受けたレコードの数を返し、失敗した場合は返されます偽
  471. */
  472. public functionexecute($sql) {
  473. $this->_rows = 0;
  474. $this->_error = '';
  475. $this- >_lastSql = $sql;
  476. $this->logSql();
  477. $result = mysql_query($sql, $this->_db) ;
  478. if ( false === $result) {
  479. $this-> ;_error = mysql_error($this->_db);
  480. $this->logError();
  481. return false;
  482. } else {
  483. $this->_rows = mysql_affected_rows($this->_db);
  484. return $this->_rows;
  485. }
  486. }
  487. /**
  488. * 最後のクエリによって影響を受けたレコードの数を取得します
  489. * @return int 影響を受けたレコードの数
  490. */
  491. public function getRows(){
  492. return $this->_rows;
  493. }
  494. /**
  495. * 最後の挿入後に生成された自動インクリメント ID を取得します
  496. * @return int 自動インクリメント ID
  497. */
  498. public function getInsertId() {
  499. return mysql_insert_id($this->_db);
  500. }
  501. /**
  502. * 最後のクエリの SQL を取得します
  503. * @return string sql
  504. */
  505. public function getLastSql(){
  506. return $this->_lastSql;
  507. }
  508. /**
  509. * 最後のクエリのエラー情報を取得します
  510. * @return string エラー情報
  511. */
  512. パブリック関数 getError(){
  513. return $this->_error;
  514. }
  515. /**
  516. * SQLをファイルに記録します
  517. */
  518. プライベート関数 logSql(){
  519. Log::sql($this-> _lastSql);
  520. }
  521. /**
  522. * エラーログをファイルに記録します
  523. */
  524. プライベート関数 logError(){
  525. $str = '[SQL ERR]'.$this->_error.' SQL:'.$this->_lastSql;
  526. Log::warn($str);
  527. }
  528. }
  529. /**
  530. * ログクラス
  531. * 使用方法: Log::fatal('error msg');
  532. * 保存パスは App/Log で、日ごとに保存されます
  533. * Fatal と警告は .log.wf ファイルに記録されます
  534. */
  535. class Log{
  536. /**
  537. * ログ、SAE 環境をサポート
  538. * @param string $msg ログの内容
  539. * @param string $level ログレベル
  540. * @param bool $wf エラーログかどうか
  541. */
  542. public static function write($msg, $level='DEBUG', $wf=false){
  543. if(function_exists('sae_debug')){ //如果是SAE,则使用sae_debug関数数打日志
  544. $msg = "[{$ level}]".$msg;
  545. sae_set_display_errors(false);
  546. sae_debug(trim($msg));
  547. sae_set_display_errors(true);
  548. }else{
  549. $msg = date('[ Y-m-d H:i:s ]' )."[{$level}]".$msg."rn";
  550. $logPath = C('APP_FULL_PATH').'/Log/'.date('Ymd').'.log';
  551. if($wf){
  552. $logPath . = '.wf';
  553. }
  554. file_put_contents($logPath, $msg, FILE_APPEND);
  555. }
  556. }
  557. /**
  558. * 致命的なログを出力します
  559. * @param string $msg ログ情報
  560. */
  561. public static function fat($msg){
  562. self::write($ msg, 'FATAL', true);
  563. }
  564. /**
  565. * 警告ログを出力します
  566. * @param string $msg ログ情報
  567. */
  568. public static function warn($msg){
  569. self::write($msg, 'WARN', true);
  570. }
  571. / **
  572. * 通知ログを印刷します
  573. * @param string $msg ログ情報
  574. */
  575. パブリック静的関数の通知($msg){
  576. self::write($msg, 'NOTICE');
  577. }
  578. /**
  579. * デバッグログを出力します
  580. * @param string $msg ログ情報
  581. */
  582. パブリック静的関数のデバッグ($msg) ){
  583. self::write($msg, 'DEBUG');
  584. }
  585. /**
  586. * SQL ログを出力します
  587. * @param string $msg ログ情報
  588. */
  589. パブリック静的関数 sql($msg){
  590. self::write($msg, 'SQL') ;
  591. }
  592. }
  593. /**
  594. * ExtException クラス、追加の例外情報を記録します
  595. */
  596. class ExtException extends Exception{
  597. /**
  598. * @var 配列
  599. */
  600. protected $extra;
  601. /**
  602. * @param string $message
  603. * @param array $extra
  604. * @param int $code
  605. * @param null $previous
  606. */
  607. public function __construct($message = "", $extra = array(), $code = 0, $previous = null){
  608. $this->extra = $extra;
  609. parent::__construct($message, $code, $previous);
  610. }
  611. /**
  612. * 追加の例外情報を取得します
  613. * @return array
  614. */
  615. public function getExtra(){
  616. return $this->extra;
  617. }
  618. }
复制代


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート