控制器
由于新版取消了核心内置的基础控制器类,改为提供了项目的基础控制器类app\BaseController,因此你可以随意更改该基类来满足你的项目需求,事实上你完全可以不使用这个基类。还在抱怨没有了error和success方法?不要抱怨核心简化,事实上你现在拥有了一片新的森林。
比如,你可以安装thinkphp-jump扩展来支持之前的error和success等用法。
composer require liliuwei/thinkphp-jump
然后在你的控制器里面添加Trait即可使用5.1版本的success/error/redirect/result方法。
use \liliuwei\think\Jump;
控制器类是否需要继承基类取决于你的项目需求,大多数情况下,借助依赖注入和中间件,基本不需要继承任何基类已经足够满足需求,让控制器回归简单是一个不错的选择。
控制器不要写过多业务逻辑相关的代码,业务逻辑应当尽量交给模型层或者逻辑层,控制器作为接口和调度、输出响应即可,同时保持业务逻辑的可测试性。
控制器类后缀
如果你需要添加控制器类的后缀,例如把User控制器类改成UserController控制器类,你需要在路由配置文件中配置
// 使用控制器后缀
'controller_suffix' => true,
这样可以避免在控制器类中引入同名的模型冲突的问题,如果不使用后缀,就需要使用use别名。
框架对于模型类或者其它类库是否使用类后缀,没有任何的要求,因为这些类都是完全由应用自己实例化调用的,框架并不会自动调用(也不再提供model助手函数之类),所以你你的类名是什么,就实例化什么类就行了。
多级控制器
如果你的控制器比较多,为了便于管理,可以支持子目录方式,例如:
<?php
namespace app\controller\user;
class Blog
{
public function index() {
}
}
我们可以使用下面的URL方式访问多级控制器
http://tp.com/user.Blog/index
如果你使用的是PHP内置的WEB服务器测试,出现访问错误的情况,请使用下面的代码替换public目录下的router.php文件内容。
<?php
if (is_file($_SERVER["DOCUMENT_ROOT"] . $_SERVER["SCRIPT_NAME"])) {
return false;
} else {
$_SERVER["SCRIPT_FILENAME"] = DIR . '/index.php';
require DIR . "/index.php";
}
但通常为了URL规范,我们建议使用路由方式
Route::get('user/blog/index', 'user.Blog/index');
理论上子目录的层级是没有限制的。
渲染输出
默认情况下,控制器的输出全部采用return的方式,无需进行任何的手动输出,系统会自动完成渲染内容的输出。
下面都是有效的输出方式:
<?php
namespace app\index\controller;
class Index
{
public function hello()
{
// 输出hello,world!
return 'hello,world!';
}
public function json()
{
// 输出JSON
return json($data);
}
public function read()
{
// 渲染默认模板输出
return view();
}
}
控制器一般不需要任何输出,直接return即可。并且控制器在json请求会自动转换为json格式输出。
不要在控制器中使用包括die、exit在内的中断代码。如果你需要调试并中止执行,可以使用系统提供的halt助手函数。
halt('输出测试');
发表评论