PHPのThinkPHP5.0フレームワークの使用

導入:

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/と入力します。 

3874d1433911bbe0fbc3e75d5a32a778.png

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 エントリーファイル

1e87d999a3b74105acf2b12dae09e634.png

 3.2 アプリケーションの構成

5d3641764f37458a9bae340197ecabc1.png

3.3 データベース構成

83e24e1bfe7e43d9bafef61faea1a48d.png

 3.4 アクセスドメイン名の設定

e71c7652be8c4699a2ea1f114d77eaf9.png

 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つのルート

ada18fdc6c9d48efb005b009494c444d.png

5.1 ThinkPHP5.0 で採用されているデフォルトの URL ルールは次のとおりです。

http://server/module/controller/action/param/value/ ...

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 メソッドを自動的に呼び出します。

八、データベース

e01a192e84d342d8b7387eb3cf283ed0.png

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 正しく取得するために修飾子の追加に注意してください。

おすすめ

転載: blog.csdn.net/qq_29848853/article/details/129645184