ホームページ  >  記事  >  バックエンド開発  >  ThinkPHP コントローラーの学習 (1)

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

WBOY
WBOYオリジナル
2016-06-20 12:27:16940ブラウズ

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 までご連絡ください。