백엔드 개발 PHP 튜토리얼 构建自个儿的PHP框架-抽象Controller的基类

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

Jun 13, 2016 pm 12:24 PM
base controller gt public view

构建自己的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

 

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

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

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

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

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

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

화웨이 GT3 Pro와 GT4의 차이점은 무엇입니까? 화웨이 GT3 Pro와 GT4의 차이점은 무엇입니까? Dec 29, 2023 pm 02:27 PM

많은 사용자들이 스마트 시계를 선택할 때 Huawei 브랜드를 선택하게 됩니다. 그 중 Huawei GT3pro와 GT4가 가장 인기 있는 선택입니다. 두 제품의 차이점을 궁금해하는 사용자가 많습니다. Huawei GT3pro와 GT4의 차이점은 무엇입니까? 1. 외관 GT4: 46mm와 41mm, 재질은 유리 거울 + 스테인레스 스틸 본체 + 고해상도 섬유 후면 쉘입니다. GT3pro: 46.6mm 및 42.9mm, 재질은 사파이어 유리 + 티타늄 본체/세라믹 본체 + 세라믹 백 쉘입니다. 2. 건강한 GT4: 최신 Huawei Truseen5.5+ 알고리즘을 사용하면 결과가 더 정확해집니다. GT3pro: ECG 심전도, 혈관 및 안전성 추가

SpringBoot가 컨트롤러를 스캔할 수 없는 문제를 해결하는 방법 SpringBoot가 컨트롤러를 스캔할 수 없는 문제를 해결하는 방법 May 14, 2023 am 08:10 AM

SpringBoot 초보자가 프로젝트를 생성하면 Controller를 스캔할 수 없고 일련의 문제가 발생합니다. 1.2.3.4.5.6 또 다른 방법은 시작할 때 @ComponentScan(basePackages={"xxx.xxx.xx","xxx.xxx"를 추가하는 것입니다. 서비스 클래스) .xx”})는 여러 SpringBoot 사용자 정의 컨트롤러에 사용할 수 있는 패키지의 정규화된 이름입니다. SpringBoot 사용자 정의 컨트롤러 경로는 시작 클래스와 사용자 정의 컨트롤러 패키지가 다음과 같기 때문에 검색할 수 없으며 찾을 수 없습니다. 같은 디렉토리에 있지 않습니다. 공식적으로 권장되는 application.java 배치

기본 DEX 수도꼭지: 비행장 VS 곡선 기본 DEX 수도꼭지: 비행장 VS 곡선 Mar 26, 2024 pm 04:31 PM

Velodrome 모델은 veCRV에서 영감을 얻었으며 유동성 공급자(LP), 토큰 보유자 및 유동성이 필요한 프로젝트를 포함하여 DEX의 세 가지 주요 참여자 간에 탁월한 일관성을 달성하는 것을 목표로 합니다. 그러나 DeFi 공간의 많은 플레이어는 여전히 근본적인 이유를 완전히 이해하지 못하고 있습니다. 이 글을 깊이 있게 읽으면, 이 딜레마에서 벗어나 그 근본 원인을 파악할 수 있을 것입니다. 오늘은 DeFi 분야의 실제 성공 사례인 Velodrome/Aerodrome에 대해 논의하겠습니다. 이 기사에서는 두 모델을 비교하고 Velodrome이 veCRV 모델을 어떻게 개선하고 이러한 작은 차이가 어떤 중요한 영향을 미치는지 설명합니다. 먼저 말씀드리자면

golang에서 정규식을 사용하여 입력이 합법적인 base64 문자열인지 확인하세요. golang에서 정규식을 사용하여 입력이 합법적인 base64 문자열인지 확인하세요. Jun 24, 2023 am 10:01 AM

Golang 프로그래밍에서는 입력이 합법적인 base64 문자열인지 확인하기 위해 정규식을 사용하는 것이 상대적으로 일반적인 요구 사항입니다. 개발자의 경우 정규식을 사용하여 사용자 입력이 올바른지 빠르고 정확하게 확인할 수 있습니다. 이 기사에서는 Golang에서 정규식을 사용하여 입력이 합법적인 base64 문자열인지 확인하는 방법을 소개합니다. 기본 구문으로 시작하기 Golang에서 정규식을 사용하려면 "regexp" 라이브러리를 사용해야 합니다. 이 라이브러리는 "컴파일" 및 "

수정: Windows 11에서 캡처 도구가 작동하지 않음 수정: Windows 11에서 캡처 도구가 작동하지 않음 Aug 24, 2023 am 09:48 AM

Windows 11에서 캡처 도구가 작동하지 않는 이유 문제의 근본 원인을 이해하면 올바른 솔루션을 찾는 데 도움이 될 수 있습니다. 캡처 도구가 제대로 작동하지 않는 주요 이유는 다음과 같습니다. 초점 도우미가 켜져 있습니다. 이렇게 하면 캡처 도구가 열리지 않습니다. 손상된 응용 프로그램: 캡처 도구가 실행 시 충돌하는 경우 응용 프로그램이 손상되었을 수 있습니다. 오래된 그래픽 드라이버: 호환되지 않는 드라이버가 캡처 도구를 방해할 수 있습니다. 다른 응용 프로그램의 간섭: 실행 중인 다른 응용 프로그램이 캡처 도구와 충돌할 수 있습니다. 인증서가 만료되었습니다. 업그레이드 프로세스 중 오류로 인해 이 문제가 발생할 수 있습니다. 이 문제는 대부분의 사용자에게 적합하며 특별한 기술 지식이 필요하지 않습니다. 1. Windows 및 Microsoft Store 앱 업데이트

iOS 개발자 버전과 공개 버전의 차이점은 무엇인가요? iOS 개발자 버전과 공개 버전의 차이점은 무엇인가요? Mar 01, 2024 pm 12:55 PM

매년 Apple이 iOS 및 macOS의 새로운 주요 버전을 출시하기 전에 사용자는 몇 달 전에 베타 버전을 다운로드하여 먼저 경험할 수 있습니다. 소프트웨어는 대중과 개발자 모두가 사용하기 때문에 Apple은 개발자 베타 버전의 공개 베타 버전인 개발자 버전과 공개 버전을 모두 출시했습니다. iOS 개발자 버전과 공개 버전의 차이점은 무엇인가요? 말 그대로 개발자 버전은 개발자 베타 버전이고, 퍼블릭 버전은 퍼블릭 베타 버전이다. 개발자 버전과 공개 버전은 서로 다른 대상을 대상으로 합니다. 개발자 버전은 개발자가 테스트하기 위해 Apple에서 사용합니다. 다운로드하고 업그레이드하려면 Apple 개발자 계정이 필요합니다.

Java에서 Base64 함수를 사용하여 인코딩 및 디코딩하는 방법 Java에서 Base64 함수를 사용하여 인코딩 및 디코딩하는 방법 Jun 26, 2023 pm 02:24 PM

Java 프로그래밍에서는 전송을 위해 바이너리 데이터를 텍스트 형식으로 변환해야 하는 경우가 많으며 Base64 인코딩이 일반적으로 사용되는 변환 방법입니다. Base64는 3바이트의 데이터를 4바이트의 텍스트 데이터로 변환합니다. 텍스트 데이터는 인쇄 가능한 문자만 포함하므로 이메일 및 HTTP 요청 메시지와 같은 프로토콜로 전송할 수 있습니다. Java는 Base64 인코딩 및 디코딩 API를 제공하므로 데이터를 쉽게 변환할 수 있습니다. 이 기사에서는 Java에서의 사용 방법을 소개합니다.

Laravel 개발: Laravel View를 사용하여 뷰를 생성하는 방법은 무엇입니까? Laravel 개발: Laravel View를 사용하여 뷰를 생성하는 방법은 무엇입니까? Jun 14, 2023 pm 03:28 PM

Laravel은 현재 가장 인기 있는 PHP 프레임워크 중 하나이며 강력한 뷰 생성 기능이 인상적입니다. 보기는 웹 애플리케이션에서 사용자에게 표시되는 페이지 또는 시각적 요소로, HTML, CSS, JavaScript와 같은 코드가 포함되어 있습니다. LaravelView를 사용하면 개발자는 구조화된 템플릿 언어를 사용하여 웹 페이지를 구축하고 컨트롤러 및 라우팅을 통해 해당 뷰를 생성할 수 있습니다. 이번 글에서는 LaravelView를 사용하여 뷰를 생성하는 방법을 살펴보겠습니다. 1. 무엇

See all articles