À propos de l'analyse du contrôleur ThinkPHP

不言
Libérer: 2023-03-30 18:50:01
original
1674 Les gens l'ont consulté

D'une manière générale, le contrôleur de ThinkPHP est une classe et l'opération est une méthode publique de la classe contrôleur. Parlons du contrôleur de ThinkPHP en détail

Dans le cours précédent, vous avez peut-être eu des doutes sur le routage de ThinkPHP, mais cela n'a pas d'importance après avoir étudié ce cours, beaucoup de choses deviendront soudainement claires.

Le nom du fichier du contrôleur suit IndexController.class.php

Définition du contrôleur

Avant de commencer, nous avons encore besoin de clarifier la définition de le contrôleur :

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

}
Copier après la connexion

Comme vous pouvez le constater, le contrôleur mentionné plus tôt dans le chapitre sur le routage est défini comme ceci :

Utilisez le espace de noms correspondant, la valeur par défaut est l'espace de noms HomeController
Load ThinkController
Le nouveau contrôleur hérite de Controller (ou sous-classe)
Utilisez la méthode de dénomination en casse chameau, faites attention à la majuscule de la première lettre
Dans le contrôleur Les méthodes publiques peuvent être considérées comme une opération. Par exemple, les méthodes read() et top() ci-dessus peuvent être considérées comme des opérations. Nous l'avons vérifié dans le chapitre sur le routage.

http://localhost:8999/index.php/Home/Index/top
consiste à accéder à la méthode top(), qui imprimera la première page de la page. Il est clair que Home représente Home. Le module

peut parfois rencontrer des méthodes qui entrent en conflit avec les mots-clés du système. Dans ce cas, vous pouvez utiliser le suffixe de la méthode d'opération de configuration pour résoudre le problème.

Pré- et post-opérations

Les pré- et post-opérations font référence à des méthodes qui sont automatiquement appelées avant et après l'exécution d'une méthode d'opération, mais uniquement efficaces pour l'accès contrôleurs, comme l'ajout de méthodes pré et post à la méthode top() dans 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>";
  }
Copier après la connexion

Accès : http://localhost :8999 /index.php/Home/Index/top

sera imprimé :

before top page
top page
after top page
Copier après la connexion

Utilisez le préfixe et veuillez faire attention au suivants deux points pour la post-opération :

Si l'opération en cours ne définit pas de méthode d'opération, mais restitue directement le fichier modèle, alors si les pré- et post-méthodes sont définies, elles prendront toujours effet. La véritable sortie du modèle ne peut être que l'opération en cours, et les pré- et post-opérations n'ont généralement aucune sortie.

Il convient de noter que si une sortie de sortie ou d'erreur est utilisée dans certaines méthodes, la post-méthode peut ne plus être exécutée. Par exemple, si la méthode d'erreur de l'action système est appelée dans l'opération en cours, la post-opération ne sera pas exécutée, mais l'exécution post-méthode de la méthode de réussite ne sera pas affectée

peut être utilisée pour le filtrage et la vérification des formulaires

Liaison de paramètres

La liaison de paramètres consiste à lier directement les variables dans l'adresse URL en tant que paramètres de la méthode d'opération, ce qui peut simplifier la définition de la méthode et même le routage.

&#39;URL_PARAMS_BIND&#39;    => true
Copier après la connexion

La fonction de liaison des paramètres est activée par défaut. Le principe est de combiner les paramètres de l'URL (hors noms de module, de contrôleur et d'opération) avec les paramètres de la méthode de fonctionnement. . Obligatoire.
Il existe deux manières de lier des paramètres : la liaison par nom de variable et la liaison par ordre de variable. Par exemple, voir l'exemple suivant :

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

 public function archive($year, $month){
    echo "$year </br>".$month;
  }
Copier après la connexion
<. 🎜>

Oui, c'est ce qu'implique le routage précédent. Dans les paramètres de routage de l'itinéraire précédent,

'blogs/:id'          => array('Index/ read')

Nous avons mappé :id directement au paramètre $id de la méthode read(), donc avec le recul maintenant, les règles de routage vous donnent en fait la fonction de personnaliser l'URL. Si nous supprimons les paramètres de routage ci-dessus, notre méthode d'accès correcte est :

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

L'identifiant dans l'URL ci-dessus est la variable Si vous écrivez le nom comme :

 public function read($title){
    echo "read page with </br>".$title;
  }
Copier après la connexion

alors l'adresse d'accès est :

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

Dans le cas d'une liaison à plusieurs paramètres, transmettez simplement le nom et la valeur de la variable correspondante, quel que soit l'ordre. Par exemple, les deux suivants seront renvoyés. le même résultat :

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

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

Il convient de noter que quelle que soit la situation, lorsque vous visitez

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

signalera une erreur :

Erreur de paramètre ou non défini : id

Un bon moyen de résoudre ce problème est de définir des valeurs par défaut pour les paramètres liés, tels que :

 public function read($id=0){
    echo "read page with </br>".$id;
  }
Copier après la connexion

Accéder à nouveau à l'URL ci-dessus affichera :

lire la page avec

0

conseils : définir des valeurs par défaut pour les paramètres de liaison est un bon moyen d'éviter les erreurs

Dans le développement réel, nous verrons en fait des URL qui n'affichent pas les noms de variables, telles que :

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

Comment le résoudre ? À l’heure actuelle, nous pouvons effectivement utiliser le deuxième type de liaison de paramètres : la liaison dans un ordre variable. Pour utiliser cette liaison de paramètre, vous devez d'abord la définir dans les paramètres :

&#39;URL_PARAMS_BIND_TYPE&#39; => 1
Copier après la connexion

一旦设置变量顺序绑定,这种情况下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;
Copier après la connexion

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

&#39;URL_HTML_SUFFIX&#39; => &#39;html|shtml|xml&#39;
Copier après la connexion

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

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

&#39;URL_DENY_SUFFIX&#39; => &#39;pdf|ico|png|gif|jpg&#39;,
Copier après la connexion

注: 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;)
Copier après la connexion

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

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

U(&#39;Article/cate/cate_id/1/status/1&#39;);
Copier après la connexion

生成路由地址

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

&#39;blogs/:id\d&#39;=>&#39;Index/read&#39;
Copier après la connexion

那么可以使用

U(&#39;/blogs/1&#39;);
Copier après la connexion

最终生成的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;);
    }
  }
Copier après la connexion

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;;
  }
}
Copier après la connexion

然后在浏览器中访问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);
Copier après la connexion

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

define(&#39;BIND_MODULE&#39;,&#39;Home&#39;);
Copier après la connexion

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

&#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;,
Copier après la connexion

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

重定向

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;);
  }
Copier après la connexion

然后我们创建一个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 变量我们后续会用到,现在只是演示跳转
  }
}
Copier après la connexion

然后在浏览器访问: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;);
Copier après la connexion

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

相关推荐:

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

thinkPHP5.0框架访问URL的方法

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!