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