现在基本上新项目都是前后端分离了,所以框架主要用于接口开发,这是一个轻量级并支持大型应用开发的PHP框架,当然也支持传统的服务端渲染开发方式,这也是我们希望达到的目的,写代码是一种享受,一种艺术,而代码本身又是一幅优美的画卷,我们的初衷不是开发大而全的框架,也不是开发小而美的框架,我们希望TimoPHP在不同团队的打磨下成为最适合自己公司产品的框架。很多框架都希望做大做强,会考虑的很全面,会加入很多功能、特性,但是,我们的项目、产品可能根本就不会用到,对于我们来说就是鸡肋,我们坚信,符合公司产品的框架才是最好的框架。
所以,框架不能有太多的限制,之前用过CI、ThinkPHP、Laravel、Yii等等框架,CI可以算一个小而美的框架,但是比较落后了,PHP很多新东西没用上,TP5缺失很多设计模式,不适合开发大型应用,Laravel很优秀、很优雅,但是,它很臃肿,虽然有很多相关组件,但是,我就觉得它不够轻量,Yii现在越搞越复杂了,也和我们的观点不一样。
符合PSR标准,轻量、灵活、扩展性好,目录结构可配置,多层设计,控制器分组设计,提供依赖注入服务容器,实现类与类、模块与模块之间的解耦(对大型应用的支持,一般应用用不上)
除了Model层,我们还可以根据项目实际情况增加层,比如基础层(Base)逻辑层(Business)服务层(Service)策略层(strategy)等等。
M:Model,模型,数据的来源和存储
V:View,视图,数据的展示
C:Controller,控制器,数据的调度
Business,业务逻辑层,业务逻辑的编写
Service,服务层,数据的处理
当我们控制器很多的时候,我们可以把一类的控制器统一放到一个目录下面,就相当于分了一个组
比如我们有活动、视频两个控制器,有列表、详情、点赞、打赏等,还有子模块评论、问答、留言等,旧的做法是所有方法都写到活动或视频一个控制器里面,这样一个控制器里面的方法就很多
app
|--api
| |--controller
| | |--Activity.php
| | |--Video.php
app
|--api
| |--controller
| | |--activity
| | | |--Activity.php
| | | |--Comment.php //评论
| | | |--Message.php //留言
| | | |--Question.php //问答
| | |--video
| | | |--Video.php
| | | |--Comment.php
| | | |--Message.php
| | | |--Question.php
| | | |--Bb.php //弹幕
http://api.timophp.com/activity/list
http://api.timophp.com/activity/comment/detail?id=28973
1、PHP7.0+
2、PSR标准
3、轻量级,扩展灵活
4、自定义异常处理,如404
5、原生模版解析
6、支出视图组件
7、模板支持多主题、layout(布局)
8、主要用于接口开发
9、加入对cli模式支出,用来写服务、定时脚本挺好的
10、增加依赖注入服务容器,实现组件之间的松耦合
11、支持数据库读写分离设置,可具体到某个模型
12、支持控制器分组路由,降低控制器复杂度
<?php
namespace app\api\controller;
use Timo\Core\App;
use Timo\Core\Request;
class Node
{
function show()
{
$id = Request::getInt('id');
if($id <= 0) {
return App::result(1, 'params error');
}
$node = NodeModel::find($id, 'id, title, cover, content');
return App::result(0, 'ok', [
'node' => $node
]);
}
}
<?php
namespace app\web\controller;
class Node
{
function index()
{
$view = View::instance(); //new View() 用new也可以
$view->assign('nodes', []);
return $view->render();
}
}
<?php
namespace app\web\controller;
use Timo\Core\Controller;
class Node extends Controller
{
function index()
{
$this->assign('nodes', []);
return $this->render();
}
}