目录结构

Bingo目录
  • components:系统组件目录
    • Model.php:model组件
  • config:系统配置目录
  • core:系统核心文件目录
    • Action.php:动作基类
    • Bingo.php:系统类
    • Controller.php:控制基类
    • Log.php:日志类
    • Module.php:模块类
    • Report.php:报警类
  • extensions:扩展目录,我们引入一些类库可能不符合我们的Bingo::load规范,就在这里写适配
  • hook:钩子目录
  • library:类库目录
  • view:系统视图
    • error:错误默认视图
应用目录:
  • app:应用目录,放在web不能直接访问的位置
    • cache:缓存目录
    • components:组件目录
      • LanguageComponent.php:laguage组件,示范组件怎么写的而已
    • config:配置目录
      • main.php:主配置文件
    • cpntrollers:控制器目录
      • HelloAction.php:无模型无控制器动作,注意和视图不同,类文件的首字母大写
      • HelloController:hello控制器目录
        • HelloController.php:hello控制器
        • IndexAction.php:hello控制器下index动作
      • HelloModule:hello模块视图目录
        • HelloModule.php:hello模块
        • HelloController:hello模块hello控制器目录
          • HelloController.php:hello控制器
          • IndexAction.php:hello模块hello控制器下index动作
    • core:核心文件目录,会覆盖掉Bingo的
    • data:数据目录
    • extensions:类库适配文件目录
    • hook:钩子目录
    • library:类库
    • log:日志记录
    • model:模型
    • view:视图目录,路径:首字母小写,带后缀Module,Controller,Action
      • layout:这个叫什么好呢
        • main.php:主layout
      • helloAction.php:无模型无控制器动作视图
      • helloController:hello控制器视图目录
        • indexAction.php:hello控制器下index动作视图
      • helloModule:hello模块视图目录
        • helloController:hello模块hello控制器视图目录
          • indexAction.php:hello模块hello控制器下index动作视图
  • web:网站根目录
    • index.php:入口文件
    • other:其它必要的目录,如资源目录等

约定

  1. 所有php文件以.php结尾,不使用.class.php等结尾
  2. 类文件,文件名与类名相同,首字母大写
  3. 类命名首字母大写,后面带上指明用途的字符,如下:
    1. Module:模块,如 TestModule.php
    2. Controller:控制器,如 TestController.php
    3. Action:动作,如 TestAction.php
    4. Hook:钩子,如 TestHook.php
    5. Component:组件,如 TestComponent.php
    6. Extension:类库拓展|适配,如 TestExtension.php

MVC

目录结构
参见目录结构
获取
在全局范围内:
可以通过Bingo::m()获取一个模块,如果有的话
可以通过Bingo::c()获取一个控制器,如果有的话
可以通过Bingo::a()获取一个动作,如果有的话
在控制器里:
可以通过 $this->_m 获取模块
在动作里:
可以通过 $this->_m 获取模块
可以通过 $this->_c 获取控制器
执行流程
模块
先执行$this->_before()再调用控制器,最后执行$this->_after(),你可以在模块类里实现这两个方法。
控制器
先执行$this->_before()再调用动作,最后执行$this->_after(),你可以在控制器类里实现这两个方法。
动作
执行次序如下: $this->init();#子类实现覆盖,进行一些初始话,例如给验证外部变量的规则赋值等。
处理参数验证 Bingo::validate($this->_validate),更新全局变量等
$this->_before(); #子类实现覆盖,预处理
$this->_main(); #子类实现覆盖,主处理
处理并刷出视图。
$this->_after();#子类实现覆盖。最后处理

组件

组件是属于应用的,通过 Bingo::$app->getComponent($name)获取。
如果组件需要配置的话,在应用主配置文件的components段配置

全局变量

全局配置()-》模块配置-》控制配置=》动作配置(后面的覆盖前面的)。
全局配置在应用主配置global指定,m、v、c皆是在类属性$_global处指定。
可以通过Bingo::g($name)获取,通过Bingo::g($name,$val)设置。

外部变量

在应用初始化时,get,post,cookie就都被删除了,之后可以通过Bingo::param()获取,但是在获取前要先通过Bingo::validate()校验。

日志

预先在钩子error上绑定了记录,在脚本退出时有错误信息也会触发日志记录。
如果想手动插入日志记录,请自行参考Log类。

报警

我认为,一个线上的应用出了异常最好能让相关人员早点知道。所以加入了报警模块,需配合一个报警端使用(我用python写了一个),默认没启用。

钩子

系统放置了一些钩子,你也可以自己添加新钩子,或往钩子里添加新监听。
Bingo::bindHook($name,$callBack) 新增钩子或添加监听
Bingo::hook($name) 触发钩子
钩子监听$callBack调用后返回Bingo::HOOK_BREAK将结束一个hook(排后面的回调就不处理了)
钩子实现一般为静态类的方式,放置于应用或Bingo的hook目录下
钩子可以在应用主配置文件中进行配置,具体请参考主配置的注释
系统预留的钩子:

error
当有错误信息时调用
shutdown
当脚本退出时调用
route
在系统初始化mvc名称时调用,通过变更Bingo::$_routeInfo 里的m、v、c键值达到目的
config
在使用Bingo::config方法时调用,通过变更Bingo::$_loadingConf达到目的
load
在使用Bingo::load方法时调用,通过变更 Bingo::$_loading[‘class’]和Bingo::$_loading[‘params’]达到目的
permission
在调用mvc之前触发,通过变更Bingo::$_hasPermission达到目的。
withoutPermission
在调用mvc之前,如果Bingo::$_hasPermission为false将不会调用mvc并触发该事件

类库

对于符合我们的约定的类库,可以通过Bingo::load引入并实例化,如果你选择的类库并不符合我们的约定,那么可以在extension目录下建立相应的适配类来使用。
系统可以使用Bingo::path方法来获取一个句号路径的路径,但是不包含最后的后缀。

拓展

应用文件的加载优先级高于Bingo文件,你可以在应用下建立文件替换掉Bingo文件。
你还可以参考 钩子,类库等条目,以便更好的进行拓展。

开始

入口文件真的很简单:

阿里云-推广AD
                            <?
                            require 'bingo/core/bingo.php';
                            Bingo::run(realpath('../app'));