StartMVC开发手册

可以快速上手的开发文档

手册目录

控制器

控制器定义

框架核心控制器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('走丢了');
 }
}