検索
ホームページバックエンド開発PHPチュートリアルThinkPHP コントローラー分析について

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

Jun 08, 2018 pm 02:09 PM
thinkphpコントローラ

一般的に言えば、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 までご連絡ください。
PHPセッションの概念を簡単に説明してください。PHPセッションの概念を簡単に説明してください。Apr 26, 2025 am 12:09 AM

phpssionsStrackuserdataacrossmultiplepagerequestsusingauniqueidstoredinacookie.here'showtomanageetheemefectively:1)Startassession withsession_start()andstoredatain $ _ session.2)RegeneratesseSsessidafterloginwithsession_id(the topreventes_id)

PHPセッションに保存されているすべての値をどのようにループしますか?PHPセッションに保存されているすべての値をどのようにループしますか?Apr 26, 2025 am 12:06 AM

PHPでは、次の手順を通じてセッションデータを繰り返すことができます。1。session_start()を使用してセッションを開始します。 2。$ _Sessionアレイのすべてのキー価値ペアを介してforeachループを反復します。 3.複雑なデータ構造を処理する場合、is_array()またはis_object()関数を使用し、print_r()を使用して詳細情報を出力します。 4.トラバーサルを最適化する場合、ページングを使用して、一度に大量のデータの処理を避けることができます。これにより、実際のプロジェクトでPHPセッションデータをより効率的に管理および使用するのに役立ちます。

ユーザー認証にセッションを使用する方法を説明します。ユーザー認証にセッションを使用する方法を説明します。Apr 26, 2025 am 12:04 AM

このセッションは、サーバー側の状態管理メカニズムを介してユーザー認証を実現します。 1)セッションの作成と一意のIDの生成、2)IDはCookieを介して渡されます。3)サーバーストアとIDを介してセッションデータにアクセスします。

PHPセッションにユーザーの名前を保存する方法の例を挙げてください。PHPセッションにユーザーの名前を保存する方法の例を挙げてください。Apr 26, 2025 am 12:03 AM

tostoreauser'snameInappession、starthessession withsession_start()、thensignthenameto $ _session ['username']。1)ousession_start()toinitializethessession.2)assighttheuser'snameto $ _ session ['username']

PHPセッションを失敗させる可能性のあるいくつかの一般的な問題は何ですか?PHPセッションを失敗させる可能性のあるいくつかの一般的な問題は何ですか?Apr 25, 2025 am 12:16 AM

PHPSESSIONの障害の理由には、構成エラー、Cookieの問題、セッションの有効期限が含まれます。 1。構成エラー:正しいセッションをチェックして設定します。save_path。 2.Cookieの問題:Cookieが正しく設定されていることを確認してください。 3.セッションの有効期限:セッションを調整してください。GC_MAXLIFETIME値はセッション時間を延長します。

PHPでセッション関連の問題をどのようにデバッグしますか?PHPでセッション関連の問題をどのようにデバッグしますか?Apr 25, 2025 am 12:12 AM

PHPでセッションの問題をデバッグする方法は次のとおりです。1。セッションが正しく開始されるかどうかを確認します。 2.セッションIDの配信を確認します。 3.セッションデータのストレージと読み取りを確認します。 4.サーバーの構成を確認します。セッションIDとデータを出力し、セッションファイルのコンテンツを表示するなど、セッション関連の問題を効果的に診断して解決できます。

session_start()が複数回呼び出されるとどうなりますか?session_start()が複数回呼び出されるとどうなりますか?Apr 25, 2025 am 12:06 AM

session_start()への複数の呼び出しにより、警告メッセージと可能なデータ上書きが行われます。 1)PHPは警告を発し、セッションが開始されたことを促します。 2)セッションデータの予期しない上書きを引き起こす可能性があります。 3)session_status()を使用してセッションステータスを確認して、繰り返しの呼び出しを避けます。

PHPでセッションのライフタイムをどのように構成しますか?PHPでセッションのライフタイムをどのように構成しますか?Apr 25, 2025 am 12:05 AM

PHPでのセッションライフサイクルの構成は、session.gc_maxlifetimeとsession.cookie_lifetimeを設定することで達成できます。 1)session.gc_maxlifetimeサーバー側のセッションデータのサバイバル時間を制御します。 0に設定すると、ブラウザが閉じているとCookieが期限切れになります。

See all articles

ホット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 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール