search
HomeBackend DevelopmentPHP Tutorial构建自个儿的PHP框架-抽象Controller的基类

构建自己的PHP框架--抽象Controller的基类

上一篇博客中,我们将简单的路由解析和执行,从入口文件public/index.php中移入到框架中。入口文件顿时变得清爽无比~~

但是,去我们的controller里看一下,会看到如下的code:

    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> actionView()    {        </span><span style="color: #800080;">$body</span> = 'Test body information'<span style="color: #000000;">;        </span><span style="color: #0000ff;">require</span> '../views/site/view.php'<span style="color: #000000;">;    }</span>

难道我们每写一个要去渲染页面的action,都要去找相应路径的view,然后把它require进来。肯定不能这样,所以我们要抽象出一个Controller的基类,实现一个渲染页面的方法,让其他的controller继承,就可以使用相应的方法。

不用说,这个controller的基类肯定要写到框架里。而且也要写两个,一个放在base中,一个放在web中,web中的Controller继承base中的。

先来看在base中的

<span style="color: #000000;">phpnamespace sf\base;</span><span style="color: #008000;">/*</span><span style="color: #008000;">* * Controller is the base class for classes containing controller logic. * @author Harry Sun  </span><span style="color: #008000;">*/</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Controller{}</span>

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

再来看web中的

