ホームページ  >  記事  >  バックエンド開発  >  ThinkPHP コントローラー分析について

ThinkPHP コントローラー分析について

不言
不言オリジナル
2018-06-08 14:09:011683ブラウズ

一般的に言えば、ThinkPHP のコントローラーはクラスであり、操作はコントローラー クラスのパブリック メソッドです。 ThinkPHP のコントローラーについて詳しく話しましょう

前のコースでは、ThinkPHP のルーティングについていくつかの疑問を抱いたかもしれませんが、このコースを学習すると、多くのことが突然明らかになります。

コントローラー ファイルの名前付けは IndexController.class.php のメソッドに従います

コントローラー定義

始める前に、まだ明確にする必要があります。コントローラーの定義:

<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {

  public function read($id){
    echo "read page with </br>" .$id;
  }

  public function top(){
    echo "top page </br>";
  }

}

ご覧のとおり、ルーティングの章で前述したコントローラーは次のように定義されています。対応する名前空間、デフォルトは名前空間 Home\Controller

Load Think\Controller

新しいコントローラはコントローラ (またはサブクラス) を継承します
キャメルケースの命名方法を使用し、最初の文字の大文字化に注意してください
Controller 内の public メソッドはオペレーションとみなすことができます。たとえば、上記の read() メソッドと top() メソッドはルーティングの章で検証しました。

http://localhost:8999/index.php/Home/Index/top

は、top() メソッドにアクセスすることを意味します。これにより、ページ上にトップページが出力され、再度そのページが作成されます。 Home が Home モジュールを表していることを明確にします。


システムのキーワードと競合するメソッドが発生する場合があります。この場合は、設定操作メソッドのサフィックスを使用して問題を解決できます。

プレオペレーションとポストオペレーション

プレオペレーションとポストオペレーションは、オペレーションメソッドの実行前後に自動的に呼び出されるメソッドを指しますが、アクセスのみに有効です。 IndexController の top() メソッドにプレメソッドとポストメソッドを追加するなどのコントローラー:

public function _before_top(){
    echo "before top page </br>";
  }
  public function top(){
    echo "top page </br>";
  }
  public function _after_top(){
    echo "after top page </br>";
  }

アクセス: http://localhost:8999 /index .php/Home/Index/top

次の出力が表示されます:

before top page
top page
after top page

操作前および操作後の要件を使用する次の点に注意してください。 2 つのポイント:

現在の操作が操作メソッドを定義せず、テンプレート ファイルを直接レンダリングする場合、事前メソッドと事後メソッドが定義されていれば、それらは引き続き有効になります。実際のテンプレート出力は現在の操作のみであり、通常、前操作と後操作には出力がありません。

一部のメソッドで終了またはエラー出力が使用されている場合、ポストメソッドが実行されなくなる可能性があることに注意してください。たとえば、システム アクションの error メソッドが現在の操作で呼び出された場合、事後操作は実行されませんが、success メソッドの事後メソッドの実行は影響を受けません。フォームのフィルタリングと検証に使用されます

パラメータ バインディング

パラメータ バインディングは、URL アドレス内の変数を操作メソッドのパラメータとして直接バインドすることです。メソッドの定義とルーティングも簡素化します。

&#39;URL_PARAMS_BIND&#39;    => true

パラメータ バインディング機能はデフォルトで有効になっており、URL 内のパラメータ (モジュール、コントローラ、および操作名を除く) を操作メソッド内のパラメータにバインドします。

パラメータをバインドするには、変数名に従ってバインドする方法と、変数の順序に従ってバインドする方法があります。たとえば、次の例を見てください。 #
 public function read($id){
    echo "read page with </br>".$id;
  }

 public function archive($year, $month){
    echo "$year </br>".$month;
  }

はい、前回のルーティングのルーティング設定での内容です。

'blogs/:id' => /read' )

:id を read() メソッドのパラメーター $id に直接マッピングしました。そのため、今振り返ると、ルーティング ルールは実際に URL をカスタマイズする機能を提供します。上記のルーティング設定を削除すると、正しいアクセス方法は次のようになります:

http://localhost:8999/Home/index/read/id/3

上記の URL の ID は次のとおりです。変数 名前を


 public function read($title){
    echo "read page with </br>".$title;
  }

と記述すると、アクセス アドレスは

http://localhost:8999/index となります。 .php/Home/index/read/title/3

