入口文件

用户请求的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

 

上一篇:目录结构及常量
下一篇:路由设置
Copyright © 2021 海南的叶子 All Rights Reserved 琼ICP备2021000725号

琼公网安备 46900702000037号