构建自己的PHP框架--抽象Controller的基类,框架controller
构建自己的PHP框架--抽象Controller的基类,框架controller
上一篇博客中,我们将简单的路由解析和执行,从入口文件public/index.php中移入到框架中。入口文件顿时变得清爽无比~~
但是,去我们的controller里看一下,会看到如下的code:
<span>public</span> <span>function</span><span> actionView() { </span><span>$body</span> = 'Test body information'<span>; </span><span>require</span> '../views/site/view.php'<span>; }</span>
难道我们每写一个要去渲染页面的action,都要去找相应路径的view,然后把它require进来。肯定不能这样,所以我们要抽象出一个Controller的基类,实现一个渲染页面的方法,让其他的controller继承,就可以使用相应的方法。
不用说,这个controller的基类肯定要写到框架里。而且也要写两个,一个放在base中,一个放在web中,web中的Controller继承base中的。
先来看在base中的
<?<span>php namespace sf\base; </span><span>/*</span><span>* * Controller is the base class for classes containing controller logic. * @author Harry Sun <sunguangjun@126.com> </span><span>*/</span> <span>class</span><span> Controller { }</span>
只有一个空类,等待添加内容。
再来看web中的
<?<span>php namespace sf\web; </span><span>/*</span><span>* * Controller is the base class for classes containing controller logic. * @author Harry Sun <sunguangjun@126.com> </span><span>*/</span> <span>class</span> Controller <span>extends</span><span> \sf\base\Controller { </span><span>/*</span><span>* * 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>*/</span> <span>public</span> <span>function</span> render(<span>$view</span>, <span>$params</span> =<span> []) { </span><span>extract</span>(<span>$params</span><span>); </span><span>return</span> <span>require</span> '../views/' . <span>$view</span> . '.php'<span>; } }</span>
可以看到,我们首先从数组中把变量导入到当前的符号表中,然后引入相应的view页面。
然后,在SiteController,我们只需要这么写就可以了。
<?<span>php namespace app\controllers; </span><span>use</span><span> sf\web\Controller; </span><span>class</span> SiteController <span>extends</span><span> Controller { </span><span>public</span> <span>function</span><span> actionTest() { </span><span>echo</span> 'success!'<span>; } </span><span>public</span> <span>function</span><span> actionView() { </span><span>$this</span>->render('site/view', ['body' => 'Test body information'<span>]); } }</span>
然后,访问http://localhost/simple-framework/public/index.php?r=site/view,就可以看到跟之前一样的页面了。
我们来完善一下base中的Controller
<?<span>php namespace sf\base; </span><span>/*</span><span>* * Controller is the base class for classes containing controller logic. * @author Harry Sun <sunguangjun@126.com> </span><span>*/</span> <span>class</span><span> Controller { </span><span>/*</span><span>* * @var string the ID of this controller. </span><span>*/</span> <span>public</span> <span>$id</span><span>; </span><span>/*</span><span>* * @var Action the action that is currently being executed. </span><span>*/</span> <span>public</span> <span>$action</span><span>; }</span>
添加了两个属性,分别来记录当前的controller和action。
然后,我们要在解析router之后,将其赋值,code如下:
<?<span>php namespace sf\web; </span><span>/*</span><span>* * Application is the base class for all application classes. * @author Harry Sun <sunguangjun@126.com> </span><span>*/</span> <span>class</span> Application <span>extends</span><span> \sf\base\Application { </span><span>/*</span><span>* * Handles the specified request. * @return Response the resulting response </span><span>*/</span> <span>public</span> <span>function</span><span> handleRequest() { </span><span>$router</span> = <span>$_GET</span>['r'<span>]; </span><span>list</span>(<span>$controllerName</span>, <span>$actionName</span>) = <span>explode</span>('/', <span>$router</span><span>); </span><span>$ucController</span> = <span>ucfirst</span>(<span>$controllerName</span><span>); </span><span>$controllerNameAll</span> = <span>$this</span>->controllerNamespace . '\\' . <span>$ucController</span> . 'Controller'<span>; </span><span>$controller</span> = <span>new</span> <span>$controllerNameAll</span><span>(); </span><span>$controller</span>->id = <span>$controllerName</span><span>; </span><span>$controller</span>->action = <span>$actionName</span><span>; </span><span>return</span> <span>call_user_func</span>([<span>$controller</span>, 'action'. <span>ucfirst</span>(<span>$actionName</span><span>)]); } }</span>
然后我们就可以在controller和view中拿到相应的controller名字和action名字了,将view.php修改如下:
<span><</span><span>html</span><span>></span> <span><</span><span>head</span><span>></span> <span><</span><span>title</span><span>></span>title<span></</span><span>title</span><span>></span> <span><</span><span>head</span><span>></span> <span><</span><span>body</span><span>></span> <span><?</span><span>php echo $this->id;</span><span>?></span><span><</span><span>br</span><span>/></span> <span><?</span><span>php echo $this->action;</span><span>?></span><span><</span><span>br</span><span>/></span> <span><?</span><span>php echo $body;</span><span>?></span> <span></</span><span>body</span><span>></span> <span></</span><span>html</span><span>></span>
然后我们就可以看到如下的页面了
有人觉得现在大家都前后端分离了,我们不需要用PHP去render一个页面,只需要返回一个josn字符串就好了,这个就更简单了,在web的Controller中添加一个toJson方法即可
<span>/*</span><span>* * Convert a array to json string * @param string $data </span><span>*/</span> <span>public</span> <span>function</span> toJson(<span>$data</span><span>) { </span><span>if</span> (<span>is_string</span>(<span>$data</span><span>)) { </span><span>return</span> <span>$data</span><span>; } </span><span>return</span> json_encode(<span>$data</span><span>); }</span>
将SiteController中的actionTest,修改如下:
<span>public</span> <span>function</span><span> actionTest() { </span><span>$data</span> = ['first' => 'awesome-php-zh_CN', 'second' => 'simple-framework'<span>]; </span><span>echo</span> <span>$this</span>->toJson(<span>$data</span><span>); }</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

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











이번 장에서는 CakePHP의 환경 변수, 일반 구성, 데이터베이스 구성, 이메일 구성에 대해 알아봅니다.

PHP 8.4는 상당한 양의 기능 중단 및 제거를 통해 몇 가지 새로운 기능, 보안 개선 및 성능 개선을 제공합니다. 이 가이드에서는 Ubuntu, Debian 또는 해당 파생 제품에서 PHP 8.4를 설치하거나 PHP 8.4로 업그레이드하는 방법을 설명합니다.

CakePHP는 PHP용 오픈 소스 프레임워크입니다. 이는 애플리케이션을 훨씬 쉽게 개발, 배포 및 유지 관리할 수 있도록 하기 위한 것입니다. CakePHP는 강력하고 이해하기 쉬운 MVC와 유사한 아키텍처를 기반으로 합니다. 모델, 뷰 및 컨트롤러 gu

CakePHP에서 데이터베이스 작업은 매우 쉽습니다. 이번 장에서는 CRUD(생성, 읽기, 업데이트, 삭제) 작업을 이해하겠습니다.
