zoukankan      html  css  js  c++  java
  • 构建自己的PHP框架--搭建基本结构

    首先,我们来说一下,为什么要创建自己的框架?

    为什么要创建自己的框架呢?如果你跟周围的人讨论,每个人都会告诉你重复发明轮子是一件糟糕的事情,你最好选择一个已有的框架,忘掉“创建自己的框架”这种想法。大部分情况,他们是正确的,但是我想到了几个创建自己的框架的好处:

    • 了解更多框架的底层架构
    • 创建一个能满足你特殊需求的框架(但首先要确定你的需求真的是很特别)
    • 因为乐趣而试着写一个框架(为了“学习然后抛弃”的目的)
    • 想利用新的开发技术以及最佳实践重构已经存在的项目
    • 向世界证明自己也是可以写出框架的(......但只需那么一点点付出)

    我将一步步的,循序渐进的引导你创建一个框架。每一步你得到的都是一个完全能使用的框架。我们将从一个简单的框架开始,然后一点点的给它加功能。最后,你将能得到一个完整的web框架。

    上面的原因是摘来的使用Symfony2的组件创建自己的PHP框架,觉得说的不错就直接拿过来用了。

    我们先建立一个目录,然后进入该目录

    mkdir simple-framework
    cd simple-framework

    然后分别建立放置controller/model/view等的目录

    mkdir controllers models views public

    public用来存放统一的入口,在里面建立index.php,大部分框架现在都是单一入口。

    然后我们需要支持以下composer,我们希望第三方的包都能通过composer来管理。如果你还不知道composer是什么,请查看composer

    在simple-framework文件夹下执行 composer init,然后填写相应内容,生成一个composer.json文件,其内容大概如下:

    {
        "name": "craryprimitiveman/simple-framework",
        "description": "A simple php framework",
        "license": "MIT",
        "authors": [
            {
                "name": "harrysun",
                "email": "sunguangjun@126.com"
            }
        ],
        "require": {}
    }

    让后修改以下,结果如下:

    {
        "name": "craryprimitiveman/simple-framework",
        "description": "A simple php framework",
        "license": "MIT",
        "authors": [
            {
                "name": "harrysun",
                "email": "sunguangjun@126.com"
            }
        ],
        "require": {},
        "autoload": {
            "psr-4": {
                "sf\": "src/",
                "app\": ""
            }
        },
        "repositories": [
            {"type": "composer", "url": "http://packagist.phpcomposer.com"},
            {"packagist": false}
        ]
    }

    其中的autoload是为了支持我们自己项目的文件加载,其中sf下的是framework的code,而app下的是正常业务罗辑的code,其中的repositories是为了解决在国内使用composer下载,下载不下来的问题,如果在国外,或者有VPN做代理,可以直接去掉。

    然后执行composer install。

    这样基本的目录结构就构建好了。

    在入口文件public/index.php中,引入autoload文件,如下:

    <?php
    require_once __DIR__ . '/../vendor/autoload.php';

    然后我们定义我们的url是这样的http://localhost/simple-framework/public/index.php?r=site/test,之后会加相应的nginx或apache的rewrite,是url变简洁好看,但暂时先这样。

    这个url访问了SiteController中的actionTest,下面我们来简单实现这个功能。

    <?php
    require_once __DIR__ . '/../vendor/autoload.php';
    
    $router = $_GET['r'];
    list($controllerName, $actionName) = explode('/', $router);
    $ucController = ucfirst($controllerName);
    $controllerName = 'app\controllers\' . $ucController . 'Controller';
    $controller = new $controllerName();
    return call_user_func_array([$controller, 'action'. ucfirst($actionName)];

    上面的code未添加任何的错误处理,只是一个简单的功能实现。

    然后在controllers文件夹中添加SiteController.php文件,内容如下:

    <?php
    namespace appcontrollers;
    
    class SiteController
    {
        public function actionTest()
        {
            echo 'success!';
        }
    }

    然后访问之前的url http://localhost/simple-framework/public/index.php?r=site/test,你会看到打印出了success!

    然后我们在来写一个actionView方法去渲染一个页面。actionView的代码如下:

        public function actionView()
        {
            $body = 'Test body information   ';
            require '../views/site/view.php';
        }

    我们还需要在views下面添加site文件夹,并在site文件夹下创建view.php文件,其内容如下:

    <html>
        <head>
            <title>title</title>
        <head>
        <body>
            <?php echo $body;?>
        </body>
    </html>

    最后访问http://localhost/simple-framework/public/index.php?r=site/view,会得到如下页面:

    好了,今天就先到这里。项目内容和博客内容也都会放到Github上,欢迎大家提建议。

    code:https://github.com/CraryPrimitiveMan/simple-framework/tree/0.1

    blog project:https://github.com/CraryPrimitiveMan/create-your-own-php-framework

  • 相关阅读:
    WCF message logging and tracing
    How to create a custom composite activity
    两个Datatable合并
    JS生成柱形图表
    InstallShiled12激活过程
    InstallShield Premier版本和Professional版本的功能差异
    InstallShield12注册过程
    Oracle回收站使用
    SQLite数据库管理的相关命令
    Installshield 2010 预安装组件或软件
  • 原文地址:https://www.cnblogs.com/CraryPrimitiveMan/p/4783512.html
Copyright © 2011-2022 走看看