>백엔드 개발 >PHP 튜토리얼 >ThinkPHP 컨트롤러 상세 설명_php 기술

ThinkPHP 컨트롤러 상세 설명_php 기술

WBOY
WBOY원래의
2016-05-16 20:10:161059검색

이전 과정에서는 ThinkPHP 라우팅에 대해 약간의 의구심이 있을 수 있지만, 이 과정을 공부하고 나면 갑자기 많은 것이 명확해질 것입니다.

컨트롤러 파일 이름은 IndexController.class.php를 따릅니다.

컨트롤러 정의

시작하기 전에 컨트롤러의 정의를 명확히 해야 합니다.

<&#63;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>";
  }

}

보시다시피 앞서 라우팅 장에서 언급한 컨트롤러는 다음과 같이 정의됩니다.

해당 네임스페이스를 사용하세요. 기본값은 HomeController 네임스페이스입니다
ThinkController 로드
Controller(또는 하위 클래스)에서 상속되는 새 컨트롤러를 만듭니다.
카멜케이스 명명법을 사용하고, 첫 글자를 대문자로 표기하는 것에 주의하세요
컨트롤러의 공개 메소드는 작업으로 간주될 수 있습니다. 예를 들어 위의 read() 및 top() 메소드는 라우팅 장에서 확인되었습니다.

http://localhost:8999/index.php/Home/Index/top
top() 메소드에 액세스하면 최상위 페이지가 페이지에 인쇄됩니다. 다시 한번, Home이 홈 모듈을 나타냄이 분명합니다

때때로 시스템 키워드와 충돌하는 방법이 발생할 수 있습니다. 이 경우 설정 작업 방법 접미사를 사용하여 문제를 해결할 수 있습니다.
http://document.thinkphp.cn/manual_3_2.html#define_controller

사전 및 사후 작업

사전 및 사후 작업은 작업 메서드 실행 전후에 자동으로 호출되는 메서드를 말하지만 액세스 컨트롤러에만 유효합니다. 예를 들어 top() 메서드에 사전 및 사후 처리 메서드를 추가합니다. 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>";
  }

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

인쇄물을 볼 수 있습니다:

before top page
top page
after top page

사전, 사후 작업 시 다음 두 가지 사항에 주의하시기 바랍니다.

현재 작업이 작업 방법을 정의하지 않고 템플릿 파일을 직접 렌더링하는 경우 사전 및 사후 메서드가 정의되어 있으면 계속 적용됩니다. 실제 템플릿 출력은 현재 작업일 수 있으며 사전 및 사후 작업에는 일반적으로 출력이 없습니다.

일부 메소드에서 종료 또는 오류 출력을 사용하는 경우 사후 메소드가 더 이상 실행되지 않을 수 있으므로 주의해야 합니다. 예를 들어 현재 작업에서 시스템 Action의 오류 메서드가 호출되면 사후 작업은 실행되지 않지만 성공 메서드의 사후 메서드 실행에는 영향을 미치지 않습니다.

양식 필터링 및 유효성 검사에 사용할 수 있습니다

매개변수 바인딩

파라미터 바인딩은 URL 주소의 변수를 작업 메서드의 매개 변수로 직접 바인딩하는 것으로 메서드 정의는 물론 경로 파싱까지 단순화할 수 있습니다.

'URL_PARAMS_BIND'    => true


매개변수 바인딩 기능은 기본적으로 활성화되어 있습니다. URL의 매개변수(모듈, 컨트롤러 및 작업 이름 제외)를 작업 메서드의 매개변수와 바인딩하는 것이 원칙입니다.
매개변수를 바인딩하는 방법에는 변수 이름으로 바인딩하는 것과 변수 순서로 바인딩하는 두 가지가 있습니다. 기본값은 변수 이름으로 바인딩하는 것입니다.

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

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

예, 이전 라우팅에 관련된 내용으로, 이전 라우팅의 라우팅 설정에 있습니다

'블로그/:id' => 배열('색인/읽기')
: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

여러 매개변수 바인딩의 경우 순서에 관계없이 해당 변수 이름과 값을 전달하면 됩니다. 예를 들어 다음 두 경우는 동일한 결과를 반환합니다.

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

tips:给绑定参数设置默认值是一个避免报错的好办法
在实际的开发中,我们其实会见到没有显示变量名这样的URL,如:

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

怎么解决呢?这个时候,我们其实就可以用到第二种参数绑定:按照变量顺序绑定。要使用这种参数绑定,需要先在设置项中设置:

'URL_PARAMS_BIND_TYPE' => 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。但我们可以自己设置,例如

'URL_HTML_SUFFIX'=>'shtml'

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

'URL_HTML_SUFFIX' => 'html|shtml|xml'

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

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

'URL_DENY_SUFFIX' => 'pdf|ico|png|gif|jpg',
注: 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('Article/cate',array('cate_id'=>1,'status'=>1))
U('Article/cate','cate_id=1&status=1')
U('Article/cate&#63;cate_id=1&status=1')


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

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

U('Article/cate/cate_id/1/status/1');

生成路由地址

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

'blogs/:id\d'=>'Index/read'

那么可以使用

U('/blogs/1');

最终生成的URL地址是:

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

跳转和重定向

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

跳转

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

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

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

<&#63;php
namespace Home\Controller;

use Think\Controller;

class UserController extends Controller {

  public function addUser()
  {
    echo 'add user done!';
  }
}

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

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

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

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

define('BIND_MODULE','Home');

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

'TMPL_ACTION_ERROR' => THINK_PATH . 'Tpl/dispatch_jump.tpl',

'TMPL_ACTION_SUCCESS' => THINK_PATH . 'Tpl/dispatch_jump.tpl',
你可以根据自己的需要来修改模版。

重定向

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('/Home/Article/show', array('id' => 2), 3, 'Redirecting...');
  }

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

namespace Home\Controller;

use Think\Controller;

class ArticleController extends Controller {

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

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

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

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

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

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

以上所述就是本文的全部内容了,希望大家能够喜欢。

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.