この記事では、主に PHP ソース コードでの MVC 構造マイクロ フレームワークの実装について紹介します。これには特定の参考値があります。今、共有します。必要な友人はそれを参照できます。
Main:
定数最適化パス
- #自動読み込みクラス #最適化エントリ ファイル
- Secure Access プロジェクト ディレクトリ
---------------------------------------------------- blog ├─App │ ├─Model 模型 │ │ └─UserModel.class.php 用户模型类 │ ├─View 视图 │ │ ├─Back后台 │ │ │ └─Index │ │ │ └─index.html 后台首页面 │ │ └─Home前台 │ │ └─User 用户视图目录 │ │ └─login.html 登录表单页面 │ ├─Controller 控制器 │ │ ├─Back后台 │ │ │ └─IndexController.class.php 后台首页控制器 │ │ └─Home前台 │ │ └─UserController.class.php 用户控制器 ├─Public 静态公共文件(js,css,images) │ ├─Plugins 插件 │ │ └─layui 前端框架插件 │ ├─Back后台 │ │ ├─js/ js文件 │ │ ├─css/ css样式文件 │ │ └─image img图片 │ └─Home前台 │ ├─js/ js文件 │ ├─css/ css样式文件 │ └─image img图片 ├─Frame 公共使用的类 │ ├─BaseModel.class.php 数据库连接类 │ ├─BaseController.class.php 控制器公共操作(设置编码,信息跳转) │ ├─FactoryModel.class.php 模型工厂类 │ ├─Init.class.php 初始化应用类 │ └─MySQLDB.class.php 数据库操作工具类 └─index.php 入口文件 -----------------------------------------------------------------
##前回の記事では、4 つの質問がありました。この記事では、これら 4 つの問題を解決し、最終的に完全なマイクロ MVC フレームワーク構造を形成することに焦点を当てています。後続のブログ プロジェクトやその他のプロジェクトでは、このフレームワーク構造を開発と学習に直接使用できます。 プロジェクトのソース コードをダウンロードして表示します: https://gitee.com/NewbiesYang/young_blog
定数最適化パス
準備: ブランチの作成
1 $ git checkout master 2 $ git checkout -b "MVC"
# アイデア
1) よく使用されるディレクトリ パスを定数として定義します。モデル ディレクトリ、コントローラ ディレクトリなど。2) クラスを導入し、定義された定数を使用してパスの一部を置き換えます。 include FRAME.BaseModel.class.php など。 3) ビューをロードするときに、定数を使用してパスの一部を置き換えます。たとえば、 include VIEW.'login.html' 単純な形式
コードの実装
step 1: 在入口文件中定义所需要的常量
step 2: 控制器中引入视图时, 使用常量进行优化
操作手順のアイデア
2 ) エントリ ファイルで共通のパス定数を定義します [index.php]1 <?php 2 /** 3 * 入口文件 4 */ 5 $p = !empty($_GET['p']) ? $_GET['p'] : 'Home'; //平台 6 $c = !empty($_GET['c']) ? $_GET['c'] : 'User'; //控制器 7 $a = !empty($_GET['a']) ? $_GET['a'] : 'login'; //动作 8 9 define('PLAT', $p); //平台常量 10 define('CTR', $c); //控制器 11 define('ACTION', $a); //动作 12 13 14 define('DS', DIRECTORY_SEPARATOR); //目录分割符 15 define('ROOT', getcwd().DS); //当前所在目录 项目目录 16 define('FRAME', ROOT.'Frame'.DS); 17 define('APP', ROOT.'App'.DS); 18 define('PUB', ROOT.'Public'.DS); 19 define('ADMIN', PUB.'Admin'.DS); 20 define('HOME', PUB.'Home'.DS); 21 22 //MVC目录 23 define('MODEL', APP.'Model'.DS); 24 define('VIEW', APP.'View'.DS.PLAT.DS.CTR.DS); 25 define('CTRONLLER', APP.'Controller'.DS.PLAT.DS); 26 27 $ctr = $c."Controller"; 28 29 require_once FRAME.'Db.class.php'; //数据库操作类 30 require_once FRAME.'BaseModel.class.php'; //基础模型类 31 require_once MODEL.'UserModel.class.php'; //用户模型类 32 require_once FRAME.'FactoryModel.class.php';//模型工厂类 33 require_once FRAME.'BaseController.class.php'; //基础控制器类 34 require_once CTRONLLER.$ctr.'.class.php'; 35 36 37 //实例化控制器 38 $userCtr = new $ctr(); 39 40 $userCtr -> $a();2) 定数の使用: バックグラウンド ホーム ページ コントローラー [ App/Controller/Admin/IndexController.class .php]
1 <?php 2 /** 3 * IndexController控制器类 4 * 后台相关操作 5 * User: young 6 */ 7 8 class IndexController extends BaseController 9 { 10 //展示后台首页 11 public function index() 12 { 13 include VIEW.'index.html'; 14 } 15 }#バックエンド ホーム ページ コントローラーの紹介ビュー パスの変更
ユーザーコントローラーログインビュー導入パス【 App/Controller/Home/UserController.class.php】
1 <?php
2 /**
3 * UserController.class.php 用户控制器
4 */
5
6 class UserController extends BaseController{
7 /**
8 * 展示登录界面
9 * @access public
10 */
11 public function login()
12 {
13 include VIEW."login.html";
14 }
15 。。。
16 。。。
17 。。。
3) コードを送信します
$ git add -A
$ git commit -m "常量使用"
クラスの自動読み込み
アイデア質問: エントリ ファイルには、require_once によって 6 つのクラスが導入されていますが、1 つ追加すると、別のクラスを導入する必要があるため、見落としやすく、繰り返し、間違いを犯しやすくなります。
解決策: クラス ファイルを自動的にロードする 方法 1: 自動ロード クラス関数 __autoload() を使用して自動ロードを実現する
方法 2: 実際のプロジェクトでは、以下に従って複数人で開発します。実用的なのは、sql_autoload_register() 登録関数を使用して自動的にロードすることです。 ディレクトリの特性に応じて自動ロードを実装します。Model クラス ファイルの特性、Model substr($className,- で終わるクラス名) 5)
コントローラーファイルの特徴: Controller, substr($class,-10)
で終わるクラス名 パブリッククラス: クラス名の統一された形式はありません。パブリッククラスを Fame の下に置くことができます次に、クラスが配列内にあるかどうかを判断し、クラス ファイルをディレクトリに自動的にロードします。
コード実装
1) エントリ ファイルは、自動コードを実装します。クラスのロード
1 <?php
2 /**
3 * 入口文件
4 */
5 $p = !empty($_GET['p']) ? $_GET['p'] : 'Home'; //平台
6 $c = !empty($_GET['c']) ? $_GET['c'] : 'User'; //控制器
7 $a = !empty($_GET['a']) ? $_GET['a'] : 'login'; //动作
8
9 define('PLAT', $p); //平台常量
10 define('CTR', $c); //控制器
11 define('ACTION', $a); //动作
12
13
14 define('DS', DIRECTORY_SEPARATOR); //目录分割符
15 define('ROOT', getcwd().DS); //当前所在目录 项目目录
16 define('FRAME', ROOT.'Frame'.DS);
17 define('APP', ROOT.'App'.DS);
18 define('PUB', ROOT.'Public'.DS);
19 define('ADMIN', PUB.'Admin'.DS);
20 define('HOME', PUB.'Home'.DS);
21
22 //MVC目录
23 define('MODEL', APP.'Model'.DS);
24 define('VIEW', APP.'View'.DS.PLAT.DS.CTR.DS);
25 define('CTRONLLER', APP.'Controller'.DS.PLAT.DS);
26
27 $ctr = $c."Controller";
28
29 spl_autoload_register('autoload'); //注册自动加载函数
30 //自动加载类
31 /**
32 * 实自动加载类文件
33 * @param string $className 类名
34 */
35 function autoload($className)
36 {
37 $upperClassName = strtoupper($className);
38 $frame = array('BaseController','BaseModel','Db','FactoryModel');
39 if(in_array($className, $frame)) { //加载公共Frame目录中的类文件
40 require_once FRAME."$className.class.php";
41 } elseif(substr($upperClassName, -5) == 'MODEL'){ //加载模型Model目录中的类文件
42 require_once MODEL."$className.class.php";
43 } elseif(substr($upperClassName, -10) == 'CONTROLLER'){ //加载控制器目录中的类文件
44 require_once CTRONLLER."$className.class.php";
45 }
46 }
47
48 //实例化控制器
49 $userCtr = new $ctr();
50 $userCtr -> $a();
#2) コードを送信##1 $ git add -A 2 $ git commit -m "自动加载类完成"#エントリ ファイルを最適化
アイデア
# 問題: このとき、エントリ ファイルのコードの断片化が増加し、後続のコードが増加するにつれて、エントリ ファイルはさらに肥大化し、複雑になり、扱いにくくなります。 manage 解決策: エントリ ファイルをカプセル化する この操作はクラスと呼ばれるため、エントリ ファイル内のクラス メソッドを呼び出すだけで済みます。 Init.class.php クラス ファイルを作成し、フレームに取り込むエントリーファイルの操作をすべてクラスにカプセル化する メソッド LoadClass () 自動ロード関数の設定 AutoLOAD () 自動ロードクラス
SetConst () 定数の定義Dispatch ( ) フロントエンド配布デバイス
# コード実装
1) Frame ディレクトリに Init.class.php ファイルを作成し、エントリ ファイル インデックスのコードをコピーして変更します。クラスへ
# [Frame/Init.class.php]
1 <?php 2 /** 3 * 应用初始化操作类 4 * User: young 5 */ 6 7 class Init 8 { 9 protected static $frame = array('BaseController','BaseModel','Db','FactoryModel'); //Frame目录公共操作类 10 public static function run() 11 { 12 //平台 13 self::dispatch(); 14 15 //定义常量 16 self::setConst(); 17 18 //自动加载类 19 self::loadClass(); 20 21 $ctr = CTR."Controller"; //拼接控制器名称 22 23 //实例化控制器 24 $ctrObj = new $ctr(); 25 $a = ACTION; 26 $ctrObj -> $a(); 27 } 28 /** 29 * 设置自动加载类方法 30 */ 31 private static function loadClass() 32 { 33 spl_autoload_register('self::autoload'); 34 } 35 36 /** 37 * 实现自动加载 38 * @param string $className 类名 39 */ 40 private static function autoload($className) 41 { 42 $upperClassName = strtoupper($className); 43 if(in_array($className, static::$frame)) { 44 require_once FRAME."$className.class.php"; 45 } elseif(substr($upperClassName, -5) == 'MODEL'){ 46 require_once MODEL."$className.class.php"; 47 } elseif(substr($upperClassName, -10) == 'CONTROLLER'){ 48 require_once CTRONLLER."$className.class.php"; 49 } 50 } 51 52 /** 53 * 定义常量 54 */ 55 private static function setConst() 56 { 57 define('DS', DIRECTORY_SEPARATOR); //目录分割符 58 define('ROOT', getcwd().DS); 59 define('FRAME', ROOT.'Frame'.DS); 60 define('APP', ROOT.'App'.DS); 61 define('PUB', ROOT.'Public'.DS); 62 define('ADMIN', PUB.'Admin'.DS); 63 define('HOME', PUB.'Home'.DS); 64 65 66 define('MODEL', APP.'Model'.DS); 67 define('VIEW', APP.'View'.DS.PLAT.DS.CTR.DS); 68 define('CTRONLLER', APP.'Controller'.DS.PLAT.DS); 69 } 70 71 /** 72 * 获取 p c a 的GET值,并设置为常量 73 * @return void 74 */ 75 private static function dispatch() 76 { 77 $p = !empty($_GET['p']) ? $_GET['p'] : 'Home'; //平台 78 $c = !empty($_GET['c']) ? $_GET['c'] : 'User'; //控制器 79 $a = !empty($_GET['a']) ? $_GET['a'] : 'login'; //动作 80 81 define('PLAT', $p); 82 define('CTR', $c); 83 define('ACTION', $a); 84 } 85 }
2) エントリ ファイルは初期化クラスを導入し、そのメソッドを呼び出します[index.php]
1 <?php 2 /** 3 * 入口文件 4 */ 5 6 require_once './Frame/Init.class.php'; 7 Init::run();
3) コードを送信
1 $ git add -A 2 $ git commit -m "优化入口文件,封装初始化类"
安全访问项目目录
思路
问题: 此时,项目中所有目录都是可以通过浏览器访问的,如直接访问Frame/Db.class.php文件 直接可以去查看数据库登录信息,显然是不安全的。
解决方法:
方式1: 在可以访问的文件开始处定义常量,访问是判断是否定义常量defined(..), 没有定义指定常量则直接exit('Access Deny');
方式2: 开启分布式权限配置,编写.htaccess文件, 如禁止访问, 将该文件放置在禁止访问的目录中
实现
1)使用上述方式2的形式来实现, 站点配置中加入一项(环境搭建时已经加入了): 详细见: PHP源码搭建博客1-环境搭建
apache配置文件httpd-vhosts.conf 中站点配置
1 #允许分布式权限配置(允许重写)(.htacess) 2 AllowOverride All
2) 重启apache后,编写 .htaccess文件, 该文件内容:
deny from all
3) 将.htaccess文件放置禁止访问的目录中。 如App/ , Frame/ 目录下。只用放在第一层即可,内层目录自动不允许直接访问。
4) 访问测试
小结:
主要实现了 引入路径优化, 类的自动加载, 封装优化入口文件,目录访问限制
MVC微型框架到此基本完成。其实还有很多还是可以继续扩展,如
1, 类文件命名此处都用了 .class.php结尾, 实质可以优化直接使用.php结尾
2, 引入命名空间,更方便的加载类
3, 项目中出现错误,此时是直接显示在浏览器上的, 可以写一个日志类,发生错误写入文件或数据库都可
4, 数据库连接信息此处是直接写在DB类和BaseModel中了, 是不安全的。 可以创建一个配置目录,将这些信息写入配置文件,再写一个加载配置文件的类。
5. 此架构目录 ,是在C,V中分平台,如Controller/Home, Controller/Admin; 实际也可以写成 平台下分MVC结构, 如Admin/Controller, Admin/Model, Home/Controller,Home/View .. 这个是比较灵活的,可以根据需求选择更加合适的方式
实际上线项目,还是建议使用框架,安全快捷; 自己模仿定义的框架结构适合学习研究使用,容易遗漏,造成安全隐患,操作不便等问题
下一步:根据博客前端模板,分析创建数据表, 开始搭建博客后台程序,后续首先准备实现 “分类模块”。既分类的展示,修改,添加,删除功能
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!
相关推荐:
以上がMVC構造のマイクロフレームワークを実装するためのPHPソースコードの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

PHPロギングは、Webアプリケーションの監視とデバッグ、および重要なイベント、エラー、ランタイムの動作をキャプチャするために不可欠です。システムのパフォーマンスに関する貴重な洞察を提供し、問題の特定に役立ち、より速いトラブルシューティングをサポートします

Laravelは、直感的なフラッシュメソッドを使用して、一時的なセッションデータの処理を簡素化します。これは、アプリケーション内に簡単なメッセージ、アラート、または通知を表示するのに最適です。 データは、デフォルトで次の要求のためにのみ持続します。 $リクエスト -

PHPクライアントURL(CURL)拡張機能は、開発者にとって強力なツールであり、リモートサーバーやREST APIとのシームレスな対話を可能にします。尊敬されるマルチプロトコルファイル転送ライブラリであるLibcurlを活用することにより、PHP Curlは効率的なexecuを促進します

Laravelは簡潔なHTTP応答シミュレーション構文を提供し、HTTP相互作用テストを簡素化します。このアプローチは、テストシミュレーションをより直感的にしながら、コード冗長性を大幅に削減します。 基本的な実装は、さまざまな応答タイプのショートカットを提供します。 Illuminate \ support \ facades \ httpを使用します。 http :: fake([[ 'google.com' => 'hello world'、 'github.com' => ['foo' => 'bar']、 'forge.laravel.com' =>

顧客の最も差し迫った問題にリアルタイムでインスタントソリューションを提供したいですか? ライブチャットを使用すると、顧客とのリアルタイムな会話を行い、すぐに問題を解決できます。それはあなたがあなたのカスタムにより速いサービスを提供することを可能にします

記事では、PHP 5.3で導入されたPHPの後期静的結合(LSB)について説明し、より柔軟な継承を求める静的メソッドコールのランタイム解像度を可能にします。 LSBの実用的なアプリケーションと潜在的なパフォーマ

この記事では、フレームワークにカスタム機能を追加し、アーキテクチャの理解、拡張ポイントの識別、統合とデバッグのベストプラクティスに焦点を当てています。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

mPDF
mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

ホットトピック



