资讯专栏INFORMATION COLUMN

来!狂撸一款PHP现代化框架 (准备工作)

JellyBool / 783人阅读

摘要:前期做任何一件事情都要有个前期准备工作。作为的规定,我们命名空间得有一个祖宗名字,这里我叫他神圣的至少需要一个库来存储这个项目创建一个文件用于进行包管理灰常简单,搞进来。

前言

从本章开始,我们继续造轮子,去完成一款类似于Laravel的现代化PHP框架,为什么说是现代化?因为他必须具备一下几点

遵守PSR-4编码规范

使用Composer进行包管理

标准的HTTP请求方式

优雅的使用设计模式

开始我们无需关心性能问题,先考虑框架具体需要实现哪些功能,这与实现业务就大不相同了,来!开始我的表演。

前期

做任何一件事情都要有个前期准备工作。

作为PSR-4的规定,我们命名空间得有一个祖宗名字,这里我叫他神圣的 《z_framework》

至少需要一个GITHUB库来存储这个项目 https://github.com/CrazyCodes...

创建一个composer.json文件用于进行包管理,灰常简单,phpunit搞进来。通过psr-4加载个项目命名

{
  "name": "z framework",
  "require-dev": {
    "phpunit/phpunit": "^7.0"
  },
  "autoload": {
    "psr-4": {
      "Zero": "src/Zero",
    }
  },
  "autoload-dev": {
    "psr-4": {
      "ZeroTests": "tests/"
    }
  }
}

最后我们就需要考虑下目录的结构及其我们第一步要完成的功能,核心的结构(这里并非只的项目结构哦。是框架的核心结构)暂且是这样

src

Zero

Config // 可能存放一些配置文件的解析器

Container // 容器的解析器

Http // 请求处理的一些工具

Routes // 路由处理的一些功能

Bootstrap.php // 这可能是一个启动脚本

Zero.php // 可能是核心的入口文件

tests // 测试目录

.gitignore

composer.json

LICENSE

README.md

路由

还记得第一次使用Laravel时我们第一步做的事情吗?是的,去研究路由,所以我们把路由作为框架的第一步。在研究路由前,我们要知道

http://www.domain.com/user/create

是如何实现的,php默认是必须请求index.php或者default.php的,上述链接实际隐藏了index.php或default.php ,这是Nginx等服务代理帮我们做到的优雅的链接,具体配置如下,实际与Laravel官方提供无差别

server {
  listen       80;
  server_name  www.zf.com;
  root          /mnt/app/z_framework/server/public;
  index         index.php index.html index.htm;

  location / {
     try_files $uri $uri/ /index.php?$query_string;
   }

  location ~ .php$ {
     fastcgi_pass   php71:9000;
     fastcgi_index  index.php;
     fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
     include        fastcgi_params;
  }
}

通过

try_files $uri $uri/ /index.php?$query_string;

去解析请求,通过上述可以得出

http://www.domain.com/user/create
=======
http://www.domain.com/index.php?user/create

好了,明白了其中奥秘后,我们开始路由的编写,在src/Routes/Route.php

namespace ZeroRoutes;
    
class Route 
{
}
实现

首先我们先创建一个简单的接口文件
src/Routes/RouteInterface.php

namespace ZeroRoutes;
    
interface RouteInterface
{
    public function Get($url, $callFile);
    
    public function Post($url, $callFile);
    
    public function Put($url, $callFile);
    
    public function Delete($url, $callFile);
}

从Get请求开始

namespace ZeroRoutes;
    
class Route implements RouteInterface
{
    public function Get($url, $callFile)
    {
    
    }
}

最后实现Get代码块

