TOP

一次框架性能的比较,引起了我对搭建web框架的兴趣(二)
2019-12-18 11:19:20 】 浏览:373次 本网站的内容取自网络,仅供学习参考之用,绝无侵犯任何人知识产权之意。如有侵犯请您及时与本人取得联系,万分感谢。
Tags:一次 框架 性能 比较 引起 搭建 web 兴趣

那么现在就很清楚了,当程序使用了一个还未加载的类时,会调用什么方法?

当然是loadClass方法,再来看看loadClass方法。

# ClassLoader.php 
public function loadClass($class)
{
    if ($file = $this->findFile($class)) {
        includeFile($file);

        return true;
    }
}

根据方法的名称就能看出它的功能:1、找到文件 2、加载文件。

总结一下Composer的运行机制:

1、在composer require安装时,更新ClassLoader类的属性

2、运行对象时(new \Test()),如果未加载就会执行loadClass(),通过首字符找到命名空间以及长度,再根据命名空间以及长度找到文件,最后include文件

以上就是Composer的运行机制,接下来,就进入真正的框架搭建了。

二、框架前期准备

在正式进入搭建框架之前,先看下整体的架构图以及一些前期准备。

3

整个架构跟Laravel、ThinkPHP等框架是差不多的,一次请求,一次返回,一个入口,中间根据路由规则交给相应的控制器去执行,在控制器中处理数据以及视图

接下来做一些前期准备,进入phoenix项目。

# vi index.php 一个入口
ini_set('display_errors', 1); # 显示错误
error_reporting(-1);

require_once __DIR__.'/vendor/autoload.php'; # 引入核心加载类

$name = $_GET['name'];
dump($name);
# dump()
composer require symfony/var-dumper  # 类似var_dump,输出的变量体验更好些。

配置Nginx,访问域名为:http://dev.phoenix.goods/?name=SexyPhoenix, 可以正常显示SexyPhoenix。

三、HttpFoundation组件封装Request、Response

现有的程序只是一个面向过程的代码,一个简单的请求,响应。

对于搭建web框架,这种痛苦写法当然是要被舍弃的,OOP编程才是正路。

既然要面向对象编程,首先要做的就是对流程中的Request、Response进行封装。而Symfony中专门的组件。

composer require symfony/http-foundation

HttpFoundation组件使用说明

改造代码

# index.php

ini_set('display_errors', 1);
error_reporting(-1);

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

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

$request = Request::createFromGlobals(); # 创建request对象

$name = $request->get('name', 'World'); # 获取参数,可移入控制器或从模型得到数据

$response = new Response();

$response->setContent('<b>Hello '.$name.'</b>'); # 设置内容,可用view处理

$response->send(); # 返回

下面来做一个简单的分析。

$request = Request::createFromGlobals();

这一行代码,是相当重要的,它从对象层面上处理了php的全局变量,例如 GET,POST,SESSION......。

4

这样处理就可以轻易的从request对象中获取所需要的信息以及对请求头等信息的修改。

后期路由这些附加的信息也是存在request的attributes属性中,及其好用。

$response = new Response();

通过response对象,可以轻易的控制返回的信息。比如头信息的各种缓存策略......

四、路由处理

从架构图上看,接着就要处理路由了。

phoneix框架用了普遍的做法,统一index.php入口。

那么下面要做的就是如何将路由的附加参数和要处理的控制器进行映射。

对于路由一般框架都是通过配置来的,这里也一样做成可配置,方便。

Yaml格式配置路由

在phoenix项目下,创建routes文件夹,在routes下继续创建web.yaml文件。

dashboard:
    path: /dashboard
    defaults: { 
        _controller: 'App\Http\Controllers\DashboardController::index'
    }

下载symfony的Config组件、Yaml组件、Routing组件。

composer require symfony/config
composer require symfony/yaml
composer require symfony/routing

Config组件使用说明

更新代码

# index.php
ini_set('display_errors', 1);
error_reporting(-1);

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

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Loader\YamlFileLoader; # add 
use Symfony\Component\Config\FileLocator; # add

$request = Request::createFromGlobals();

$fileLoader = new YamlFileLoader(new FileLocator(array(__DIR__))); # add
$collection = $fileLoader->load('routes/web.yaml'); # add

$name = $request->get('name', 'World');

$response = new Response();

$response->setContent('<b>Hello '.$name.'</b>');

$response->send();

dump($collection),可以看到返回了路由的Collection对象,里面有定义的路由。

5

这个时候,框架只是得到了定义的路由,但还没有和URL做映射,下面改造继续。

URL和配置路由映射

ini_set('display_errors', 1);
error_reporting(-1);

require_once __  
		

请关注公众号获取更多资料


一次框架性能的比较,引起了我对搭建web框架的兴趣(二) https://www.cppentry.com/bencandy.php?fid=97&id=272915

首页 上一页 1 2 3 4 5 6 7 下一页 尾页 2/7/7
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇设计模式随笔 下一篇k8s~跨namespace的service相互访问

评论

验 证 码:
表  情:
内  容: