1、按照ThinkPHP的架构设计,所有的URL请求(无论是否采用了路由),最终都会定位到控制器。
2、为了更方便使用,控制器类建议继承系统的控制器基类 think\Controller ,有assign、fetch等方法可直接用。不继承的话可以用助手函数,但个人不喜欢助手函数。不继承时打印$this发现是空对象,没有任何方法,继承的话有一堆方法。
3、如果继承了控制器基类,可以定义控制器初始化方法initialize ,该方法会在调用该控制器的方法之前先执行。如防止重复登陆时可在登陆、注册、找回密码等方法前定义初始化方法(判断session)。另外一种情况:为了禁止不登陆直接进入后台首页、文章页等页面,可以建立Base控制器,并定义初始化方法(判断session),其它控制器继承该控制器。当执行继承该控制器的其它控制器的方法时,都会先运行此初始化方法,没有继承该Base控制器的其它控制器不受影响。这两种情况稍有区别。
4、一般一个方法对应一个模板,但当模板中有一些按钮等额外操作时,得单独定义方法,如列表页中的删除、激活等操作。建议多使用ajax提交,个人喜欢if判断和fetch模板写在一个方法中,好起名字,也省路由(可以做到一个模板对应一个方法)。其中,success和error跳转会自动判断请求是否是ajax请求,如果是,会给ajax返回数据,而不进行默认跳转。包括 redirect 、 success 和 error 方法在内的url地址参数不需要使用url方法,系统会自动调用url方法,否则会出现重复的url后缀。
5、控制器主要负责请求的接收,并调用相关的模型处理,并最终通过视图输出。tp认为“严格来说,控制器不应该过多的介入业务逻辑处理”。个人也喜欢下面的方式:控制器只传递数据,与数据库打交道的事全交给模型,控制器方法中的标准三步:接收数据、调用模型处理数据、返回数据给模板。在模型中定义方法:public function add($data),在控制器中调用:$result=model('model')->add($data)即可。建立模板<-->控制器<-->模型<-->验证器的回路。
6、注意return和echo,var_dump、dump、halt、return json()的区别。return主要是用于返回一个结果,echo用于返回一个字符串。对于非字符串,以后只用halt和var_dump。halt=dump+die;var_dump查看真实数据类型更清楚,dump和halt总是以数组形式返回。对于字符串,return和echo要注意。return有返回的意思,后面代码不执行;echo没有这意思。有的地方只能return,有的地方只能echo。
7、tpl设置的默认输出文件是html,不是json。json主要是ajax用的。json比XML好用,xml中好多标签,json没有标签,且是js的子集,与js完美配合。
8、前置操作,这比初始化方法更灵活。可以用于权限控制。前置方法中只能echo。
9、跳转的2个模板在thinkphp/tpl/dispatch_jump.tpl,可以在模板中设置相关信息。