複数のパラメータのバインディングの場合は、順序に関係なく、対応する変数名と値を渡すだけです。たとえば、次の 2 つは、同じ結果:

http://localhost:8999/index.php/Home/index/archive/year/2012/month/12

http://localhost:8999/index. php/Home/index /archive/month/12/year/2012

http://localhost:8999/index にアクセスするときは、どのような状況であっても注意してください。 php/Home /index/read/

はエラーを報告します:

パラメータ エラーまたは未定義: id

この問題を解決する良い方法は、バインドされたパラメータにデフォルト値を設定することです。

 public function read($id=0){
    echo "read page with </br>".$id;
  }

このようにして、上記の URL に再度アクセスすると、次のように出力されます:

read page with

0

ヒント : バインディング パラメーターのデフォルト値を設定することは、エラーを回避する良い方法です

実際の開発では、次のような変数名が表示されない URL が実際に表示されます。 http://localhost: 8999/index.php/Home/index/read/3

これを解決するにはどうすればよいですか?現時点では、実際には 2 番目のタイプのパラメーター バインディング、つまり変数の順序でのバインディングを使用できます。このパラメータバインディングを使用するには、最初に設定項目で設定する必要があります:

&#39;URL_PARAMS_BIND_TYPE&#39; => 1


一旦设置变量顺序绑定,这种情况下URL地址中的参数顺序非常重要,不能随意调整。这种情况下操作方法的定义不需要改变,只是访问的URL变了而已,现在用上面的方式访问就可以正确访问了。

如果在变量顺序绑定的情况下,我们访问:

http://localhost:8999/index.php/Home/index/archive/2012/12

http://localhost:8999/index.php/Home/index/archive/12/2012

这两个结果显然是不一样,后者并不是我们想要的。所以这种情况需要严格遵守顺序来传值。

伪静态

URL伪静态通常是为了满足更好的SEO效果,ThinkPHP支持伪静态URL设置,可以通过设置URL_HTML_SUFFIX参数随意在URL的最后增加你想要的静态后缀,而不会影响当前操作的正常执行,默认情况下,伪静态的设置为html。但我们可以自己设置,例如

&#39;URL_HTML_SUFFIX&#39;=>&#39;shtml&#39;

如果希望支持多个伪静态后缀,可以直接设置如下:

&#39;URL_HTML_SUFFIX&#39; => &#39;html|shtml|xml&#39;

如果此项设置留空则表示可以支持所有的静态后缀。

也可以设置禁止访问的URL后缀通过URL_DENY_SUFFIX来设置,例如:

&#39;URL_DENY_SUFFIX&#39; => &#39;pdf|ico|png|gif|jpg&#39;,

注: URL_DENY_SUFFIX的优先级比URL_HTML_SUFFIX要高。

URL生成

为了配合所使用的URL模式,我们需要能够动态的根据当前的URL设置生成对应的URL地址,为此,ThinkPHP内置提供了U方法,用于URL的动态生成,可以确保项目在移植过程中不受环境的影响。

定义规则

U方法的定义规则如下(方括号内参数根据实际应用决定):
U('地址表达式',['参数'],['伪静态后缀'],['显示域名'])

地址表达式

地址表达式的格式定义如下:

