Bootstrap

引导类负责应用程序的引导和初始化工作,包括配置文件,日志,请求体,依赖注入的引导等。

Application流程内的引导事件实现

引导类是通过继承Tiny\MVC\ApplicationBase的Applicatioan实例初始化,$app->run()执行MVC流程的第一个动作。

namespace Tiny\MVC;

class ApplicationBase
{
    ...

    public function run()
    {
        $this->bootstrap();
        ...
    }

    public function bootstrap()
    {
        // 判断是否进行引导类加载和触发引导事件
        if (!$this->properties['bootstrap.enabled']) {
            return;
        }

        // 获取配置的引导类class
        $eventListener = $this->properties['bootstrap.event_listener'];
        if (!is_string($eventListener) && !is_array($eventListener)) {
            throw new ApplicationException('properties.bootstrap.eventListeners must be an array type or a string type class name');}

        // 加入监听onBootstrap事件
        $this->eventManager->addEventListener($eventListener);

        // 触发onBootstrap事件
        $this->eventManager->triggerEvent(new MvcEvent(MvcEvent::EVENT_BOOTSTRAP));
    }

}

标准库参考

profile.php内的配置

bootstrap.enabled = true|false 选择关闭或开启引导类。
bootstrap.event_listener = class 可更改为自定义的实现了MvcEvent::EVENT_BOOTSTRAP监听事件的引导类
也可通过profile.php的event.listeners[] = class配置添加。

/**
 * Application引导类
 * 
 * 通过监听引导事件触发
 * 
 * bootstrap.enabled 
 *      开启引导
 * 
 * bootstrap.event_listener
 *      string 实现Bootstrapevent_listener的类名
 *      array [实现Bootstrapevent_listener的类名]
 *      
 */
$profile['bootstrap']['enabled'] = true;
$profile['bootstrap']['event_listener'] = \App\Event\Bootstrap::class;

引导类的实现

  • 自定义Bootstrap类,需要继承基类Tiny\MVC\Bootstrap\Bootstrap; 该基类实现了事件监听接口Tiny\MVC\Event\BootstrapEventListenerInterface;
  • 通过$app->bootstrap()触发MvcEvent::EVENT_BOOTSTRAP事件时,Tiny\MVC\Bootstrap\Bootstrap会调用成员函数onbootstrap进行事件处理, 其流程为:
    • 寻找所有前缀带有init的成员函数,通过容器自动注入并执行。
    • 支持@autowired 自动加载类,自动注解注入成员属性,执行其成员函数。
namespace App\Event;

use Tiny\MVC\Bootstrap\Bootstrap as Base

/**
* 自定义引导类
*
* @autowired 自动注解可自动加载入容器
*/
class Bootstrap extend Base
{
    /**
    *  @autowired 自动注入当前应用实例
    */
    private ApplicationBase $app;

    // 触发onBootstrap引导事件时,自动执行init前缀的成员函数
    public function initAutoloader()
    {
        // 引入其他库
        $path = TINY_ROOT_PATH . 'lib/tinyphporg';
        $namespace = 'tinyphporg';
        $runtime = \Tiny\Runtime\Runtime::getInstance();
        $runtime->import($path, $namespace);  
    }

    // 重设properties的节点data设置
    public function initConfig()
    {
        $data = [];
        $this->application->properties->set('data',$data);
    }

    // 注册事件
    /**
    * @autowired 自动注入并执行该成员函数
    */
    public function event(EventManager $eventManager)
    {
        $listener = '...';
        $eventManager->addEventListener($listener);
    }

    //注册视图引擎
    ...

    //注册路由
    ...
}

标注库参考


Tiny\MVC\Bootstrap:引导