博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
构建自己的PHP框架--抽象Controller的基类
阅读量:5800 次
发布时间:2019-06-18

本文共 2824 字,大约阅读时间需要 9 分钟。

上一篇博客中,我们将简单的路由解析和执行,从入口文件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中的

*/class Controller{}

只有一个空类,等待添加内容。

再来看web中的

*/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,我们只需要这么写就可以了。

render('site/view', ['body' => 'Test body information']); }}

然后,访问http://localhost/simple-framework/public/index.php?r=site/view,就可以看到跟之前一样的页面了。

我们来完善一下base中的Controller

*/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如下:

*/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修改如下:

            title                
id;?>
action;?>

然后我们就可以看到如下的页面了

有人觉得现在大家都前后端分离了,我们不需要用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:

blog project:

 

转载地址:http://dcafx.baihongyu.com/

你可能感兴趣的文章
《中国梦之声》新季开播 乐视生态“逆向造星”
查看>>
DHCP中继数据包互联网周游记
查看>>
Squid 反向代理服务器配置
查看>>
Java I/O操作
查看>>
Tomcat性能调优
查看>>
项目管理心得
查看>>
Android自学--一篇文章基本掌握所有的常用View组件
查看>>
灰度图像和彩色图像
查看>>
通过vb.net 和NPOI实现对excel的读操作
查看>>
TCP segmentation offload
查看>>
java数据类型
查看>>
数据结构——串的朴素模式和KMP匹配算法
查看>>
FreeMarker-Built-ins for strings
查看>>
验证DataGridView控件的数据输入
查看>>
POJ1033
查看>>
argparse - 命令行选项与参数解析(转)
查看>>
一维数组
查看>>
Linux学习笔记之三
查看>>
微信公众号
查看>>
POJ1061 青蛙的约会(扩展欧几里得)题解
查看>>