目录结构
- 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:错误默认视图
- components:系统组件目录
- 应用目录:
-
- 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动作视图
- helloController:hello模块hello控制器视图目录
- layout:这个叫什么好呢
- web:网站根目录
- index.php:入口文件
- other:其它必要的目录,如资源目录等
- app:应用目录,放在web不能直接访问的位置
约定
- 所有php文件以.php结尾,不使用.class.php等结尾
- 类文件,文件名与类名相同,首字母大写
- 类命名首字母大写,后面带上指明用途的字符,如下:
- Module:模块,如 TestModule.php
- Controller:控制器,如 TestController.php
- Action:动作,如 TestAction.php
- Hook:钩子,如 TestHook.php
- Component:组件,如 TestComponent.php
- 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段配置
如果组件需要配置的话,在应用主配置文件的components段配置
全局变量
全局配置()-》模块配置-》控制配置=》动作配置(后面的覆盖前面的)。
全局配置在应用主配置global指定,m、v、c皆是在类属性$_global处指定。
可以通过Bingo::g($name)获取,通过Bingo::g($name,$val)设置。
全局配置在应用主配置global指定,m、v、c皆是在类属性$_global处指定。
可以通过Bingo::g($name)获取,通过Bingo::g($name,$val)设置。
外部变量
在应用初始化时,get,post,cookie就都被删除了,之后可以通过Bingo::param()获取,但是在获取前要先通过Bingo::validate()校验。
日志
预先在钩子error上绑定了记录,在脚本退出时有错误信息也会触发日志记录。
如果想手动插入日志记录,请自行参考Log类。
如果想手动插入日志记录,请自行参考Log类。
报警
我认为,一个线上的应用出了异常最好能让相关人员早点知道。所以加入了报警模块,需配合一个报警端使用(我用python写了一个),默认没启用。
钩子
系统放置了一些钩子,你也可以自己添加新钩子,或往钩子里添加新监听。
Bingo::bindHook($name,$callBack) 新增钩子或添加监听
Bingo::hook($name) 触发钩子
钩子监听$callBack调用后返回Bingo::HOOK_BREAK将结束一个hook(排后面的回调就不处理了)
钩子实现一般为静态类的方式,放置于应用或Bingo的hook目录下
钩子可以在应用主配置文件中进行配置,具体请参考主配置的注释
系统预留的钩子:
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::path方法来获取一个句号路径的路径,但是不包含最后的后缀。
拓展
应用文件的加载优先级高于Bingo文件,你可以在应用下建立文件替换掉Bingo文件。
你还可以参考 钩子,类库等条目,以便更好的进行拓展。
你还可以参考 钩子,类库等条目,以便更好的进行拓展。
评论