ThinkPHP コントローラーの学習 (1)
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 !'; }}
はイベント コントローラーを定義します。これはシステム モジュールの構築に非常に役立ちます。ブラウザー要求を内部イベント処理から分離して、ビジネス ロジック全体をより簡潔かつ明確に見せることができます。
たとえば、複数のページを持つバックエンド システムは、ユーザーがログインしているかどうかを検出する必要があります。この検出がコントローラーで実行される場合、ビジネス ロジック全体が非常に混乱し、コードの冗長性が生じる可能性があります。このとき、イベント コントローラーを介して検出メソッドを定義し、それをコントローラー層で呼び出すことができます。この方法では、コードがより簡潔になるだけでなく、ビジネス ロジックもより明確になります。
イベント コントローラー
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'; }}
ページの初期化が行われます。 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')); } }}
位置前および位置後
初期化設定と同様に、TP は位置前および位置後の操作を提供します。位置前および位置後の操作を実行するには、実メソッドが必要です。事前操作と事後操作が定義されている場合、システムはメソッドを実行する前にこれを実行します。定義されたメソッドは、メソッドを実行する前に _before_ または _after_ を追加します。たとえば、
namespace Admin\Controller;use Think\Controller;class AdminController extends Controller { public function _before_index() {} public function index() {} public function _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'); }}
空のコントローラー
空の操作と同様に、存在しないコントローラーにアクセスすると、空のコントローラー操作が行われます。このエラーを回避する方法は、 を実行することです。コントローラー内で 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 に関する記事を見つけるのに時間がかかります。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









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

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

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

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

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

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

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