[模块/控制器/操作#锚点@域名]?参数1=值1&参数2=值2...
如果不定义模块的话 就表示当前模块名称,下面是一些简单的例子:

U('User/add') // 生成User控制器的add操作的URL地址
U('Article/read?id=1') // 生成Article控制器的read操作 并且id为1的URL地址
U('Admin/User/select') // 生成Admin模块的User控制器的select操作的URL地址

参数

U方法的第二个参数支持数组和字符串两种定义方式,如果只是字符串方式的参数可以在第一个参数中定义,例如:

U(&#39;Article/cate&#39;,array(&#39;cate_id&#39;=>1,&#39;status&#39;=>1))
U(&#39;Article/cate&#39;,&#39;cate_id=1&status=1&#39;)
U(&#39;Article/cate?cate_id=1&status=1&#39;)

三种方式是等效的,都是生成Article控制器的cate()操作 并且cate_id为1 status为1的URL地址

但是不允许使用下面的定义方式来传参数:

U(&#39;Article/cate/cate_id/1/status/1&#39;);

生成路由地址

U方法还可以支持路由,如果我们定义了一个路由规则为:

&#39;blogs/:id\d&#39;=>&#39;Index/read&#39;

那么可以使用

U(&#39;/blogs/1&#39;);

最终生成的URL地址是:

http://localhost:8999/index.php/Home/blogs/1

跳转和重定向

这应该是在开发中最常用的功能之一。在应用开发中,经常会遇到一些带有提示信息的跳转页面,例如操作成功或者操作错误页面,并且自动跳转到另外一个目标页面。系统的\Think\Controller类内置了两个跳转方法success()和error(),用于页面跳转提示。

跳转

使用方法很简单,比如我们在Index控制器下新建一个方法user(),写上下面的内容:

public function user()
  {
    $User = M(&#39;User&#39;);
    $data[&#39;username&#39;] = &#39;Think&#39;;
    $data[&#39;email&#39;] = &#39;Think@gmail.com&#39;;
    $result = $User->add($data);
    if($result){
      $this->success(&#39;success&#39;, &#39;/Home/User/addUser&#39;);
    } else {
      $this->error(&#39;failed&#39;);
    }
  }

M('User')表示实例化一个User对象,add()方法是向数据库添加一条纪录。然后我们需要新建一个UserController,在里面写上addUser()方法

<?php
namespace Home\Controller;

use Think\Controller;

class UserController extends Controller {

  public function addUser()
  {
    echo &#39;add user done!&#39;;
  }
}

然后在浏览器中访问http://localhost:8999/Home/Index/user,就可以看到add user done!了,下面详细来说说这两个重定向方法。

success()和error()方法的第一个参数表示提示信息,第二个参数表示跳转地址,第三个参数是跳转时间(单位为秒),例如:

// redirect to /Article/index after 3 seconds when success
$this->success(&#39;done&#39;,&#39;/Home/Article/index&#39;,3);
// redirect to /Article/error after 5 seconds when failed
$this->error(&#39;failed&#39;,&#39;/Home/Article/error&#39;,5);

如果不设置跳转时间,默认的等待时间success()方法是1秒,error()方法是3秒。看到上面的两个跳转地址前面都带上了/Home,如果你想简写为/Article/index,你需要在ThinkPHP的入口文件(项目目录下的index.php)中加上下面一行:

define(&#39;BIND_MODULE&#39;,&#39;Home&#39;);

而且这两个方法都有对应的模板,默认的设置是两个方法对应的模板都是:

&#39;TMPL_ACTION_ERROR&#39; => THINK_PATH . &#39;Tpl/dispatch_jump.tpl&#39;,
&#39;TMPL_ACTION_SUCCESS&#39; => THINK_PATH . &#39;Tpl/dispatch_jump.tpl&#39;,

你可以根据自己的需要来修改模版。

重定向

Controller类的redirect()方法可以实现页面的重定向功能。
redirect()方法的参数用法和U函数的用法一致(参考上一部分URL生成部分),例如:

$this->redirect('/Home/Article/show', array('id' => 2), 3, 'Redirecting...');
上面的用法是停留3秒后跳转到Article控制器的show()操作,并且显示页面跳转中字样Redirecting...,重定向后会改变当前的URL地址。

为了成功进行测试,我们在IndexController下添加redirectToArticle()方法并写上上面那行代码:

public function redirectToArticle()
  {
    $this->redirect(&#39;/Home/Article/show&#39;, array(&#39;id&#39; => 2), 3, &#39;Redirecting...&#39;);
  }

然后我们创建一个ArticleController,并且为他添加show()方法:

namespace Home\Controller;

use Think\Controller;

class ArticleController extends Controller {

  public function show($id)
  {
    echo &#39;This is an Article Page&#39;;
    // $id 变量我们后续会用到,现在只是演示跳转
  }
}

然后在浏览器访问:http://localhost:8999/Home/Index/redirectToArticle,等待三秒,你就可以看到跳转之后的页面了。

如果你仅仅是想重定向要一个指定的URL地址,而不是到某个模块的操作方法,可以直接使用redirect()函数重定向,例如

$this->redirect('/Home/Article/show/id/3', 'Redirecting...',3);

注:控制器的redirect()方法和redirect()函数的区别在于前者是用URL规则定义跳转地址,后者是一个纯粹的URL地址
注:好像官方文档是这样写的

$this->redirect(&#39;/New/category/cate_id/2&#39;, 5, &#39;页面跳转中...&#39;);

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

关于thinkphp3.2嵌入百度编辑器ueditor的解析

thinkPHP5.0框架访问URL的方法

以上がThinkPHP コントローラー分析についての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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