• 构建自己的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中的

    <?php
    namespace sfase;
    
    /**
     * Controller is the base class for classes containing controller logic.
     * @author Harry Sun <sunguangjun@126.com>
     */
    class Controller
    {
    }

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

    再来看web中的

    <?php
    namespace sfweb;
    
    /**
     * Controller is the base class for classes containing controller logic.
     * @author Harry Sun <sunguangjun@126.com>
     */
    class Controller extends sfaseController
    {
        /**
         * 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,我们只需要这么写就可以了。

    <?php
    namespace appcontrollers;
    
    use sfwebController;
    
    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

    <?php
    namespace sfase;
    
    /**
     * Controller is the base class for classes containing controller logic.
     * @author Harry Sun <sunguangjun@126.com>
     */
    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如下:

    <?php
    namespace sfweb;
    
    /**
     * Application is the base class for all application classes.
     * @author Harry Sun <sunguangjun@126.com>
     */
    class Application extends sfaseApplication
    {
        /**
         * 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>title</title>
        <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

  • 相关阅读:
    springboot 默认日志
    redis 实现分布式锁
    java 线程池等待所有线程执行完毕
    java 线程池
    springcould 五大组件详解
    java 导出excel
    java 下载excel模板
    java 8 通过某个字段去重
    leetcode算法题-461.汉明距离
    java Barcode4j生成条形码并添加至pdf打印
  • 原文地址:https://www.cnblogs.com/CraryPrimitiveMan/p/4790133.html
Copyright © 2020-2023  润新知