ホームページ バックエンド開発 PHPチュートリアル 独自の PHP フレームワーク - 抽象コントローラーの基本クラスを構築する

独自の PHP フレームワーク - 抽象コントローラーの基本クラスを構築する

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 <[email&#160;protected]> <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 <[email&#160;protected]> <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 <[email&#160;protected]> <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 <[email&#160;protected]> <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><span style="color: #800000;">html</span><span style="color: #0000ff;">></span>    <span style="color: #0000ff;"><</span><span style="color: #800000;">head</span><span style="color: #0000ff;">></span>        <span style="color: #0000ff;"><</span><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><span style="color: #800000;">head</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: #ff00ff;">php echo $this->id;</span><span style="color: #0000ff;">?></span><span style="color: #0000ff;"><</span><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><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>
ログイン後にコピー

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

有人觉得现在大家都前后端分离了,我们不需要用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ヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Huawei GT3 ProとGT4の違いは何ですか? Huawei GT3 ProとGT4の違いは何ですか? Dec 29, 2023 pm 02:27 PM

多くのユーザーはスマートウォッチを選ぶときにファーウェイブランドを選択しますが、その中でもファーウェイ GT3pro と GT4 は非常に人気のある選択肢であり、多くのユーザーはファーウェイ 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 の初心者がプロジェクトを作成するとき、一連の問題 1.2.3.4.5.6 についてコントローラーをスキャンできません。別の方法は、開始時に @ComponentScan(basePackages={"xxx.xxx.xx","xxx.xxx") を追加することです。サービス クラス) .xx”}) はパッケージの完全修飾名であり、複数の SpringBoot カスタム コントローラーに使用できます。スタートアップ クラスとカスタム コントローラー パッケージが同じディレクトリにありません。 application.java の公式推奨配置

ベース DEX 蛇口: Aerodrome VS Curve ベース DEX 蛇口: Aerodrome VS Curve Mar 26, 2024 pm 04:31 PM

ベロドローム モデルは veCRV からインスピレーションを受けており、流動性プロバイダー (LP)、トークン所有者、流動性を必要とするプロジェクトを含む DEX の 3 つの主要な参加者間で優れた一貫性を達成することを目指しています。しかし、DeFi分野の多くの参加者は依然として根本的な理由を完全に理解していません。この記事を深く読むことで、このジレンマから抜け出し、根本に到達することができます。今日は、DeFi分野における本当の成功事例であるベロドローム/エアロドロームについて説明します。この記事では、2 つのモデルを比較し、ベロドロームが veCRV モデルをどのように改善しているか、またこれらの小さな違いがどのような大きな影響を与えるかを説明します。まず最初に言っておきますが、

修正: Windows 11 で Snipping ツールが機能しない 修正: Windows 11 で Snipping ツールが機能しない Aug 24, 2023 am 09:48 AM

Windows 11 で Snipping Tool が機能しない理由 問題の根本原因を理解すると、適切な解決策を見つけるのに役立ちます。 Snipping Tool が正しく動作しない主な理由は次のとおりです。 フォーカス アシスタントがオンになっている: これにより、Snipping Tool が開かなくなります。破損したアプリケーション: 起動時にスニッピング ツールがクラッシュする場合は、破損している可能性があります。古いグラフィック ドライバー: 互換性のないドライバーは、スニッピング ツールに干渉する可能性があります。他のアプリケーションからの干渉: 実行中の他のアプリケーションが Snipping Tool と競合する可能性があります。証明書の有効期限が切れています: アップグレード プロセス中のエラーにより、この問題が発生する可能性があります。これらの簡単な解決策は、ほとんどのユーザーに適しており、特別な技術知識は必要ありません。 1. Windows および Microsoft Store アプリを更新する

golang で正規表現を使用して、入力が正当な Base64 文字列であるかどうかを確認する golang で正規表現を使用して、入力が正当な Base64 文字列であるかどうかを確認する Jun 24, 2023 am 10:01 AM

Golang プログラミングでは、入力が正当な Base64 文字列であるかどうかを確認するために正規表現を使用することが比較的一般的な要件です。開発者は、正規表現を使用して、ユーザー入力が正しいかどうかを迅速かつ正確に検証できます。この記事では、Golang で正規表現を使用して、入力が正当な Base64 文字列であるかどうかを確認する方法を紹介します。基本構文から始める Golang で正規表現を使用するには、「regexp」ライブラリを使用する必要があります。このライブラリは「コンパイル」と「

Java で Base64 関数を使用してエンコードおよびデコードする方法 Java で Base64 関数を使用してエンコードおよびデコードする方法 Jun 26, 2023 pm 02:24 PM

Java プログラミングでは、送信するためにバイナリ データをテキスト形式に変換する必要があることが多く、Base64 エンコーディングが一般的に使用される変換方法です。 Base64 は、3 バイトのデータを 4 バイトのテキスト データに変換します。テキスト データは 64 文字で構成され、印刷可能な文字のみが含まれるため、電子メールや HTTP リクエスト メッセージなどのプロトコルで送信できます。 Java は Base64 エンコードおよびデコード API を提供するため、データを簡単に変換できます。この記事ではJavaでの使い方を紹介します。

iOS の開発者バージョンとパブリック バージョンの違いは何ですか? iOS の開発者バージョンとパブリック バージョンの違いは何ですか? Mar 01, 2024 pm 12:55 PM

毎年、Apple が iOS と macOS の新しいメジャー バージョンをリリースする前に、ユーザーは数か月前にベータ版をダウンロードして最初に体験することができます。同ソフトウェアは一般ユーザーと開発者の両方が使用するため、Appleは開発者向けベータ版のパブリックベータ版である開発者版とパブリック版を両方向けに開始した。 iOS の開発者バージョンとパブリック バージョンの違いは何ですか?文字通りに言うと、開発者バージョンは開発者テスト バージョンであり、パブリック バージョンは公開テスト バージョンです。開発者バージョンとパブリック バージョンは、異なるユーザーを対象としています。開発者バージョンは、Apple が開発者によるテストのために使用します。ダウンロードしてアップグレードするには、Apple 開発者アカウントが必要です。

Laravel 開発: Laravel View を使用してビューを生成するには? Laravel 開発: Laravel View を使用してビューを生成するには? Jun 14, 2023 pm 03:28 PM

Laravel は現在最も人気のある PHP フレームワークの 1 つであり、その強力なビュー生成機能は印象的です。ビューは、Web アプリケーションでユーザーに表示されるページまたは視覚要素であり、HTML、CSS、JavaScript などのコードが含まれています。 LaravelView を使用すると、開発者は構造化テンプレート言語を使用して Web ページを構築し、コントローラーとルーティングを通じて対応するビューを生成できます。この記事では、LaravelView を使用してビューを生成する方法を説明します。 1. 何を

See all articles