<span style="color: #000000;">phpnamespace sf\web;</span><span style="color: #008000;">/*</span><span style="color: #008000;">* * Controller is the base class for classes containing controller logic. * @author Harry Sun  </span><span style="color: #008000;">*/</span><span style="color: #0000ff;">class</span> Controller <span style="color: #0000ff;">extends</span><span style="color: #000000;"> \sf\base\Controller{    </span><span style="color: #008000;">/*</span><span style="color: #008000;">*     * 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.     </span><span style="color: #008000;">*/</span>    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> render(<span style="color: #800080;">$view</span>, <span style="color: #800080;">$params</span> =<span style="color: #000000;"> [])    {        </span><span style="color: #008080;">extract</span>(<span style="color: #800080;">$params</span><span style="color: #000000;">);        </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">require</span> '../views/' . <span style="color: #800080;">$view</span> . '.php'<span style="color: #000000;">;    }}</span>

可以看到,我们首先从数组中把变量导入到当前的符号表中,然后引入相应的view页面。

然后,在SiteController,我们只需要这么写就可以了。

<span style="color: #000000;">phpnamespace app\controllers;</span><span style="color: #0000ff;">use</span><span style="color: #000000;"> sf\web\Controller;</span><span style="color: #0000ff;">class</span> SiteController <span style="color: #0000ff;">extends</span><span style="color: #000000;"> Controller{    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> actionTest()    {        </span><span style="color: #0000ff;">echo</span> 'success!'<span style="color: #000000;">;    }    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> actionView()    {        </span><span style="color: #800080;">$this</span>->render('site/view', ['body' => 'Test body information'<span style="color: #000000;">]);    }}</span>

然后,访问http://localhost/simple-framework/public/index.php?r=site/view,就可以看到跟之前一样的页面了。

我们来完善一下base中的Controller

<span style="color: #000000;">phpnamespace sf\base;</span><span style="color: #008000;">/*</span><span style="color: #008000;">* * Controller is the base class for classes containing controller logic. * @author Harry Sun  </span><span style="color: #008000;">*/</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Controller{    </span><span style="color: #008000;">/*</span><span style="color: #008000;">*     * @var string the ID of this controller.     </span><span style="color: #008000;">*/</span>    <span style="color: #0000ff;">public</span> <span style="color: #800080;">$id</span><span style="color: #000000;">;    </span><span style="color: #008000;">/*</span><span style="color: #008000;">*     * @var Action the action that is currently being executed.     </span><span style="color: #008000;">*/</span>    <span style="color: #0000ff;">public</span> <span style="color: #800080;">$action</span><span style="color: #000000;">;}</span>

添加了两个属性,分别来记录当前的controller和action。

然后,我们要在解析router之后,将其赋值,code如下:

<span style="color: #000000;">phpnamespace sf\web;</span><span style="color: #008000;">/*</span><span style="color: #008000;">* * Application is the base class for all application classes. * @author Harry Sun  </span><span style="color: #008000;">*/</span><span style="color: #0000ff;">class</span> Application <span style="color: #0000ff;">extends</span><span style="color: #000000;"> \sf\base\Application{    </span><span style="color: #008000;">/*</span><span style="color: #008000;">*     * Handles the specified request.     * @return Response the resulting response     </span><span style="color: #008000;">*/</span>    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> handleRequest()    {        </span><span style="color: #800080;">$router</span> = <span style="color: #800080;">$_GET</span>['r'<span style="color: #000000;">];        </span><span style="color: #0000ff;">list</span>(<span style="color: #800080;">$controllerName</span>, <span style="color: #800080;">$actionName</span>) = <span style="color: #008080;">explode</span>('/', <span style="color: #800080;">$router</span><span style="color: #000000;">);        </span><span style="color: #800080;">$ucController</span> = <span style="color: #008080;">ucfirst</span>(<span style="color: #800080;">$controllerName</span><span style="color: #000000;">);        </span><span style="color: #800080;">$controllerNameAll</span> = <span style="color: #800080;">$this</span>->controllerNamespace . '\\' . <span style="color: #800080;">$ucController</span> . 'Controller'<span style="color: #000000;">;        </span><span style="color: #800080;">$controller</span> = <span style="color: #0000ff;">new</span> <span style="color: #800080;">$controllerNameAll</span><span style="color: #000000;">();        </span><span style="color: #800080;">$controller</span>->id = <span style="color: #800080;">$controllerName</span><span style="color: #000000;">;        </span><span style="color: #800080;">$controller</span>->action = <span style="color: #800080;">$actionName</span><span style="color: #000000;">;        </span><span style="color: #0000ff;">return</span> <span style="color: #008080;">call_user_func</span>([<span style="color: #800080;">$controller</span>, 'action'. <span style="color: #008080;">ucfirst</span>(<span style="color: #800080;">$actionName</span><span style="color: #000000;">)]);    }}</span>

然后我们就可以在controller和view中拿到相应的controller名字和action名字了,将view.php修改如下:

<span style="color: #0000ff;"><span style="color: #800000;">html</span><span style="color: #0000ff;">></span>    <span style="color: #0000ff;"><span style="color: #800000;">head</span><span style="color: #0000ff;">></span>        <span style="color: #0000ff;"><span style="color: #800000;">title</span><span style="color: #0000ff;">></span>title<span style="color: #0000ff;"></span><span style="color: #800000;">title</span><span style="color: #0000ff;">></span>    <span style="color: #0000ff;"><span style="color: #800000;">head</span><span style="color: #0000ff;">></span>    <span style="color: #0000ff;"><span style="color: #800000;">body</span><span style="color: #0000ff;">></span>        <span style="color: #0000ff;"></span><span style="color: #ff00ff;">php echo $this->id;</span><span style="color: #0000ff;">?></span><span style="color: #0000ff;"><span style="color: #800000;">br</span><span style="color: #0000ff;">/></span>        <span style="color: #0000ff;"></span><span style="color: #ff00ff;">php echo $this->action;</span><span style="color: #0000ff;">?></span><span style="color: #0000ff;"><span style="color: #800000;">br</span><span style="color: #0000ff;">/></span>        <span style="color: #0000ff;"></span><span style="color: #ff00ff;">php echo $body;</span><span style="color: #0000ff;">?></span>    <span style="color: #0000ff;"></span><span style="color: #800000;">body</span><span style="color: #0000ff;">></span><span style="color: #0000ff;"></span><span style="color: #800000;">html</span><span style="color: #0000ff;">></span></span></span></span></span></span></span></span>

然后我们就可以看到如下的页面了

有人觉得现在大家都前后端分离了,我们不需要用PHP去render一个页面,只需要返回一个josn字符串就好了,这个就更简单了,在web的Controller中添加一个toJson方法即可

    <span style="color: #008000;">/*</span><span style="color: #008000;">*     * Convert a array to json string     * @param string $data     </span><span style="color: #008000;">*/</span>    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> toJson(<span style="color: #800080;">$data</span><span style="color: #000000;">)    {        </span><span style="color: #0000ff;">if</span> (<span style="color: #008080;">is_string</span>(<span style="color: #800080;">$data</span><span style="color: #000000;">)) {            </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$data</span><span style="color: #000000;">;        }        </span><span style="color: #0000ff;">return</span> json_encode(<span style="color: #800080;">$data</span><span style="color: #000000;">);    }</span>

将SiteController中的actionTest,修改如下:

    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> actionTest()    {        </span><span style="color: #800080;">$data</span> = ['first' => 'awesome-php-zh_CN', 'second' => 'simple-framework'<span style="color: #000000;">];        </span><span style="color: #0000ff;">echo</span> <span style="color: #800080;">$this</span>->toJson(<span style="color: #800080;">$data</span><span style="color: #000000;">);    }</span>

访问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

 

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
华为GT3 Pro和GT4的差异是什么?华为GT3 Pro和GT4的差异是什么?Dec 29, 2023 pm 02:27 PM

许多用户在选择智能手表的时候都会选择的华为的品牌,其中华为GT3pro和GT4都是非常热门的选择,不少用户都很好奇华为GT3pro和GT4有什么区别,下面就就给大家介绍一下二者。华为GT3pro和GT4有什么区别一、外观GT4:46mm和41mm,材质是玻璃表镜+不锈钢机身+高分纤维后壳。GT3pro:46.6mm和42.9mm,材质是蓝宝石玻璃表镜+钛金属机身/陶瓷机身+陶瓷后壳二、健康GT4:采用最新的华为Truseen5.5+算法,结果会更加的精准。GT3pro:多了ECG心电图和血管及安

SpringBoot扫描不到Controller怎么解决SpringBoot扫描不到Controller怎么解决May 14, 2023 am 08:10 AM

SpringBoot小白创建项目,扫描不到Controller一系列问题1.2.3.4.5.6.还有一种办法是在启动服务类的入门,添加@ComponentScan(basePackages={“xxx.xxx.xx”,“xxx.xxx.xx”})里面的是包的全限定名,可以为多个SpringBoot自定义controller无法扫描到SpringBoot自定义controller路由找不到,原因是启动类和自定义的Controller包不在同一级目录下。官方建议application.java放的位

Base DEX龙头 :Aerodrome VS CurveBase DEX龙头 :Aerodrome VS CurveMar 26, 2024 pm 04:31 PM

Velodrome模型是受veCRV启发的,旨在实现DEX三大关键参与者之间更为优越的一致性,包括流动性提供者(LPs)、代币持有者以及需要流动性的项目。然而,许多DeFi领域的参与者仍未完全理解其内在原因。通过深入阅读本文,您将能够摆脱这一困境,深入了解其中的奥秘。今天我们将探讨Velodrome/Aerodrome,在DeFi领域中属于一个真正成功的案例。本文将对这两种模式进行比较,并解释Velodrome是如何在veCRV模型上进行改进的,以及这些微小差异带来了哪些重大影响。首先,让我声明

修复:截图工具在 Windows 11 中不起作用修复:截图工具在 Windows 11 中不起作用Aug 24, 2023 am 09:48 AM

为什么截图工具在Windows11上不起作用了解问题的根本原因有助于找到正确的解决方案。以下是截图工具可能无法正常工作的主要原因:对焦助手已打开:这可以防止截图工具打开。应用程序损坏:如果截图工具在启动时崩溃,则可能已损坏。过时的图形驱动程序:不兼容的驱动程序可能会干扰截图工具。来自其他应用程序的干扰:其他正在运行的应用程序可能与截图工具冲突。证书已过期:升级过程中的错误可能会导致此issu简单的解决方案这些适合大多数用户,不需要任何特殊的技术知识。1.更新窗口和Microsoft应用商店应用程

golang中使用正则表达式验证输入是否为合法的base64字符串golang中使用正则表达式验证输入是否为合法的base64字符串Jun 24, 2023 am 10:01 AM

在Golang编程中,使用正则表达式验证输入是否为合法的base64字符串是一个相对常见的需求。对于开发者而言,通过使用正则表达式可以快速而准确地验证用户输入是否正确。本文将介绍如何使用Golang中的正则表达式来验证输入是否为合法的base64字符串。从基本语法开始在Golang中,使用正则表达式需要使用"regexp"库。该库提供了"Compile"和"

如何使用Java中的Base64函数进行编码和解码如何使用Java中的Base64函数进行编码和解码Jun 26, 2023 pm 02:24 PM

在java编程中,经常需要将二进制数据转换为文本格式进行传输,而Base64编码正是一种常用的转换方式。Base64将三个字节的数据转换成四个字节的文本数据,文本数据由64个字符组成,它只包含可打印字符,因此可以在电子邮件,HTTP请求报文等协议中传输。Java提供了Base64编码和解码的API,我们可以很方便地进行数据的转换。本文将介绍Java中如何使用

iOS的developer版和public版有什么区别?iOS的developer版和public版有什么区别?Mar 01, 2024 pm 12:55 PM

每年Apple发布新的iOS和macOS大版本之前,用户都可以提前几个月下载测试版抢先体验一番。由于公众和开发人员都使用该软件,所以苹果公司为两者推出了developer和public版即开发者测试版的公共测试版。iOS的developer版和public版有什么区别呢?从字面上的意思来说,developer版是开发者测试版,public版是公共测试版。developer版和public版面向的对象不同。developer版是苹果公司给开发者测试使用的,需要苹果开发者帐号才可以收到下载并升级,是

Laravel开发:如何使用Laravel View生成视图?Laravel开发:如何使用Laravel View生成视图?Jun 14, 2023 pm 03:28 PM

Laravel是目前最流行的PHP框架之一,其强大的视图生成能力是让人印象深刻的一点。视图是Web应用程序中展示给用户的页面或视觉元素,其中包含HTML、CSS和JavaScript等代码。LaravelView允许开发者使用结构化的模板语言来构建网页,同时通过控制器和路由生成相应的视图。在本文中,我们将探讨如何使用LaravelView生成视图。一、什

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

Repo: How To Revive Teammates
1 months agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
2 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: How To Get Giant Seeds
1 months agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Atom editor mac version download

Atom editor mac version download

The most popular open source editor

mPDF

mPDF

mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),

SublimeText3 Linux new version

SublimeText3 Linux new version

SublimeText3 Linux latest version

VSCode Windows 64-bit Download

VSCode Windows 64-bit Download

A free and powerful IDE editor launched by Microsoft

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Powerful PHP integrated development environment