Heim  >  Artikel  >  Backend-Entwicklung  >  Über die ThinkPHP-Controller-Analyse

Über die ThinkPHP-Controller-Analyse

不言
不言Original
2018-06-08 14:09:011638Durchsuche

Im Allgemeinen ist der Controller von ThinkPHP eine Klasse und die Operation ist eine öffentliche Methode der Controller-Klasse. Lassen Sie uns im Detail über den ThinkPHP-Controller sprechen

Im vorherigen Kurs hatten Sie vielleicht einige Zweifel am ThinkPHP-Routing, aber das spielt keine Rolle. Nach dem Studium dieses Kurses werden viele Dinge plötzlich klar.

Die Benennung der Controller-Datei folgt IndexController.class.php

Controller-Definition

Bevor wir beginnen, müssen wir noch die Definition von klären Controller:

<?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>";
  }

}

Wie Sie sehen können, ist der zuvor im Routing-Kapitel erwähnte Controller wie folgt definiert:

Verwenden Sie den entsprechenden Namespace. Der Standardwert ist Namespace HomeController
ThinkController laden
Der neue Controller erbt vom Controller (oder der Unterklasse)
Verwenden Sie die Benennungsmethode in Camel Case, achten Sie auf den Großbuchstaben des ersten Buchstabens
Öffentliche Methoden im Controller Es kann als Operation betrachtet werden. Die oben genannten Methoden read() und top() können beispielsweise als Operationen betrachtet werden.

http://localhost:8999/index.php/Home/Index/top
besteht darin, auf die top()-Methode zuzugreifen, die die oberste Seite auf der Seite ausdruckt und erneut erstellt Es ist klar, dass Home das Home-Modul

darstellt. Manchmal kann es zu Konflikten mit Systemschlüsselwörtern kommen. In diesem Fall können Sie das Suffix der Einstellungsoperationsmethode verwenden, um das Problem zu lösen.

Vor- und Nachoperationen

Vor- und Nachoperationen beziehen sich auf Methoden, die automatisch vor und nach der Ausführung einer Operationsmethode aufgerufen werden, jedoch nur für den Zugriff wirksam sind Controller, wie zum Beispiel das Hinzufügen von Pre- und Post-Methoden zur top()-Methode in IndexController:

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>";
  }

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

wird den Ausdruck sehen:

before top page
top page
after top page

Voraussetzungen für Präfix- und Postfix-Operationen beachten. Beachten Sie die folgenden beiden Punkte:

Wenn die aktuelle Operation keine Operationsmethode definiert, sondern die Vorlagendatei direkt rendert, sind die Vor- und Nachmethoden dennoch wirksam, wenn sie definiert sind. Die eigentliche Vorlagenausgabe ist möglicherweise nur die aktuelle Operation, und die Vor- und Nachoperationen haben im Allgemeinen keine Ausgabe.

Es ist zu beachten, dass bei Verwendung der Exit- oder Fehlerausgabe in einigen Methoden die Post-Methode möglicherweise nicht mehr ausgeführt wird. Wenn beispielsweise die Fehlermethode der Systemaktion im aktuellen Vorgang aufgerufen wird, wird die Nachoperation nicht ausgeführt, die Ausführung der Erfolgsmethode nach der Methode wird jedoch nicht beeinträchtigt.

kann verwendet werden zur Formularfilterung und -überprüfung

Parameterbindung

Bei der Parameterbindung werden die Variablen in der URL-Adresse direkt als Parameter der Operationsmethode gebunden, was eine Vereinfachung ermöglichen kann die Definition der Methode und sogar das Routing.

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

Die Parameterbindungsfunktion ist standardmäßig aktiviert. Das Prinzip besteht darin, die Parameter in der URL (ausgenommen Modul-, Controller- und Operationsnamen) mit den Parametern in der Operationsmethode zu binden.
Es gibt zwei Möglichkeiten, Parameter zu binden: Bindung nach Variablennamen und Bindung nach Variablenname. Siehe zum Beispiel das folgende Beispiel:

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

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

Ja, das ist der Inhalt des vorherigen Routings,

'blogs/:id'      => array('Index/read' )
Wir haben :id direkt dem Parameter $id der read()-Methode zugeordnet, sodass Ihnen die Routing-Regeln im Rückblick tatsächlich die Funktion geben, die URL anzupassen. Wenn wir die oben genannten Routing-Einstellungen entfernen, lautet unsere korrekte Zugriffsmethode:

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

Die ID in der obigen URL lautet die Variable Wenn Sie den Namen wie folgt schreiben:

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

, dann lautet die Zugriffsadresse:

http://localhost:8999/index .php/Home/ index/read/title/3

Übergeben Sie bei der Bindung mehrerer Parameter einfach den entsprechenden Variablennamen und -wert, unabhängig von der Reihenfolge. Die folgenden beiden geben beispielsweise Folgendes zurück gleiches Ergebnis:

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

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

Es sollte beachtet werden, dass unabhängig von der Situation beim Besuch

http://localhost:8999/ index.php/Home /index/read/
meldet einen Fehler:

Parameterfehler oder undefiniert: id
Eine gute Möglichkeit, dieses Problem zu lösen, besteht darin, Standardwerte für gebundene Parameter festzulegen , wie zum Beispiel:

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

Auf diese Weise wird beim erneuten Zugriff auf die obige URL Folgendes ausgegeben:

Seite lesen mit
0

Tipps: Das Festlegen von Standardwerten für Bindungsparameter ist eine gute Möglichkeit, Fehler zu vermeiden
In der tatsächlichen Entwicklung werden wir tatsächlich URLs sehen, die keine Variablennamen anzeigen, wie zum Beispiel:

http://localhost: 8999/index.php/Home/index/read/3

Wie löst man das Problem? Zu diesem Zeitpunkt können wir tatsächlich die zweite Art der Parameterbindung verwenden: die Bindung in variabler Reihenfolge. Um diese Parameterbindung zu verwenden, müssen Sie sie zunächst in den Einstellungen festlegen:

&#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的方法

Das obige ist der detaillierte Inhalt vonÜber die ThinkPHP-Controller-Analyse. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn