導入:
1.1 PHP は、Web インターフェイスの迅速な開発に適しており、その構文の単純さと開発速度により多くのユーザーを魅了し、一時はプログラミング言語のトップ 5 を占めました。急速な発展に伴い、多くの優れたフレームワークが登場しましたが、より有名なものとしては、ThinkPHP、Laravel、Yii があります。
1.2 フレームワークの選択
- ThinkPHP は使いやすく、国内の開発ドキュメントが豊富で、コミュニティで活発に活動していますが、ディレクトリ構造は整っていなく、深く掘り下げるのは難しくなく、中小規模のプロジェクトに適しています。
- Laravel は明確な構造、完全な機能、豊富なツール、強力なコミュニティを備えていますが、ファイルが多く、比較的肥大化しているため、始めるのが困難です。中規模から大規模なプロジェクトに適しています。
- Yii OOPの設計コンセプトは、使いやすく、開発速度が速く、強力なパフォーマンスと豊富な機能を備えていますが、ほとんどのドキュメントは英語であり、学習コストが高く、技術的要件が高くなります。中規模から大規模なプロジェクトに適しています。
2、ThinkPHP5.0 ディレクトリ
2.1 Thinkphp5.0 は比較的成熟しており、安定しています。公式アドレス: https://www.thinkphp.cn/down/framework.html
上記のアドレスが機能しない場合は、自動ダウンロード アドレスを使用してください: https://www.thinkphp.cn/donate/download/id/870.html
2.2 ディレクトリの説明に従います
project 应用部署目录
├─composer.json composer定义文件
├─README.md README文件
├─build.php 自动生成定义文件(参考)
├─LICENSE.txt 授权说明文件
├─application 应用目录(可设置)
│ ├─common 公共模块目录(可更改)
│ ├─runtime 应用的运行时目录(可写,可设置)
│ ├─module 模块目录
│ │ ├─config.php 模块配置文件
│ │ ├─common.php 模块函数文件
│ │ ├─controller 控制器目录
│ │ ├─model 模型目录
│ │ ├─view 视图目录
│ │ ├─ ... 更多类库目录
│ ├─common.php 公共函数文件
│ ├─route.php 路由配置文件
│ ├─database.php 数据库配置文件
│ └─config.php 公共配置文件
├─public WEB部署目录(对外访问目录)
│ ├─index.php 应用入口文件
│ ├─.htaccess 用于apache的重写
│ └─router.php 快速测试文件(用于自带webserver)
├─thinkphp 框架系统目录
│ ├─library 框架类库目录
│ │ ├─behavior 行为类库目录
│ │ ├─think Think类库包目录
│ │ ├─org Org类库包目录
│ │ ├─traits 系统Traits目录
│ │ ├─ ... 更多类库目录
│ ├─extend 扩展类库目录(可自定义)
│ ├─vendor 第三方类库目录
│ ├─mode 应用模式目录
│ ├─tpl 系统模板目录
│ ├─base.php 基础文件
│ ├─convention.php 框架惯例配置文件
│ └─start.php 框架引导文件
2.3 ダウンロードした thinkphp を Web サイトのルート ディレクトリに配置してアクセスし、ブラウザにhttp://localhost/tp5/public/と入力します。
2.3 アクセスパス
デフォルトのパス: http://localhost/tp5/public/
フルパス: http://localhost/tp5/public/index.php/index/index/index
上記は多くのインデックスのように見えますが、非常に複雑です。明確に理解するために別のコントローラーを作成することもできます。
http://localhost/tp5/public/index.php/amodule/bcontroller/caction/id/1
[リクエストプロトコル http]+[ドメイン名]+[tpディレクトリ]+[Webエントリパブリック]+[エントリファイル]+[モジュール名]+[コントローラ]+[オペレーション]+[パラメータ]+[パラメータ名]+[パラメータ]+[パラメータ名]...
2.4 アクセスパスと一括登録の簡略化
元のパス: http://localhost/tp5/public/index.php/amodule/bcontroller/caction/id/1
最初のステップは、パブリックを削除することです
公開されているindex.phpをルートディレクトリに移動し、対応するアプリケーションディレクトリとブートファイルを変更します。
元のファイル: /../ は、上位ディレクトリにフォールバックすることを意味します。ここで、index.php の上位ディレクトリは tp であり、ディレクトリは
<?php
// [ 应用入口文件 ]
// 定义应用目录
define('APP_PATH', __DIR__ . '/../application/');
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';
変更されたファイル__DIR__ は、現在のファイルの場所を示します。ここは、index.php が配置されているディレクトリです。
<?php
// [ 应用入口文件 ]
// 定义应用目录
define('APP_PATH', __DIR__ . '/application/');
// 加载框架引导文件
require __DIR__ . '/thinkphp/start.php';
2 番目のステップは httpd.conf を設定し、すべての「AllowOverride none」を「AllowOverride ALL」に 検索します。
<Directory "D:/server/apache/cgi-bin">
AllowOverride none 改为 AllowOverride ALL
Options None
Order allow,deny
Allow from all
</Directory>
3 番目のステップは .htaccess を構成することです
ルート ディレクトリに.htaccessファイルを 作成します。他の場所に存在する場合は、それをコピーできます。
<IfModule mod_rewrite.c>
Options +FollowSymlinks -Multiviews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?s=$1 [QSA,PT,L]
</IfModule>
この時のアクセスパスは http://localhost/tp5/amodule/bcontroller/cactionのようになります
4 番目のステップは、ルーティングを使用してモジュールとコントローラーを削除することです。
tp5 -> application -> Route.php にルーティングを追加します。
<?php
return [
'__pattern__' => [
'name' => '\w+',
],
'[hello]' => [
':id' => ['index/hello', ['method' => 'get'], ['id' => '\d+']],
':name' => ['index/hello', ['method' => 'post']],
],
'[test]' => [
'new' => ['amodule/bcontroller/caction', ['method' => 'get']],
],
];
これにより、アクセスパスは http://localhost/tp5/test/newに短縮されます。
またはこのように変更します
<?php
return [
'__pattern__' => [
'name' => '\w+',
],
'[hello]' => [
':id' => ['index/hello', ['method' => 'get'], ['id' => '\d+']],
':name' => ['index/hello', ['method' => 'post']],
],
'new/[:name]' => 'amodule/bcontroller/caction',
];
アクセスパスは http://localhost/tp5/newになります。
2.5 2 番目の簡略化されたルート メソッド Route::rule
静的ルート:
<?php
// return [
// '__pattern__' => [
// 'name' => '\w+',
// ],
// '[hello]' => [
// ':id' => ['index/hello', ['method' => 'get'], ['id' => '\d+']],
// ':name' => ['index/hello', ['method' => 'post']],
// ],
// // '[test]' => [
// // 'new' => ['amodule/bcontroller/caction', ['method' => 'get']],
// // ],
// // 'new/[:name]' => 'amodule/bcontroller/caction',
// ];
//引用路由模块
use think\Route;
//注册路由到amodule模块的bcontroller控制器的caction操作
//静态路由
Route::rule('new', 'amodule/bcontroller/caction','GET');
アクセスパスは http://localhost/tp5/newになります。
知らせ:
動的登録ルートの部分を削除する必要があります
think\Route を使用して参照を追加する必要があります。
動的ルーティング:
<?php
// return [
// '__pattern__' => [
// 'name' => '\w+',
// ],
// '[hello]' => [
// ':id' => ['index/hello', ['method' => 'get'], ['id' => '\d+']],
// ':name' => ['index/hello', ['method' => 'post']],
// ],
// // '[test]' => [
// // 'new' => ['amodule/bcontroller/caction', ['method' => 'get']],
// // ],
// // 'new/[:name]' => 'amodule/bcontroller/caction',
// ];
//引用路由模块
use think\Route;
//注册路由到amodule模块的bcontroller控制器的caction操作
//静态路由册
Route::rule('new', 'amodule/bcontroller/caction','GET');
//动态路由册
Route::rule('test/:id','amodule/bcontroller/daction','GET');
アクセスパスは http://localhost/tp5/new http://localhost/tp5/test/1になります。
または、think\Route を参照せずに GET タイプを直接指定します。
<?php
// return [
// '__pattern__' => [
// 'name' => '\w+',
// ],
// '[hello]' => [
// ':id' => ['index/hello', ['method' => 'get'], ['id' => '\d+']],
// ':name' => ['index/hello', ['method' => 'post']],
// ],
// // '[test]' => [
// // 'new' => ['amodule/bcontroller/caction', ['method' => 'get']],
// // ],
// // 'new/[:name]' => 'amodule/bcontroller/caction',
// ];
//引用路由模块
// use think\Route;
// //注册路由到amodule模块的bcontroller控制器的caction操作
// //静态路由册
// Route::rule('new', 'amodule/bcontroller/caction','GET');
// //动态路由册
// Route::rule('test/:id','amodule/bcontroller/daction','GET');
\think\Route::get('new','amodule/bcontroller/caction');
\think\Route::get('test/:id','amodule/bcontroller/daction');
アクセスパスは http://localhost/tp5/new http://localhost/tp5/test/1になります。
2.5 3 番目の簡略化されたパス メソッド、バインディング Route::bind
// //绑定到模块/控制器/操作
// 绑定当前的URL到 amodule模块
Route::bind('amodule');
// 绑定当前的URL到 amodule模块的bcontroller控制器
Route::bind('amodule/bcontroller');
アクセスパスは http://localhost/tp5/cactionになります。
もちろん、コントローラー、名前空間、クラスなど、他のディレクトリもバインドできます。
3 つの ThinkPHP5.0 構成
3.1 エントリーファイル
3.2 アプリケーションの構成
3.3 データベース構成
3.4 アクセスドメイン名の設定
4、システムアーキテクチャ
4.1 ルーティングが有効になっていない ThinkPHP5.0 の一般的な URL アクセス ルールは次のとおりです。
http://サーバー名/application (またはアプリケーションエントリファイル)/module/controller/operation/[パラメータ名/パラメータ値...]
4.2 コマンド ライン アクセスへの切り替えをサポートします。コマンド ライン モードに切り替える場合、アクセス ルールは次のとおりです。
>php.exeindex.php(アプリケーションエントリーファイル) module/controller/operation/[パラメータ名/パラメータ値...]
4.3 URLアクセス、コマンドラインアクセスともにPATHINFOモードのアクセスアドレスを使用し、PATHINFOのセパレータを設定できます。
4.4 thinkphp5 は URL モードの概念を取り消し、通常モードでの URL アクセスはサポートされなくなりました。サーバーが PATHINFO をサポートしていない場合は、互換モードを使用して次のようにアクセスできます。
http://serverName/アプリケーションエントリファイル?s=/module/controller/operation/[パラメータ名/パラメータ値...]
4.5 URL アクセスを簡素化し、アプリケーション エントリ ファイルを非表示にする
1. mod_rewrite.so モジュールが httpd.conf 構成ファイルにロードされます。
2. 「AllowOverride None」を「None」から「All」に変更します
。 3. 次の内容を.htaccess
ファイルとして保存し、アプリケーション エントリ ファイルと同じディレクトリに置きます。
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>
4.6 隠しモジュール
デフォルトでマルチモジュールサポートが採用されているため、複数モジュールの場合はURLアドレスで現在のモジュールを特定する必要がありますが、モジュールが1つだけの場合は、公開ファイルに以下のコードを追加することでモジュールバインディングを行うことができます。アプリケーション:
// 绑定index模块
\think\Route::bind('module','index');
設定後、URL アクセス アドレスは次のようになります。
http://serverName/アプリケーションエントリ/controller/operation/[パラメータ名/パラメータ値...] // アクセスされたモジュールはインデックスモジュールです
4.7 コントローラーを隠す
アプリケーションが比較的単純で、モジュールとコントローラーが 1 つだけある場合は、次のようにアプリケーション共通ファイルでモジュールとコントローラーをバインドできます。
// 绑定index模块的index控制器
\think\Route::bind('module','index/index');
設定後、URL アクセス アドレスは次のようになります。
http://serverName/applicationentry/operation/[パラメータ名/パラメータ値...] // アクセスされるモジュールはインデックスモジュール、コントローラはインデックスコントローラです
5つのルート
5.1 ThinkPHP5.0 で採用されているデフォルトの URL ルールは次のとおりです。
5.2 通常モード、ルーティングをオフにし、デフォルトの pathinfo URL を完全に使用します。
'url_route_on' => false
ルーティングが閉じられると、ルーティング ルールは解析されず、URL へのアクセスにはデフォルトの PATH_INFO モードが使用されます。
モジュール/コントローラー/アクション/パラメータ/値/...
5.3 ハイブリッド モード、ルーティングを有効にし、ルーティング + デフォルトの PATH_INFO を使用します。
'url_route_on' => true
5.4 レジスタルーティング、動的登録
たとえば、次のルーティング ルールを登録した後、Route クラスの register メソッドを使用してルーティング ルールを登録します (通常は、アプリケーションのパブリック ファイルに登録するか、構成ファイルの定義後にパブリック ファイルにバッチで登録できます)。
\think\Route::register('new/:id','index/New/read');
私たちは訪ねる:
http://serverName/new/5
ThinkPHP5.0 のルーティング ルールの定義は、モジュール名ではなく、ルート ディレクトリから始まります。
実際には、次のようにアクセスされます。
http://serverName/index/new/read/id/5
6、コントローラー
6.1 ThinkPHP では、階層型コントローラーの概念が導入されています。URL を通じてアクセスされるコントローラーは、アクセス コントローラー層 (コントローラー) またはメイン コントローラーです。アクセス コントローラーは、手動でインスタンス化することなく、クラスによって呼び出され、インスタンス化されます\think\App
。
6.2 URL の解析とルーティングの後、現在の URL アドレスは [module/controller/operation] に解析され、実際には特定のコントローラ クラスの特定の操作メソッドが実行されます。
namespace app\index\controller;
class New
{
public function index(){
return 'index';
}
public function add(){
return 'add';
}
public function edit($id){
return 'edit:'.$id;
}
}
6.3 現在定義されているメイン コントローラーはインデックス モジュールの下にあるため、異なる URL アドレスのページにアクセスすると、出力は次のようになります。
http://serverName/index/new/index // 输出 index
http://serverName/index/new/add // 输出 add
http://serverName/index/new/edit/id/5 // 输出 edit:5
セブンビュー
7.1 ビュー機能は、Think\View クラスとテンプレート エンジン (ドライバー) クラスが一緒になって完成します。
ビュークラスをインスタンス化する
// 实例化视图类
$view = new \think\View();
// 渲染模板输出
return $view->fetch();
7.2 コントローラーが \think\Controller クラスを継承している場合は、それを直接使用できます
// 渲染模板输出
return $this->fetch();
ThinkPHP5 のビュー取得メソッドは出力を直接レンダリングせず、解析されたコンテンツのみを返すことに注意してください。ビュー分析コンテンツがコントローラー クラスで返された場合、レンダリング出力システムは、レンダリング出力のために think\Response クラスの send メソッドを自動的に呼び出します。
八、データベース
8.1 グローバル構成定義
一般的な設定方法は、パブリック設定ファイルまたはモジュール設定ファイルに次の設定パラメータを追加することです。
'database'=> [
// 数据库类型
'type' => 'mysql',
// 数据库连接DSN配置
'dsn' => '',
// 服务器地址
'hostname' => '127.0.0.1',
// 数据库名
'database' => 'thinkphp',
// 数据库用户名
'username' => 'root',
// 数据库密码
'password' => '',
// 数据库连接端口
'hostport' => '',
// 数据库连接参数
'params' => [],
// 数据库编码默认采用utf8
'charset' => 'utf8',
// 数据库表前缀
'prefix' => 'think_',
// 数据库调试模式
'debug' => true,
// 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
'deploy' => 0,
// 数据库读写是否分离 主从式有效
'rw_separate' => false,
// 读写分离后 主服务器数量
'master_num' => 1,
// 指定从服务器序号
'slave_no' => '',
];
8.2 では、独立したデータベース構成ファイルの定義もサポートされており、たとえば、次のように application/database.php ファイルで定義されます。
return [
// 数据库类型
'type' => 'mysql',
// 数据库连接DSN配置
'dsn' => '',
// 服务器地址
'hostname' => '127.0.0.1',
// 数据库名
'database' => 'thinkphp',
// 数据库用户名
'username' => 'root',
// 数据库密码
'password' => '',
// 数据库连接端口
'hostport' => '',
// 数据库连接参数
'params' => [],
// 数据库编码默认采用utf8
'charset' => 'utf8',
// 数据库表前缀
'prefix' => 'think_',
// 数据库调试模式
'debug' => false,
// 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
'deploy' => 0,
// 数据库读写是否分离 主从式有效
'rw_separate' => false,
// 读写分离后 主服务器数量
'master_num' => 1,
// 指定从服务器序号
'slave_no' => '',
];
8.3 は、簡略化された DSN データベース接続文字列の書き込みもサポートします (ほとんどの接続パラメータをサポートします)。次に例を示します。
'database'=> 'mysql://root:[email protected]:3306/thinkphp#utf8'
必要に応じて、モジュール構成ファイルにデータベース設定パラメータを追加するだけで、モジュールごとに異なるデータベース接続情報を定義できます。
8.4 接続パラメータ
さまざまな接続ニーズに合わせてデータベース接続パラメータを追加できます。例:
長い接続を使用する必要がある場合は、次の方法で接続を定義できます。
'params' => [PDO::ATTR_PERSISTENT => true],
9入力、変数取得
9.1 GET変数の取得
\think\Input::get('id'); // 获取某个get变量
\think\Input::get('name'); // 获取get变量
\think\Input::get(); // 获取所有的get变量(数组)
または、組み込みのショートカット I メソッドを使用して、同じ機能を実現します。
9.2 POST変数の取得
\think\Input::post('name'); // 获取某个post变量
\think\Input::post(); // 获取全部的post变量
ショートカット メソッドを使用して、次のことを実現します。
I('post.name');
I('post.');
9.3 PUT変数の取得
\think\Input::put('name'); // 获取某个put变量
\think\Input::put(); // 获取全部的put变量
ショートカット メソッドを使用して、次のことを実現します。
I('put.name');
I('put.');
9.4 PARAM変数の取得
PARAM 変数は、GET、POST、または PUT リクエストを自動的に識別するためにフレームワークによって提供される変数取得メソッドです。次に例を示します。
\think\Input::param('name');
如果当前是get请求,那么等效于
\think\Input::get('name');
如果当前是post请求,则等同于
\think\Input::post('name');
ショートカット メソッドを使用して、次のことを実現します。
I('param.name');
I('param.');
或者
I('name');
I('');
I 関数はデフォルトで PARAM 変数の読み取り方法を使用するためです。
9.5 REQUEST変数の取得
\think\Input::request('id'); // 获取某个request变量
\think\Input::request(); // 获取全部的request变量
ショートカット メソッドを使用して、次のことを実現します。
9.6 SERVER変数の取得
\think\Input::server('PHP_SELF'); // 获取某个server变量
\think\Input::server(); // 获取全部的server变量
ショートカット メソッドを使用して、次のことを実現します。
I('server.PHP_SELF');
I('server.');
9.7 SESSION変数の取得
\think\Input::session('user_id'); // 获取某个session变量
\think\Input::session(); // 获取全部的session变量
ショートカット メソッドを使用して、次のことを実現します。
I('session.user_id');
I('session.');
9.8 Cookie変数の取得
\think\Input::cookie('user_id'); // 获取某个cookie变量
\think\Input::cookie(); // 获取全部的cookie变量
ショートカット メソッドを使用して、次のことを実現します。
I('cookie.user_id');
I('cookie.');
9.9 変数フィルタリング
関数、メソッド フィルタリング、PHP の組み込みタイプのフィルタなど、取得した変数のフィルタリングをサポートします。次に例を示します。
\think\Input::get('name','htmlspecialchars'); // 获取get变量 并用htmlspecialchars函数过滤
\think\Input::param('username','strip_tags'); // 获取param变量 并用strip_tags函数过滤
\think\Input::post('name','org\Filter::safeHtml'); // 获取post变量 并用org\Filter类的safeHtml方法过滤
複数のフィルタリング ルールを渡すことができます。次に例を示します。
\think\Input::param('username','strip_tags,strtolower'); // 获取param变量 并依次调用strip_tags、strtolower函数过滤
また、Input クラスは、PHP によって提供される Filter ID フィルタリングもサポートしています。次に例を示します。
\think\Input::post('email',FILTER_VALIDATE_EMAIL);
フレームワークは FilterID の変換サポートを提供するため、次のような文字列も使用できます。
\think\Input::post('email','email');
FilterID が文字列の形式で定義されている場合、システムは自動的に filter_id 呼び出しを実行し、それを Filter 定数に変換します。
特定の文字列は、filter_list 関数の戻り値に従って定義されます。
Filter ID を使用してフィルタリングを行う場合、フィルタリング要件が満たされていない場合は false が返されるため、最終的な値が仕様を満たすようにデフォルト値と協力する必要があることに注意してください。
例えば、
\think\Input::post('email',FILTER_VALIDATE_EMAIL,'');
これは、標準の電子メール アドレスでない場合は空の文字列を返すことを意味します。
9.10 変数修飾子
I 関数は、変数の修飾子の使用をサポートしており、変数をより適切にフィルターできます。
使用法は次のとおりです:
I('変数の型.変数名/修飾子');
または
\think\Input::get('変数名/修飾子');
例えば:
I('get.id/d');
I('post.name/s');
I('post.ids/a');
\think\Input::get('id/d');
ThinkPHP5.0 のデフォルトの変数修飾子は です/s
。文字列以外の変数を渡す必要がある場合は、次の修飾子を使用できます。
修飾子 | 効果 |
---|---|
s | 文字列型にキャストする |
d | 整数型への強制 |
b | ブール型に強制する |
ある | 配列型にキャストする |
f | float 型に強制する |
取得したいデータが配列の場合は、
/a
正しく取得するために修飾子の追加に注意してください。