Typecho Framework: Hello world!

Typecho FrameworkSegmentFault所用的框架,本文將介紹如何用這個框架寫一個Hello World程序。若是你不瞭解Typecho Framework,請先看這篇簡介php

輸出Hello World!

首先咱們建立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目錄下是這樣的結構:

  • AbstractView.php
  • Back.php
  • Blank.php
  • Content.php
  • Error.php
  • Json.php
  • Jsonp.php
  • NotFound.php
  • Redirect.php
  • Template.php

嗯,咱們返回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

相關文章
相關標籤/搜索