目次
マルチレイヤーコントローラーの使用
Action参数绑定
伪静态
まとめ
ホームページ バックエンド開発 PHPチュートリアル ThinkPHP コントローラーの学習 (1)

ThinkPHP コントローラーの学習 (1)

Jun 20, 2016 pm 12:27 PM

Starry Sky

マルチレイヤーコントローラーの使用

TP3.23 では、デフォルトのコントローラーに加えて、コントローラーをより詳細に階層化します。レイヤー、イベント コントロール レイヤー Event をカスタマイズすることもできます。

作成方法は次のとおりです。

  • モジュールの第 1 レベルのディレクトリ (コントローラー層と同じレベルのディレクトリ) に、新しいフォルダー Event
  • イベントフォルダー内に新しいファイル AdminEvent.class.php を作成します
  • 新しいファイルにコードを入力します
namespace Admin\Event;// use Think\Controller;  // 如果不使用到controller的功能 // 可以不用添加该命名空间引用 也不用继承controllerclass AdminEvent extents Controller {    public function test() {        echo 'Hello World !';    }}
ログイン後にコピー
システムデフォルトのコントローラー (つまり、アクセス コントローラー) はコントローラーであるため、ブラウザーに http://localhost/forum/index.php/Admin/admin/test と入力してもアクセスできません。イベント コントローラーには内部メソッドでのみアクセスできます。もちろん、DEFAULT_C_LAYER を通じてアクセス コントローラーの名前を変更できます。ただし、これは行わないことをお勧めします。

はイベント コントローラーを定義します。これはシステム モジュールの構築に非常に役立ちます。ブラウザー要求を内部イベント処理から分離して、ビジネス ロジック全体をより簡潔かつ明確に見せることができます。

たとえば、複数のページを持つバックエンド システムは、ユーザーがログインしているかどうかを検出する必要があります。この検出がコントローラーで実行される場合、ビジネス ロジック全体が非常に混乱し、コードの冗長性が生じる可能性があります。このとき、イベント コントローラーを介して検出メソッドを定義し、それをコントローラー層で呼び出すことができます。この方法では、コードがより簡潔になるだけでなく、ビジネス ロジックもより明確になります。

イベント コントローラー

namespace Admin\Event;use Think\Controller;      class AdminEvent extents Controller {    /**     *  登录检测  检测session中用户     *  @param    类型    参数名 含义     *  @return 类型       */    function checkLogin() {        $value = session('UserName');        if(!isset($value)) {            $this->error('请登录后访问' , U('admin/login'));        }    }}
ログイン後にコピー

コントローラー コントローラー

namespace Admin\Controller;use Think\Controller;class AdminController extends Controller {    /**      *  后台首页面     */    public function index(){        A('Admin' , 'Event')->checkLogin();        $this->assign('title','后台');           $this->display();       }    /**     -  文章显示控制     -  @param       -  @return      */    public function article() {        A('Admin' , 'Event')->checkLogin();        $this->assign('title','文章-后台');                     $this->display();    }}
ログイン後にコピー
どのような種類のリンクからログインしても構いませんバックグラウンドでユーザー検出が実行されるため、セキュリティが向上するだけでなく、コードのロジックも明確になります。

イベント コントローラーでデータベースの追加操作を完了し、コントローラー コントローラーでテンプレートの出力とフォーム送信の受け入れのみを実行できます。その上。

初期化操作

ThinkController.class.php のコンストラクターでビュー クラスをインスタンス化した後、_initialize メソッドがあるかどうかを検出します。存在する場合は、メソッドが事前に呼び出されます。

コントローラーの初期化操作です。コントローラークラスに _initialize メソッドを定義すると、他のメソッドを動作させる前にこのメソッドが実行されます。

例:

namespace Admin\Controller;use Think\Controller;class AdminController extends Controller {    # 初始化操作    public function _initialize() {        echo '页面初始化,请等待<br/>';    }    # 主页    public function index() {        echo 'index';    }}
ログイン後にコピー
ブラウザに http://localhost/forum/index.php/Admin と入力すると、

ページの初期化が行われます。 Please wait forindex

この方法を使用すると、上で説明したログイン検出が再び簡素化されます。つまり、_initializeメソッドでログインするかどうかを確認します。しかし、ログイン検出を _initialize に追加した後、ログイン関連のコンテンツを AdminController コントローラーに入れることができなくなり、エラー ページにジャンプし続けてログイン ページを表示できなくなります。

ログインと登録を同時に削除し、UserController という名前の新しいコントローラーを作成できます。ログインと登録機能はこのページで実行され、エラーページはこのページにジャンプします。

UserController

namespace Admin\Controller;use Think\Controller;class UserController extends Controller {    /**     *  用户登录     */     public function login() {        echo '用户登录';     }    /**     *  用户注册     */    public function register() {        echo '用户注册';    }}
ログイン後にコピー

AdminController

namespace Admin\Controller;use Think\Controller;class AdminController extends Controller {    # 初始化操作    public function _initialize() {        A('Admin' , 'Event')->checkLogin();    }    /**      *  后台首页面     */    public function index(){                   $this->assign('title','后台');           $this->display();       }    /**     -  文章显示控制     -  @param       -  @return      */    public function article() {                    $this->assign('title','文章-后台');                     $this->display();    }}
ログイン後にコピー

AdminEvent

namespace Admin\Event;use Think\Controller;      class AdminEvent extents Controller {    /**     *  登录检测  检测session中用户     *  @param    类型    参数名 含义     *  @return 类型       */    function checkLogin() {        $value = session('UserName');        if(!isset($value)) {            $this->error('请登录后访问' , U('user/login'));        }    }}
ログイン後にコピー
このように比較的完全なバックグラウンド ログインが完了します (もちろん、特定のビジネス ロジックはまだ実装されていません)。最も原始的な方法と比較して、コードははるかに単純かつ明確で、MVC に完全に準拠しています。デザインのアイデア。

位置前および位置後

初期化設定と同様に、TP は位置前および位置後の操作を提供します。位置前および位置後の操作を実行するには、実メソッドが必要です。事前操作と事後操作が定義されている場合、システムはメソッドを実行する前にこれを実行します。定義されたメソッドは、メソッドを実行する前に _before_ または _after_ を追加します。たとえば、

namespace Admin\Controller;use Think\Controller;class AdminController extends Controller {    public function _before_index() {}    public function index() {}    public function _after_index() {}}
ログイン後にコピー
http://localhost/forum/index.php/Admin にアクセスすると、_before_index が最初に実行され、index が実行され、最後に_after_indexを実行します。 die、exit、jump メソッド エラーなどのブレークポイント メソッドがインデックスに定義されている場合、成功しても _after_index の実行は続行されないことに注意してください。

この前後の方法についてはまだこれ以上役立つことを考えていないので、最初に書き留めて、後で思いついたら追加します。

操作なし、空のコントローラー

ThinkPHP の URL 命名規則 (pathinfo モード) に従って、エントリー ファイル以降の操作は

モジュール コントローラー操作

になります。

例: http://servername/index.php/module/controller/operation/[パラメータ名/パラメータ値...]

操作はありません は参照しますURL で指定された操作メソッドが見つからない場合は、システムにエラーが報告されます。これは、空の操作メソッドを定義することで回避できます。例:

namespace Admin\Controller;use Think\Controller;class AdminController extends Controller {    /**      *  后台首页面     */    public function index(){                   $this->assign('title','后台');           $this->display();       }    /**     -  空操作防止     -  @param    无     -  @return   无        */    public function _empty() {        $this->display('404');    }}
ログイン後にコピー
を定義した後、誤った操作メソッドを入力すると、_emptyの内容が表示されます。 404 ページを定義して _empty にジャンプできます。

空のコントローラー

空の操作と同様に、存在しないコントローラーにアクセスすると、空のコントローラー操作が行われます。このエラーを回避する方法は、 を実行することです。コントローラー内で EmptyController コントローラーを定義し、コントローラー内で _empty メソッドも定義します。

namespace Admin\Controller;use Think\Controller;class EmptyController extends Controller {    /**     -    空操作防止     -    @param    无     -    @return   无        */    public function _empty() {         $this->display('admin/404');    }}
ログイン後にコピー

404页面对于404页面的定制,如果没有特殊需求的同学,建议使用腾讯的404公益页面,只要嵌入一小段JS代码,就会跳转到腾讯的寻找失踪儿童的404页面。虽然可能和你的网站风格不统一,但是每多一个看见该页面的人,就可能加大找回一个失踪儿童的几率。一小段代码,献出一段爱心,你值得拥有。

// 腾讯404页面<script type="text/javascript" src="http://www.qq.com/404/search_children.js" charset="utf-8" homePageUrl="http://yoursite.com/yourPage.html" homePageName="回到我的主页"></script>
ログイン後にコピー

20160529162719.png

Action参数绑定

在说Action参数绑定前,先说说与之相关的问题。在学习Action参数绑定之前,我获取GET参数的方式是怎么样?自然是利用$_GET来获取URL上的参数,如:

# 我要点击一个文章链接,来进行文章编辑 url如下http://localhost/forum/index.php/Admin/admin/article/act/edit/aid/2# 然后通过$_GET来获取act aid得到参数,来判断进行的操作以及操作的文章idif($_GET['act'] == 'edit') {    # 文章编辑  利用 aid从数据库取出文章进行编辑}
ログイン後にコピー

这种方式虽然可行,却不够优雅,作为一个立志成为攻城狮的程序员来说,要想尽方法使你的代码更加简洁,更加优雅。

这时来看看Action参数绑定,什么是Action参数绑定?

Action参数绑定是通过直接绑定URL地址中的变量作为操作方法的参数, 可以简化方法的定义甚至路由的解析。

说的还挺绕,其实就是把GET形式传递的参数直接绑定到你的操作方法上,你就能够直接访问,而不用通过$_GET。举个例子,还是上面的链接http://localhost/forum/index.php/Admin/admin/article/act/edit/aid/2。定义操作方法如下:

namespace Admin\Controller;use Think\Controller;class AdminController extends Controller {    /**      *  文章显示控制器     *  @param:$act   string   进行的文章操作  默认值空 -> 显示所有文章     *  @param:$aid   int      文章的主键id    默认值0  -> 显示所有文章     */    public function article($act='' , $aid = 0) {        if(empty($act) || empty($aid) ) {            # 显示所有文章        } else {            # 进行想要的操作            echo '你要进行的操作是'.$act.',你想要'.$act.'的文章id是'.$aid;        }    }}
ログイン後にコピー

访问上面的链接,结果为

你要进行的操作是edit,你想要edit的文章id是2

这就是Action参数绑定。要使用这种方式需要开启URL_PARAMS_BIND设置(默认设置true)。

Action参数绑定有两种形式

按照变量名绑定 按照变量顺序绑定

将URL_PARAMS_BIND_TYPE的值设置成0,按照变量名绑定,设置成1,按照变量顺序绑定。

按照字面意思也可以理解,按照变量名绑定即寻找get参数时,按照操作方法中定义的变量名去寻找相应的值。如果没有就报错。这也是最常用的方式。

按照变量顺序绑定,即按照url上get参数的顺序去给操作方法上的变量赋值,这样在url上的参数就能够随意变换位置,同时url上get参数也可以隐藏变量名。

举例说明一下:

按照变量名绑定链接 http://localhost/forum/index.php/Admin/admin/article/act/edit/aid/2 那么打印出来的结果

你要进行的操作是edit,你想要edit的文章id是2

链接 http://localhost/forum/index.php/Admin/admin/article/aid/2/act/edit 那么打印出来的结果

你要进行的操作是edit,你想要edit的文章id是2

可以看出无论怎么变换位置,得到的结果是一样的。

按照变量顺序绑定链接 http://localhost/forum/index.php/Admin/admin/article/edit/2 那么打印出来的结果

你要进行的操作是edit,你想要edit的文章id是2

链接 http://localhost/forum/index.php/Admin/admin/article/2/edit 那么打印出来的结果

你要进行的操作是2,你想要edit的文章id是edit

因此如果采用变量顺序绑定时,一定要确保url上的get参数顺序与操作方法上的参数顺序一致。

值得注意的是按照变量名绑定仅对类似于pathinfo方式的地址有效。如pathinfo模式与兼容模式。

伪静态

伪静态是相对于静态页面来说的,主要是为了更好的SEO效果,并不是真正的静态,而是在URL的结尾添加了类似html,htm等的后缀。在TP中默认是开启伪静态的。可以通过URL_HTML_SUFFIX来设置静态的后缀名,如:

'URL_HTML_SUFFIX'=>'shtml'
ログイン後にコピー

访问:

http://localhost/forum/index.php/Admin/admin/article/2/edit.shtml
ログイン後にコピー

就是有效的,而访问.html则会报错。也可以设置多个静态后缀,使用**|**来进行分割。

// 多个伪静态后缀设置 用|分割'URL_HTML_SUFFIX' => 'html|shtml|htm'
ログイン後にコピー

也可以对某些后缀进行禁止访问,利用URL_DENY_SUFFIX

'URL_HTML_SUFFIX' => 'html'
ログイン後にコピー

设置后就不能访问任何以html为后缀的url。可以将URL的模式改成rewrite模式来配合伪静态,否则一个链接上既有.php,也有.html看上去很别扭。

注意:使用伪静态模式必须开启httpd.conf的mod_rewrite.so模块。

rewire模式切换

开启rewrite模式需要配合修改apache的重写内容。

打开httpd.conf文件,搜索mod_rewrite.so,将该模块前面的#删除。然后新建.htaccess,放入如下代码:

<IfModule mod_rewrite.c>    RewriteEngine on    RewriteCond %{REQUEST_FILENAME} !-d    RewriteCond %{REQUEST_FILENAME} !-f    RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]</IfModule>
ログイン後にコピー

保存到项目入口文件同级目录。重启apache即可。

apache的部分重写规则

擬似静的の実装のほとんどは、Apache の URL 書き換えルール (RewriteRule) を使用することです。RewriteRule についてはよく知りませんが、インターネットからいくつかの情報を見つけました。上記コードにおいて、RewriteEngineは書き換えエンジンを有効にするかどうかを示し、RewriteCondは書き換え適用条件を示し、RewriteRuleは書き換えルールを示します。コードから、正規表現の力が使用されていることは明らかです。

正規表現の意味

表达式 含义 表达式 含义
0-1个字符 $ 段落结束字符
. 1个字符 转移字符
* 0-x个字符 取反
+ 1-x个字符 () 内存限定传值
^ 段落开始字符 [0-9] 所有数字字符
[a-z] 所有小写字母 [A-Z] 所有大写字母
{n} 重复n次 {n,} 重复n次或更多次
{n,m} 重复n到m次

一致した文字列において、$N は式の最初の () と一致することを意味します。上記のコードでは、RewriteRule の $1 は最初の () と一致することを意味します。式の中で、すべてのindex.php/が他の文字またはnull文字と一致するようにします。

RewriteRule は本当によくわかりませんし、ネット上の情報も非常にわかりにくいので、英語が得意な学生は公式ドキュメントを読むことをお勧めします。

まとめ

今日のコントローラーの勉強は以上です。まだまだ言いたいことはたくさんありますが、一つ一つ詳しく説明する必要はありません。次回はソースコードを読んでの感想を書いていきたいと思います。最後に苦情を言いたいのですが、Jianshu には PHP に関するプログラマがほとんどいないようで、毎回 PHP に関する記事を見つけるのに時間がかかります。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

セッションのハイジャックはどのように機能し、どのようにPHPでそれを軽減できますか? セッションのハイジャックはどのように機能し、どのようにPHPでそれを軽減できますか? Apr 06, 2025 am 12:02 AM

セッションハイジャックは、次の手順で達成できます。1。セッションIDを取得します。2。セッションIDを使用します。3。セッションをアクティブに保ちます。 PHPでのセッションハイジャックを防ぐための方法には次のものが含まれます。1。セッション_regenerate_id()関数を使用して、セッションIDを再生します。2。データベースを介してストアセッションデータを3。

確固たる原則と、それらがPHP開発にどのように適用されるかを説明してください。 確固たる原則と、それらがPHP開発にどのように適用されるかを説明してください。 Apr 03, 2025 am 12:04 AM

PHP開発における固体原理の適用には、次のものが含まれます。1。単一責任原則(SRP):各クラスは1つの機能のみを担当します。 2。オープンおよびクローズ原理(OCP):変更は、変更ではなく拡張によって達成されます。 3。Lischの代替原則(LSP):サブクラスは、プログラムの精度に影響を与えることなく、基本クラスを置き換えることができます。 4。インターフェイス分離原理(ISP):依存関係や未使用の方法を避けるために、細粒インターフェイスを使用します。 5。依存関係の反転原理(DIP):高レベルのモジュールと低レベルのモジュールは抽象化に依存し、依存関係噴射を通じて実装されます。

システムの再起動後にUnixSocketの権限を自動的に設定する方法は? システムの再起動後にUnixSocketの権限を自動的に設定する方法は? Mar 31, 2025 pm 11:54 PM

システムが再起動した後、UnixSocketの権限を自動的に設定する方法。システムが再起動するたびに、UnixSocketの許可を変更するために次のコマンドを実行する必要があります:sudo ...

phpstormでCLIモードをデバッグする方法は? phpstormでCLIモードをデバッグする方法は? Apr 01, 2025 pm 02:57 PM

phpstormでCLIモードをデバッグする方法は? PHPStormで開発するときは、PHPをコマンドラインインターフェイス(CLI)モードでデバッグする必要がある場合があります。

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPのCurlライブラリを使用してJSONデータを含むPOSTリクエストを送信する方法は? PHPのCurlライブラリを使用してJSONデータを含むPOSTリクエストを送信する方法は? Apr 01, 2025 pm 03:12 PM

PHP開発でPHPのCurlライブラリを使用してJSONデータを送信すると、外部APIと対話する必要があることがよくあります。一般的な方法の1つは、Curlライブラリを使用して投稿を送信することです。

See all articles