详解PHP的Yii框架中的Controller控制器,yiicontroller
控制器是 MVC 模式中的一部分, 是继承yii\base\Controller类的对象,负责处理请求和生成响应。 具体来说,控制器从应用主体接管控制后会分析请求数据并传送到模型, 传送模型结果到视图,最后生成输出响应信息。
操作
控制器由 操作 组成,它是执行终端用户请求的最基础的单元,一个控制器可有一个或多个操作。
如下示例显示包含两个操作view and create 的控制器post:
namespace app\controllers;
use Yii;
use app\models\Post;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
class PostController extends Controller
{
public function actionView($id)
{
$model = Post::findOne($id);
if ($model === null) {
throw new NotFoundHttpException;
}
return $this->render('view', [
'model' => $model,
]);
}
public function actionCreate()
{
$model = new Post;
if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->redirect(['view', 'id' => $model->id]);
} else {
return $this->render('create', [
'model' => $model,
]);
}
}
}
在操作 view (定义为 actionView() 方法)中, 代码首先根据请求模型ID加载 模型, 如果加载成功,会渲染名称为view的视图并显示,否则会抛出一个异常。
在操作 create (定义为 actionCreate() 方法)中, 代码相似. 先将请求数据填入模型, 然后保存模型,如果两者都成功,会跳转到ID为新创建的模型的view操作,否则显示提供用户输入的create视图。
路由
终端用户通过所谓的路由寻找到操作,路由是包含以下部分的字符串:
模型ID: 仅存在于控制器属于非应用的模块;
控制器ID: 同应用(或同模块如果为模块下的控制器)下唯一标识控制器的字符串;
操作ID: 同控制器下唯一标识操作的字符串。
路由使用如下格式:
ControllerID/ActionID
如果属于模块下的控制器,使用如下格式:
ModuleID/ControllerID/ActionID
如果用户的请求地址为 http://hostname/index.php?r=site/index, 会执行site 控制器的index 操作。
创建控制器
在yii\web\Application网页应用中,控制器应继承yii\web\Controller 或它的子类。 同理在yii\console\Application控制台应用中,控制器继承yii\console\Controller 或它的子类。 如下代码定义一个 site 控制器:
namespace app\controllers;
use yii\web\Controller;
class SiteController extends Controller
{
}
控制器ID
通常情况下,控制器用来处理请求有关的资源类型,因此控制器ID通常为和资源有关的名词。 例如使用article作为处理文章的控制器ID。
控制器ID应仅包含英文小写字母、数字、下划线、中横杠和正斜杠, 例如 article 和 post-comment 是真是的控制器ID,article?, PostComment, admin\post不是控制器ID。
控制器Id可包含子目录前缀