Typecho Framework是SegmentFault所用的框架,本文將介紹如何用這個框架寫一個Hello World程序。若是你不瞭解Typecho Framework,請先看這篇簡介。php
首先咱們建立Hello World程序的目錄:git
mkdir ~/hellow-world
Typecho Framework簡介中提到github
Action從Service獲取所需數據後,傳遞result給Server的響應對象。segmentfault
Hello World!
不須要獲取數據,因此咱們直接讓Action返回一個result便可。數組
在hello-world目錄下創建app/Action/
目錄,並在其中建立Hello.php
文件:瀏覽器
namespace Hello\Action;
首先咱們定義一個命名空間,咱們的程序使用Hello爲命名空間。app
這是一個Action,因此咱們須要繼承Action的類,翻一下框架的源代碼,找到這樣一個文件Mvc/Action/AbstractAction.php,那咱們就繼承AbstractAction
這個類好了:框架
use TE\Mvc\Action\AbstractAction; /** * Hello * * @use AbstractAction */ class Hello extends AbstractAction { // 待填充 }
咱們看到Mvc/Action/AbstractAction.php裏有這樣一行代碼:typecho
abstract public function execute();
這就告訴咱們,須要在本身的類中實現這個execute
方法。咱們實現一下這個方法,返回一個result數組。這時咱們參考下Typecho Framework的示例代碼,發現它是這麼寫的:ui
public function execute() { // 只要你把Action的屬性設置爲public狀態,它就會被注入到模板中,你能夠直接在模板中使用它們 $this->word = 'Hello World'; $this->peoples = new People($this->peopleService->listNewest(1, 20)); $this->master = new People($this->peopleService->getByName('joyqi')); // 不論你取出一行仍是多行數據,均可以塞到Data對象中進行處理 return array('template', 'index.php'); }
嗯,看這行代碼的意思,應該是指定返回的result使用模板(index.php
是模板文件的名稱)。那麼咱們不用模板,直接返回一個字符串應該怎麼寫呢?
繼續翻源代碼,發現Mvc/View
目錄下是這樣的結構:
嗯,咱們返回Hello World!
,不用模板,也不用什麼Json,那麼應該是Content
了。點進去一看,果真是這個:
/** * 渲染一個字符串 *
好了,知道了result數組要用content
後,咱們來完成這個方法的定義:
class Hello extends AbstractAction { public function execute() { return array('content', 'Hello World!'); } }
好了,Action部分已經搞定,接下來咱們綁定一下路由。參考示例代碼,咱們新建一個config
目錄,而後建立routes.php
,內容以下:
return [ '/Hello' => 'Hello\Action\Hello', ];
路由設置很簡單,就是返回一個數組,將路徑綁定到相應的類。
這樣基本上就完成了。還剩下一個入口程序了。示例代碼的README中提到:
直接在瀏覽器裏輸入http://app-root/portal/index.php便可, 其中
app-root
是你的程序目錄
因此說portal/index.php
就是入口程序。這裏咱們直接在hello-world目錄下面創立一個index.php
文件做爲入口,參考示例程序的寫法,咱們的文件內容以下:
const ROOT = __DIR__; require_once ROOT . '/typecho/Helper/Autoloader.php';
首先咱們加載Autoloader,經過這個Autoloader來初始化程序:
use TE\Helper\Autoloader; use TE\Mvc\Base; use TE\Mvc\Server\Http\Server; use TE\Mvc\Router\Simple; Autoloader::registerNamespace(ROOT . '/typecho', 'TE'); Autoloader::registerNamespace(ROOT . '/app', 'Hello');
註冊命名空間,第一個參數是路徑,第二個參數是命名空間的名稱。
咱們把框架放在typecho
目錄下。若是你尚未下載框架代碼,能夠克隆一下倉庫:
cd ~/hello-world git clone https://github.com/typecho/framework typecho
new Server(new Simple(require(ROOT . '/config/routes.php')));
啓動服務,指定配置文件的路徑。
而後在hello-world目錄下運行:
php -S 127.0.0.1:8000/Hello
訪問 http://127.0.0.1:8000,發現有問題,說是Server
須要兩個參數,如今只有一個,缺乏了一個InterceptorManager
。
缺的是攔截器,因此咱們就把上面的代碼改一下:
new Server(new Simple(require(ROOT . '/config/routes.php')), new InterceptorManager(require(ROOT . '/config/interceptors.php')));
而後config/interceptors.php
裏返回一個空數組(由於咱們如今不須要用到攔截器):
return array();
大功告成!訪問 http://127.0.0.1:8000/Hello 就能看到輸出的 Hello world!
上面是直接輸出字符串,接下來咱們使用模板輸出.
先在路由裏增長一條:
return [ '/Hello' => 'Hello\Action\Hello', '/Hi' => 'Hello\Action\Hi' ];
咱們打算訪問/Hi
經過模板輸出。
而後是實現Hi
類,建立app/Action/Hi.php
,內容以下:
namespace Hello\Action; use TE\Mvc\Action\AbstractAction; /** * Hi * * @use AbstractAction */ class Hi extends AbstractAction { public function execute() { $this->msg = 'Hi!'; return array('template', 'hi.php'); } }
咱們定義了$this->msg
,在模板中能夠直接使用這個變量。
最後是定義hi.php
模板。咱們建立一個template
目錄:
mkdir ~/hello-world/template
而後建立一個hi.php
模板文件,直接在HTML中嵌入PHP代碼:
<h1><?php echo ($msg . ' ' . $name); ?></h1>
注意,咱們並無指定模板文件的位置!若是你把模板文件放在別的目錄下,會報錯Template file not found
。Typecho Framework會自動在template
目錄下找模板文件,「約定大於配置」。
撰文 SegmentFault