自定义系统类
1、定义被服务的对象类
<?php
namespace app\common;
/**
* 自定义服务类
*/
class MyServiceDemo
{
//定义一个静态成员变量
protected static $myStaticVar = '123';
//设置该变量的值
public static function setVar($value)
{
self::$myStaticVar = $value;
}
//用于显示该变量
public function showVar()
{
var_dump(self::$myStaticVar);
}
}
2、定义服务提供者
在项目根目录,命令行执行php think make:service MyService ,将会生成一个app\service\MyService.php文件,在其中写入代码。
<?php
declare (strict_types = 1);
namespace app\service;
use think\Service;
use app\common\MyServiceDemo;
class MyService extends \think\Service
{
/**
* 注册服务
*
* @return mixed
*/
public function register()
{
//将绑定标识到对应的类
$this->app->bind('my_service',MyServiceDemo::class);
}
/**
* 执行服务
*
* @return mixed
*/
public function boot()
{
//将被服务类的一个静态变量设置成另外一个值
MyServiceDemo::setVar('abc');
}
}
3、配置系统服务
在app\service.php文件如果没有就创建,写入
<?php
use app\AppService;
// 系统服务定义文件
// 服务在完成全局初始化之后执行
return [
AppService::class, //这个可以不用写入
'\app\service\MyService'
];
4、在控制器调用
创建一个控制器文件,写入代码:
<?php
namespace app\controller;
use app\BaseController;
use app\common\MyServiceDemo;
class About extends BaseController
{
public function index(MyServiceDemo $demo)
{
//在这里测试服务
//因为在服务提供类app\service\MyService的boot方法中设置了$myStaticVar='abc',所以这里输出‘abc'
//
echo $demo->showVar();
}
public function hello($name = 'ThinkPHP6')
{
return 'hello,' . $name;
}
}
//执行原理和分析见代码注释。另外说说自定义的服务配置是怎么加载的:App::initialize()中调用了
1 if (is_file($appPath . 'service.php')) {
2 $services = include $appPath . 'service.php';
3 foreach ($services as $service) {
4 $this->register($service);
5 }
6 }
正是这里将我们定义的服务加载进来并注册。