框架基础介绍


框架介绍

说明

现在基本上新项目都是前后端分离了,所以框架主要用于接口开发,这是一个轻量级并支持大型应用开发的PHP框架,当然也支持传统的服务端渲染开发方式,这也是我们希望达到的目的,写代码是一种享受,一种艺术,而代码本身又是一幅优美的画卷,我们的初衷不是开发大而全的框架,也不是开发小而美的框架,我们希望TimoPHP在不同团队的打磨下成为最适合自己公司产品的框架。很多框架都希望做大做强,会考虑的很全面,会加入很多功能、特性,但是,我们的项目、产品可能根本就不会用到,对于我们来说就是鸡肋,我们坚信,符合公司产品的框架才是最好的框架。

所以,框架不能有太多的限制,之前用过CI、ThinkPHP、Laravel、Yii等等框架,CI可以算一个小而美的框架,但是比较落后了,PHP很多新东西没用上,TP5缺失很多设计模式,不适合开发大型应用,Laravel很优秀、很优雅,但是,它很臃肿,虽然有很多相关组件,但是,我就觉得它不够轻量,Yii现在越搞越复杂了,也和我们的观点不一样。

框架核心概念

符合PSR标准,轻量、灵活、扩展性好,目录结构可配置,多层设计,控制器分组设计,提供依赖注入服务容器,实现类与类、模块与模块之间的解耦(对大型应用的支持,一般应用用不上)

MVC+模式

除了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、支持控制器分组路由,降低控制器复杂度

控制器(Controller)

接口

<?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();
    }
}