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

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

DVWA
Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

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

mPDF
mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。
