一次框架性能的比较,引起了我对搭建web框架的兴趣 (4)

http-kernel组件,是框架的内核,很重要的组件,它提供了各种钩子,及其方便框架扩展,也提供了控制器及其参数的“解析器”(这里需要了解下php的反射机制)。

更新index.php代码。

# index.php ...... use Symfony\Component\HttpKernel\Controller\ControllerResolver; # add use Symfony\Component\HttpKernel\Controller\ArgumentResolver; # add ...... $route = $matcher->match($request->getPathInfo()); $request->attributes->add($route); # add 将路由映射关系写入request对象的附加属性中。 $controller = (new ControllerResolver())->getController($request); # add 处理控制器 $arguments = (new ArgumentResolver())->getArguments($request, $controller); # add 处理方法的参数 $response = call_user_func_array($controller, $arguments); $response->send();

更新DashboardController.php代码。

namespace App\Http\Controllers; use Symfony\Component\HttpFoundation\Request; # add use Symfony\Component\HttpFoundation\Response;# add class DashboardController{ public function index(Request $request) # # add { $name = $request->get('name', 'world'); # add return new Response('Hello '.$name); # add } }

用http-kernel好处就是可以处理各种问题,比如Request作为参数注入。

访问 ?name=SexyPhoenix, 得到 Hello SexyPhoenix。

http-kernel组件的使用说明

六、分离模板(V)

现在的框架只是简单的输出字符串,在正式环境中当然不可能这么简单,要能够返回正常的HTML页面。

而复杂的HTML也不能放在控制器中处理,需要分离出来,单独处理。Symfony为框架同样提供了相关的组件。

composer require symfony/templating

Templating组件使用说明

处理框架的目录结构。

在phoenix项目下,创建resources/views文件夹,继续在views下创建dashboard.php文件。

# dashboard.php <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta content="width=device-width, initial-scale=1"> <title>Phoenix</title> <style> html, body { color: #000; font-family: 'Raleway', sans-serif; font-weight: 100; height: 100vh; margin: 0; } </style> </head> <body> <div> <h2>Hello, <b><?php echo $name?></b></h2> <h3>your mailbox:<?php echo $email?></h3> <h3>your github:<?php echo $github?></h3> </div> </body> </html>

在app/Http/Controllers下创建Controller.php文件。

# Controller.php namespace App\Http\Controllers; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Templating\PhpEngine; use Symfony\Component\Templating\TemplateNameParser; use Symfony\Component\Templating\Loader\FilesystemLoader; class Controller { /** * $templete 模板文件 * $data 数据 */ public function render($templete, array $data) { return new Response( (new PhpEngine( new TemplateNameParser(), new FilesystemLoader(getcwd().'/resources/views/%name%') )) ->render($templete, $data) ); } }

改造DashboardController.php 代码。

namespace App\Http\Controllers; use Symfony\Component\HttpFoundation\Request; class DashboardController extends Controller{ # 继承Controller public function index(Request $request) { $name = $request->get('name', 'world'); $data = [ 'name' => $name, 'email' => 'sexyphoenix@163.com', 'github' => 'https://github.com/SexyPhoenix' ]; return $this->render('dashboard.php', $data); } }

访问 ?name=SexyPhoenix, 页面正常显示。

9

七、分离模型(M)

分离完模板后,架构的数据还是在控制器中处理,同样要做分离。不过这一步,同学们可以根据自己的意愿来,比如你可以添加仓库层、服务层等。

这里就做简单点,在app目录下,创建Models文件夹,继续创建User.php文件。

# User.php namespace App\Models; class User { protected $emails = []; protected $githubs = []; public function getEmailByName(string $name) { $this->setEmails(); return array_key_exists($name, $this->emails) ? $this->emails[$name] : ''; } public function getGithubByName($name) { $this->setGithubs(); return array_key_exists($name, $this->githubs) ? $this->githubs[$name] : ''; } public function setEmails() { $this->emails = [ 'SexyPhoenix' => 'sexyphoenix@163.com' ]; } public function setGithubs() { $this->githubs = [ 'SexyPhoenix' => 'https://github.com/SexyPhoenix' ]; } }

更新DashboardController.php。

# DashboardController.php ...... use App\Models\User #add ...... public function index(Request $request) { $name = $request->get('name', 'world'); $user = new User(); # add $data = [ 'name' => $name, 'email' => $user->getEmailByName($name), # update 'github' => $user->getGithubByName($name),# update ]; return $this->render('dashboard.php', $data); }

访问页面,正常显示。

八、剥离核心代码

框架的基本架构已经搭建完成,但此时的核心代码都写在了index.php里面,另写项目的话,无法复用此架构,接下来剥离出核心代码。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwxwyx.html