马上开始
从xts-init初始化
虽然xts最早实现的是ORM功能,个人感觉最有价值的也是这块,但是入门还是能马上动手开始实践比较好。xts-init项目提供了一个可以快速开始的项目文件目录模板。直接clone这个项目并重命名就可以了:
git clone git@github.com:SyuTingSong/xts-init.git MyProject
因为xts项目是以git子模块的方式存在于xts-init项目中,所以还需要用相应命令取出它的代码。
cd MyProject
git submodule init
git submodule update
接下来还需要清理一下xts-init项目原本的git信息:
rm -rf .git .gitmodules framework/.git
现在整个xts框架目录就已经准备好了。
目录结构说明
从xts-init初始化好的目录结构如下:
.
├── CREDITS
├── LICENSE
├── README.md
├── build
├── build.tools
│ ├── turn-off-debug.patch
│ └── yuicompressor-2.4.8.jar
├── framework
│ ├── CJSON.php
│ ├── CREDITS
│ ├── LICENSE
│ ├── README.md
│ ├── apple.php
│ ├── base.php
│ ├── cache.php
│ ├── hail.php
│ ├── orange.php
│ ├── redis.php
│ ├── smarty.php
│ ├── valley.php
│ ├── view.php
│ └── x.php
├── protected
│ ├── action
│ │ └── index.php
│ ├── common.php
│ ├── config
│ │ ├── debug.php
│ │ └── release.php
│ ├── runtime
│ └── view
│ ├── index.html
│ └── layout.html
├── static
│ ├── css
│ │ └── common.css
│ ├── img
│ └── js
└── webroot
├── index.php
├── static -> ../static/
└── xts.php
第一级主要有framework、protected、static、webroot和build.tools五个目录。framework目录里存放的是xts框架的源代码;protected目录用于存放我们的自己的程序代码、页面模板以及配置文件等等;static目录里保存静态的资源文件,包括css、JavaScript、图片、Web字体等等;webroot目录是Web服务器的根目录,可以直接被浏览器访问到,一般只有一个入口文件;build.tools是xts框架的编译工具,里面放置js压缩器还有关闭debug模式的patch。
webroot里有一个指向static的软链接,这样浏览器可以直接访问到static目录里的资源。把static目录放在webroot之外是为了方便地把static目录单独打包发布到CDN上。xts的build脚本可以把静态资源文件引用(就是HTML里的link还有img的src等等)替换成独立的静态服务器域名或者CDN域名。
protected目录里一般会有action、config、runtime、model、view几个目录。action目录用于存在controller代码;config里存在配置文件,xts的配置文件也是php程序,是一个大关联数组;runtime目录里存在一些运行时生成的数据,包括文件缓存,编译出来的模板,运行日志等等;model目录在xts-init里不会创建,这个目录是存在自定义数据库ORM对象的;view目录里存放xts的模板,一般以.html为后缀。
Hello, world
前面介绍了一大通xts的目录结构,现在马上开始试试写代码运行吧。打开protected/action/index.php
文件,可以看到里面已经有Hello, world的Controller代码了。
<?php
function index() {
X::view()
->setPageTitle('Hello world')
->render('index', array(
'to' => 'world',
), '1');
}
每个xts的action都是一个函数,在protected/action目录里,存放在与之同名的.php文件中。xts的路由规则是尽最大可能匹配目录和文件。比如请求/a/b/c/d
就会先尝试加载protected/action/a/b/c/d.php
文件,如果不存在,会再尝试protected/action/a/b/c.php
,如果仍未找到,会尝试protected/action/a/b.php
,最后到protected/action/a.php
。相应的,xts也会尝试调用d()、c()、b()最后是a()。调用的函数名总是和文件名相同例外情况。
大写X是xts框架的一个静态类,上面绑定了根据配置文件加载的工具类。X::view()会返回一个RainTPL模板引擎的实例。当然,这里使用的RainTPL已经被修改以适合xts的整结构。这个action会通知模板引擎,渲染index模板,并传递参数$to = world。
打开protected/view/layout.html
和protected/view/index.html
文件,可以看到模板的代码。layout模板里写的是各页面公共的html片段,一般包括页面的css引用,header、footer、nav bar等等。
<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.2//EN" "http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
<style media="handheld" type="text/css"></style>
<link rel="stylesheet" href="/static/css/common.css" />
<title>{$_page_title|escape}</title>
</head>
<body>
{include="$_content_template"}
</body>
</html>
index模板里写的是具体页面的内容,它会被嵌入到layout的{include="$_content_template"}
位置。
<h2>Hello, {$to}</h2>
在index模板里,使用来自action函数中赋值的变量$to。
Web服务器的配置
xts是单入口的框架,需要在web服务器上配置rewrite把所有请求都rewrite给webroot/index.php
脚本才能使用。以nginx为例,可以使用它的try_files。
try_files $uri $uri/ /index.php?$args;
总之需要确保站点访问所有基于xts的程序都交给index.php就好了。
推荐的IDE
推荐使用IDEA出口的PhpStorm来开发xts程序,能获得最好的自动完成提示、方法参数说明等。如果不想花钱,ActiveState出品的Komodo Edit也是一个不错的选择,虽然比PhpStorm要差一些。最好不要使用Vi之类的编辑器开发,因为xts框架的一个设计就是利用IDE的自动完成最高效地开发程序,用Vi效率降一半呀。
命名
xts框架在类的方法和属性中使用驼峰命名法,在数据库、函数、网页参数中使用帕斯卡命名法。