入口文件
用户请求的PHP文件,负责处理一个请求(注意,不一定是URL请求)的生命周期,最常见的入口文件就是index.php
,有时候也会为了某些特殊的需求而增加新的入口文件,例如给某些模块单独设置的一个入口文件admin.php
都属于入口文件。 入口文件位置一般放置在 /www 目录中。
应用
在 BeaconPHP 中从入口文件请求过来的数据我们通常都需要使用 \beacon\core\App 静态类来运行,一些路由注册 也可以由他来定义,并最终引导它走向应用模块及控制器去执行,它管理着整个程序执行的生命周期。
应用模块
应用模块一般存放在目录 /app 中,比如我们的 home 主模块,admin 后台管理模块,service 公共模块 ,我们还可以自己添加自己的其他模块,他们有自己的应用空间,应用\beacon\core\App 启动后,将会执行模块中的StartUp.php 启动类,可以在模块的启动类中 定义模块自己的配置信息,以及接管启动引导到控制器上。默认情况下 系统会按路由约定自己引导到相应的模块控制器上执行。
一个模块的目录结构定义如下:
app
│ ├─ home 模块目录
│ │ ├─controller 控制器目录
│ │ ├─model 模型目录(可选)
│ │ ├─view 视图目录(可选)
│ │ └─StartUp.php 当前模块启动文件,可设置与项目相关的配置文件及接管路由,接管权限(可选)
例如一个简单的模块启动类 StartUp.php
<?php
namespace app\home;
use beacon\core\Config;
class StartUp
{
public static function init()
{
#添加一个配置项,设置模板的目录位置,只对当前应用模块有效。
Config::append([
'sdopx.template_dir' => ['/app/home/view', '/view/layout'],
]);
}
}
模块启动页面可实现两个静态方法:
public static function init() 方法 用于模块启动前进行相应的设置,和代码执行前检查。
public static function execute(array $data) 用于接管路由处理,App::run() 启动项目后,会解析相应的
$data 字典值:
ctl (控制器名)
act (方法名)
app (应用模块名)
className (控制器类名)
classFullName (控制器类名,带完整的命名空间)
namespace (所在命名空间)
你可以 从 $data 中获得相应的参数,并根据实际需要,改写路由转发,或者做url权限控制。
如下面判断 控制器类 不存在时,转发到其他控制器上去执行。
namespace app\admin;
use beacon\core\App;
use \beacon\core\Config;
use beacon\core\RouteError;
class StartUp
{
public static function init()
{
Config::append([
'webname' => '叶子的博客',
'sdopx.template_dir' => ['/app/admin/view', '/app/admin/zero/view'],
]);
}
/**
* 接管应用执行
* @param array $data
* @throws \ReflectionException
* @throws \beacon\core\RouteError
*/
public static function execute(array $data)
{
$classFullName = $data['classFullName'];
#如果控制器类不存,则转发到 命名空间 下的 zero\\controller\Zero{className} 去执行。
if (!class_exists($classFullName)) {
$data['className'] = 'Zero' . $data['className'];
$classFullName = $data['namespace'] . '\\zero\\controller\\' . $data['className'];
if (!class_exists($classFullName)) {
throw new RouteError('没有找到控制器信息:' . $data['className']);
}
}
App::executeMethod($classFullName, $data['method']);
}
}
控制器
每个模块拥有独立的MVC
类库及配置文件,一个模块下面有多个控制器负责响应请求,而每个控制器其实就是一个独立的控制器类。
控制器主要负责请求的接收,并调用相关的模型处理,并最终通过视图输出。严格来说,控制器不应该过多的介入业务逻辑处理。
namespace app\home\controller;
use beacon\core\Controller;
use beacon\core\Method;
class Index extends Controller
{
/**
* /index
* 直接输出字符串
* @return string
*/
#[Method(act: 'index', method: Method::GET)]
public function index()
{
return 'hello,beaconPHP!';
}
/**
* 使用模板 /index/show
*/
#[Method(act: 'show', method: Method::GET)]
public function show()
{
$this->display('index.tpl');
}
}
操作
一个控制有多个操作,对应不同的控制器方法,要求控制器的方法必须是 public 公开的方法,并且 使用注解 Method(act:'opt') 指定操作名称 用于绑定到控制器的方法上,操作名与方法名可以不必一致,不过为了便于查找记忆,建议保持一致。
如上面的代码中 act:'index' 是一个操作, act:'show' 是一个操作。 对应到 控制器的 index() 及 show() 方法。
未公开的方法,或者未定义Method注解的方法外界不可访问。
#[Method(act: 'index', method: Method::GET|Method::POST)]
表示允许 GET 和 POST 访问
#[Method(act: 'index', method: Method::GET)]
表示仅允许 GET 访问
#[Method(act: 'index', method: Method::GET,contentType: 'json')]
表示仅允许 GET 访问,并且内容头 header 返回时设置为 json 格式返回
模型
beaconPHP 的模型与其他框架的模型设计存有很大差异,除了可以用于数据处理,逻辑处理,beaconPHP 的模型还可以参与表单界面处理,包括表单生成,表单验证,以及自动完成表单取值,在beaconPHP中的模型主要是表单与数据之间的处理关系。
视图
beaconPHP 的视图渲染,主要是使用模板引擎 《Sdopx 模板引擎》进行渲染输出,sdopx 模板引擎语法结构与smarty模板引擎类似,但是做了很多的优化大大提升整体性能。
帮助手册地址在这里:
http://sdopx.wj008.net