控制器定义
框架核心控制器Controller,位于/startmvc/core/Controller.php
公共控制器BaseController,位于/app/common/BaseController.php,继承于核心控制器Controller。相当于核心控制器的扩展。
自定义控制器存放在模块下的controller目录下,根据自己需要,可直接继承核心Controller或BaseController,控制器为一个类,一个控制器类就是一个php文件。
控制器规范
控制器类名为:控制器名称Controller(首字母大写)。
控制器文件名为:控制器名称Controller.php(首字母大写)。
遵循大驼峰写法,比如类名 UserController对应文件UserController.php
控制器的命名空间为:app\模块\controller。
创建控制器
// app/home/controller/IndexController.php
namespace app\home\controller;
use app\common\BaseController;
class IndexController extends BaseController {
// code
}创建成员方法
控制器类的成员方法访问权限必须为public,方法名为:方法名+Action。遵循小驼峰写法,比如userAction(),userProfileAction()。
代码如下:
namespace app\home\controller;
use app\common\BaseController;
class IndexController extends BaseController {
public function helloAction() {
return 'hello world';
}
// /home/index/hello 可访问,输出:hello world
}成员方法传参
一般通过url传入参数
function indexAction($a, $b){
echo $a + $b;
}
// /home/index/index/1/2 输出:3
function indexAction($name){
echo 'hello ' . $name;
}
// /home/index/index/world 输出: hello world传参时建议给一个默认值,防止报错
function indexAction($name = 'world'){
echo 'hello, ' . $name;
}
// /home/index/index 输出: hello world防止注入攻击,可以给参数带上数据类型
function indexAction(int $id = 0){
// code
} 方法依赖注入(v2.9.5+)
成员方法中的类类型参数会由容器自动注入,无需通过url传递;其余参数仍按位置依次接收url或路由参数。
use startmvc\core\Request;
function showAction(Request $request, $id){
$page = $request->input('page');
// $id 来自url:/home/index/show/42
}框架在入口处创建的Request实例会贯穿中间件管道,注入的就是当前请求本身,中间件中附加的状态可直接读取:
// 某中间件内
$request->tenant = 'demo';
// 控制器内
function showAction(Request $request){
$tenant = $request->tenant; // 'demo'
}也可以通过控制器基类属性 $this->request 访问(Controller已内置):
function indexAction(){
$isAjax = $this->request->isAjax();
}说明:无类类型提示的方法行为与旧版完全一致,不受影响;控制器构造函数同样支持类类型依赖注入(控制器经容器实例化)。
控制器的更多方法
控制器就是一个标准的php类,所以控制器支持php的特性,比如私有属性,私有方法,魔术方法
namespace app\home\controller;
use app\common\BaseController;
class IndexController extends BaseController{
private $name; //声明控制器的一个私有属性
function __construct(){
parent::__construct(); // 如果控制器有构造函数,就一定要调用父类的构造函数
/*************
控制器构造函数,主要用来在创建对象时初始化对象,控制器下所有成员方法都将执行此处代码
**************/
}
function indexAction(){
$this->setName('小明');
$data['name'] = $this->name;
$this->assign($data);
//$this->assign('data',$data);
$this->display();
}
private function setName($name){ //创建控制器的私有方法,无法通过URL访问。
$this->name = $name;
}
function __call($name, $arguments){ //PHP类的魔术方法
$this->content('走丢了');
}
}