if (parent::isRequestMethod("GET")) { // 判读请求方式
                
    if (is_callable($callFile)) { // 判断是否是匿名函数
        return $callFile();
    }
    
    if ($breakUpString = parent::breakUpString($callFile)) { // 获取Get解析。既/user/create 
        header("HTTP/1.1 404 Not Found");
    }
    
    try {
        // 通过反射类获取对象 $breakUpString[0] = user
        $reflectionClass = new ReflectionClass("AppControllers" . $breakUpString[0]);
        // 实例化对象
        $newInstance     = $reflectionClass->newInstance();
        // 获取对象中的指定方法,$breakUpString[1] = create
        call_user_func([
            $newInstance,
            $breakUpString[1],
        ], []);
    } catch (ReflectionException $e) {
        header("HTTP/1.1 404 Not Found");
    }
} else {
    header("HTTP/1.1 404 Not Found");
}

return "";

如果你想测试上述代码,可使用phpunit,或者傻大粗的方式,这里便于理解使用傻大粗的方式

创建一个目录,随后按照Laravel的目录形式创建几个目录,


最后public/index.php文件中去调用路由

require_once "../../vendor/autoload.php";

Zeroero::Get("user", "UserController@create");

到这里我们就基本完成了路由的功能,下一章将完善路由的编码

致谢

感谢你看到这里,希望本篇可以帮到你。具体代码在 https://github.com/CrazyCodes...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/29755.html

相关文章

  • !狂撸一款PHP代化框架 (路由的设计)

    摘要:先从开始参照规定设定接口方法分别为,当然也是规范了以上标准请求。查看存储是否符合预期。包括测试对路由创建后是否为的实现。具体可查看致谢上述已完成了路由的基本设计,下一章将讲解从启动到请求路由映射到服务脚本的过程。 showImg(https://segmentfault.com/img/bVbk35Y?w=800&h=450); 前言 上一篇的标题改了一下,以一、二、三为章节对读者来说...

    trilever 评论0 收藏0
  • 看吧,这就是代化 PHP 该有的样子

    摘要:这大概是我没有及早使用,或多数开发者流连现状造成的。它就是,一个的框架。行为驱动开发是来自测试驱动开发的开发过程。简单的说,它就是经常可能一天几次将小块代码整合进基础代码当中的行为。 showImg(https://segmentfault.com/img/remote/1460000013769815); 这是一篇社区协同翻译的文章,已完成翻译,更多信息请点击 协同翻译介绍 。 文章...

    Tangpj 评论0 收藏0
  • 教你在不使用框架的情况下也能写出代化 PHP 代码

    摘要:毕竟,我们还将在接下来的开发之旅中使用其他框架开发者编写的辅助包。缺乏行业标准必然意味着,框架中的这些组件高度耦合。如果你尝试对这个类进行单元测试,会发现根本不可行。在做单元测试的时候,我们可以很好地模拟数据库连接,并将其传入使用。 showImg(https://segmentfault.com/img/remote/1460000014180802); 我为你们准备了一个富有挑战性...

    trigkit4 评论0 收藏0
  • 你不可不知道的20个优秀PHP框架

    摘要:每一个开发者都知道,拥有一个强大的框架可以让开发工作变得更加快捷安全和有效。官方网站是一款老牌的框架,现在稳定版本已经是了。官方网站是由最大的社区之一的管理开发的,也是一个开源的框架。 对于Web开发者来说,PHP是一款非常强大而又受欢迎的编程语言。世界上很多顶级的网站都是基于PHP开发的。 每一个开发者都知道,拥有一个强大的框架可以让开发工作变得更加快捷、安全和有效。在开发项目之前选...

    zombieda 评论0 收藏0
  • CodeIgniter 4 建议路线图

    摘要:核心变化从第一版发布以来,社区发生了巨大变化。这意味着系统必须全部重写。暂时不会为一个即将停止支持的版本发布新版本。路由路由功能将被更新。改进的日志系统日志系统将被改进,但具体细节尚未确定。第一阶段第一阶段将侧重于抓住框架最重要的部分。 我们综合考虑了社区的愿望和意见后,也对什么样的未来对 CI 是最合适的做了一些思考,然后,CI 理事会对框架的未来做出了一些决策。预告一下,未来将会有...

    sean 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<