일반적으로 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>"; } }
보시다시피 , 라우팅 장에서 앞서 언급한 컨트롤러는 다음과 같이 정의됩니다.
해당 네임스페이스를 사용하고 기본값은 HomeController 네임스페이스입니다.
ThinkController 로드
새 컨트롤러는 Controller(또는 하위 클래스)에서 상속됩니다.
카멜 표기법 명명 방법을 사용합니다. 첫 글자 컨트롤러의 공개 메소드는 작업으로 간주할 수 있습니다. 예를 들어 위의 read() 및 top() 메소드는 라우팅 장에서 확인했습니다.
페이지의 맨 위 페이지를 인쇄하는 top() 메소드에 액세스하는 것을 의미합니다. 다시 한번, 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참고하세요 사전 및 사후 작업을 사용할 때 다음 두 가지 사항을 참조하세요. 현재 작업이 작업 방법을 정의하지 않고 템플릿 파일을 직접 렌더링하는 경우 사전 및 사후 메서드가 정의되어 있으면 계속 적용됩니다. 실제 템플릿 출력은 현재 작업일 수 있으며 사전 및 사후 작업에는 일반적으로 출력이 없습니다. 일부 메소드에서 종료 또는 오류 출력을 사용하는 경우 사후 메소드가 더 이상 실행되지 않을 수 있으므로 주의해야 합니다. 예를 들어, 현재 작업에서 시스템 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를 read() 메소드의 매개변수 $id에 직접 매핑합니다. , 이제 되돌아보면 라우팅 규칙은 실제로 URL을 사용자 정의하는 기능을 제공합니다. 위의 라우팅 설정을 제거한 경우 올바른 액세스 방법은 다음과 같습니다.
http://localhost:8999/Home/index/read/id/3
위 URL의 id는 변수 이름으로 쓰면 됩니다. as:
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/12http ://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에 다시 액세스하면 다음이 출력됩니다.
0
tips: 바인딩 매개변수에 대한 기본값을 설정하는 것이 좋습니다. 오류를 피하는 방법실제 개발에서는 다음과 같이 표시된 변수 이름과 같은 URL이 없습니다.
http://localhost:8999/index.php/Home/index/read/3
How 그것을 해결하기 위해? 이때 실제로 두 번째 유형의 매개변수 바인딩인 가변 순서 바인딩을 사용할 수 있습니다. 이 매개변수 바인딩을 사용하려면 먼저 설정에서 설정해야 합니다.
'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?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()方法
<?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, '页面跳转中...');
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!
相关推荐:
关于thinkphp3.2嵌入百度编辑器ueditor的解析
위 내용은 ThinkPHP 컨트롤러 분석 정보의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

phpsession 실패 이유에는 구성 오류, 쿠키 문제 및 세션 만료가 포함됩니다. 1. 구성 오류 : 올바른 세션을 확인하고 설정합니다. 2. 쿠키 문제 : 쿠키가 올바르게 설정되어 있는지 확인하십시오. 3. 세션 만료 : 세션 시간을 연장하기 위해 세션을 조정합니다 .GC_MAXLIFETIME 값을 조정하십시오.

PHP에서 세션 문제를 디버그하는 방법 : 1. 세션이 올바르게 시작되었는지 확인하십시오. 2. 세션 ID의 전달을 확인하십시오. 3. 세션 데이터의 저장 및 읽기를 확인하십시오. 4. 서버 구성을 확인하십시오. 세션 ID 및 데이터를 출력, 세션 파일 컨텐츠보기 등을 통해 세션 관련 문제를 효과적으로 진단하고 해결할 수 있습니다.

Session_Start ()로 여러 통화를하면 경고 메시지와 가능한 데이터 덮어 쓰기가 발생합니다. 1) PHP는 세션이 시작되었다는 경고를 발행합니다. 2) 세션 데이터의 예상치 못한 덮어 쓰기를 유발할 수 있습니다. 3) Session_status ()를 사용하여 반복 통화를 피하기 위해 세션 상태를 확인하십시오.

SESSION.GC_MAXLIFETIME 및 SESSION.COOKIE_LIFETIME을 설정하여 PHP에서 세션 수명을 구성 할 수 있습니다. 1) SESSION.GC_MAXLIFETIME 서버 측 세션 데이터의 생존 시간을 제어합니다. 2) 세션 .Cookie_Lifetime 클라이언트 쿠키의 수명주기를 제어합니다. 0으로 설정하면 브라우저가 닫히면 쿠키가 만료됩니다.

데이터베이스 스토리지 세션 사용의 주요 장점에는 지속성, 확장 성 및 보안이 포함됩니다. 1. 지속성 : 서버가 다시 시작 되더라도 세션 데이터는 변경되지 않아도됩니다. 2. 확장 성 : 분산 시스템에 적용하여 세션 데이터가 여러 서버간에 동기화되도록합니다. 3. 보안 : 데이터베이스는 민감한 정보를 보호하기 위해 암호화 된 스토리지를 제공합니다.

SessionHandlerInterface 인터페이스를 구현하여 PHP에서 사용자 정의 세션 처리 구현을 수행 할 수 있습니다. 특정 단계에는 다음이 포함됩니다. 1) CustomsessionHandler와 같은 SessionHandlerInterface를 구현하는 클래스 만들기; 2) 인터페이스의 방법 (예 : Open, Close, Read, Write, Despare, GC)의 수명주기 및 세션 데이터의 저장 방법을 정의하기 위해 방법을 다시 작성합니다. 3) PHP 스크립트에 사용자 정의 세션 프로세서를 등록하고 세션을 시작하십시오. 이를 통해 MySQL 및 Redis와 같은 미디어에 데이터를 저장하여 성능, 보안 및 확장 성을 향상시킬 수 있습니다.

SessionId는 웹 애플리케이션에 사용되는 메커니즘으로 사용자 세션 상태를 추적합니다. 1. 사용자와 서버 간의 여러 상호 작용 중에 사용자의 신원 정보를 유지하는 데 사용되는 무작위로 생성 된 문자열입니다. 2. 서버는 쿠키 또는 URL 매개 변수를 통해 클라이언트로 생성하여 보낸다. 3. 생성은 일반적으로 임의의 알고리즘을 사용하여 독창성과 예측 불가능 성을 보장합니다. 4. 실제 개발에서 Redis와 같은 메모리 내 데이터베이스를 사용하여 세션 데이터를 저장하여 성능 및 보안을 향상시킬 수 있습니다.

JWT 또는 쿠키를 사용하여 API와 같은 무국적 환경에서 세션을 관리 할 수 있습니다. 1. JWT는 무국적자 및 확장 성에 적합하지만 빅 데이터와 관련하여 크기가 크다. 2. 쿠키는보다 전통적이고 구현하기 쉽지만 보안을 보장하기 위해주의해서 구성해야합니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

SublimeText3 영어 버전
권장 사항: Win 버전, 코드 프롬프트 지원!

ZendStudio 13.5.1 맥
강력한 PHP 통합 개발 환경

MinGW - Windows용 미니멀리스트 GNU
이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

Eclipse용 SAP NetWeaver 서버 어댑터
Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기
