构建自个儿的PHP框架-抽象Controller的基类
上一篇博客中,我们将简单的路由解析和执行,从入口文件public/index.php中移入到框架中。入口文件顿时变得清爽无比~~
但是,去我们的controller里看一下,会看到如下的code:
public function actionView() { $body = 'Test body information'; require '../views/site/view.php'; }
难道我们每写一个要去渲染页面的action,都要去找相应路径的view,然后把它require进来。肯定不能这样,所以我们要抽象出一个Controller的基类,实现一个渲染页面的方法,让其他的controller继承,就可以使用相应的方法。
不用说,这个controller的基类肯定要写到框架里。而且也要写两个,一个放在base中,一个放在web中,web中的Controller继承base中的。
先来看在base中的
phpnamespace sf\base;/** * Controller is the base class for classes containing controller logic. * @author Harry Sun */class Controller{}
只有一个空类,等待添加内容。
再来看web中的
phpnamespace sf\web;/** * Controller is the base class for classes containing controller logic. * @author Harry Sun */class Controller extends \sf\base\Controller{ /** * Renders a view * @param string $view the view name. * @param array $params the parameters (name-value pairs) that should be made available in the view. */ public function render($view, $params = []) { extract($params); return require '../views/' . $view . '.php'; }}
可以看到,我们首先从数组中把变量导入到当前的符号表中,然后引入相应的view页面。
然后,在SiteController,我们只需要这么写就可以了。
phpnamespace app\controllers;use sf\web\Controller;class SiteController extends Controller{ public function actionTest() { echo 'success!'; } public function actionView() { $this->render('site/view', ['body' => 'Test body information']); }}
然后,访问http://localhost/simple-framework/public/index.php?r=site/view,就可以看到跟之前一样的页面了。
我们来完善一下base中的Controller
phpnamespace sf\base;/** * Controller is the base class for classes containing controller logic. * @author Harry Sun */class Controller{ /** * @var string the ID of this controller. */ public $id; /** * @var Action the action that is currently being executed. */ public $action;}
添加了两个属性,分别来记录当前的controller和action。
然后,我们要在解析router之后,将其赋值,code如下:
phpnamespace sf\web;/** * Application is the base class for all application classes. * @author Harry Sun */class Application extends \sf\base\Application{ /** * Handles the specified request. * @return Response the resulting response */ public function handleRequest() { $router = $_GET['r']; list($controllerName, $actionName) = explode('/', $router); $ucController = ucfirst($controllerName); $controllerNameAll = $this->controllerNamespace . '\\' . $ucController . 'Controller'; $controller = new $controllerNameAll(); $controller->id = $controllerName; $controller->action = $actionName; return call_user_func([$controller, 'action'. ucfirst($actionName)]); }}
然后我们就可以在controller和view中拿到相应的controller名字和action名字了,将view.php修改如下:
html> head> title>titletitle> head> body> php echo $this->id;?>br/> php echo $this->action;?>br/> php echo $body;?> body>html>
然后我们就可以看到如下的页面了
有人觉得现在大家都前后端分离了,我们不需要用PHP去render一个页面,只需要返回一个josn字符串就好了,这个就更简单了,在web的Controller中添加一个toJson方法即可
/** * Convert a array to json string * @param string $data */ public function toJson($data) { if (is_string($data)) { return $data; } return json_encode($data); }
将SiteController中的actionTest,修改如下:
public function actionTest() { $data = ['first' => 'awesome-php-zh_CN', 'second' => 'simple-framework']; echo $this->toJson($data); }
访问http://localhost/simple-framework/public/index.php?r=site/view,你就可以看到相应的json字符串了。
好了,今天就先到这里。项目内容和博客内容也都会放到Github上,欢迎大家提建议。
code:https://github.com/CraryPrimitiveMan/simple-framework/tree/0.3
blog project:https://github.com/CraryPrimitiveMan/create-your-own-php-framework
相关文章
相关视频
专题推荐
-
独孤九贱-php全栈开发教程
全栈 170W+
主讲:Peter-Zhu 轻松幽默、简短易学,非常适合PHP学习入门
-
玉女心经-web前端开发教程
入门 80W+
主讲:灭绝师太 由浅入深、明快简洁,非常适合前端学习入门
-
天龙八部-实战开发教程
实战 120W+
主讲:西门大官人 思路清晰、严谨规范,适合有一定web编程基础学习
- 最新文章
- 热门排行
推荐阅读
-
构建自己的PHP框架--抽象Controller的基类
-
Zend Framework教程之动作的基类Zend_Controller_Action详解_php实例
-
构建自己的PHP框架--抽象框架的内容,php框架--抽象_PHP教程
-
Zend Framework教程之动作的基类Zend_Controller_Action详解,controller基类_PHP教程
-
构建自己的PHP框架--抽象Controller的基类_PHP教程
-
Zend Framework教程之动作的基类Zend_Controller_Action详解_PHP
-
构建自己的PHP框架--实现Model类3
-
构建自己的PHP框架实现Model类(3)
-
构建自己的PHP框架--抽象Controller的基类
-
构建自己的PHP框架--抽象Controller的基类
网友评论
文明上网理性发言,请遵守 新闻评论服务协议
我要评论