手记:新版安装后自动执行两条命令 ServiceDiscover和VendorPublish
定义事件,采用了脚本的方式写在object根目录里
"scripts": {
"post-autoload-dump": [
"@php think service:discover", // @php think 屏蔽异常,采用命令行模式执行
"@php think vendor:publish" // 同上
]
}
pre-autoload-dump在自动加载器被转储前触发,无论是 install/update 还是 dump-autoload 命令都会触发。
两个文件的位置在核心文件库的console-》command目录下
手记:读取composer下installed.json文件时,将内容直接转为数组
public function handle() // VendorPublish类的handle函数
{
$force = $this->input->getOption('force'); // 命令行中的参数,强制命令参数
if (is_file($path = $this->app->getRootPath() . 'vendor/composer/installed.json')) {
$packages = json_decode(@file_get_contents($path), true); // json_decode第二个参数true,将文件对象转换成关联数组
foreach ($packages as $package) {
//配置
$configDir = $this->app->getConfigPath(); // 获取配置文件所在的目录
if (!empty($package['extra']['think']['config'])) {
$installPath = $this->app->getRootPath() . 'vendor/' . $package['name'] . DIRECTORY_SEPARATOR; // composer项目路径
foreach ((array) $package['extra']['think']['config'] as $name => $file) { // 将获取到的目录信息直接强制转换成关联数组
$target = $configDir . $name . '.php'; // 组建配置文件全名 basename+后缀名
$source = $installPath . $file; // 组建配置文件的来源 路径名+json文件中读取到的文件名
if (is_file($target) && !$force) {
$this->output->info("File {$target} exist!"); // 检测到目标文件已存在
continue; // 跳过本次操作
}
if (!is_file($source)) {
$this->output->info("File {$source} not exist!");
continue;
}
copy($source, $target); // CLI命令行模式中复制源文件到App目录下
}
}
}
$this->output->writeln('
}
}
public function execute(Input $input, Output $output) // ServiceDiscover类中的execute函数
{
if (is_file($path = $this->app->getRootPath() . 'vendor/composer/installed.json')) {
$packages = json_decode(@file_get_contents($path), true); // 读取json文件,json对象直接转换成关联数组存入变量$packages中
$services = [];
foreach ($packages as $package) {
if (!empty($package['extra']['think']['services'])) {
$services = array_merge($services, (array) $package['extra']['think']['services']); // 制定services服务内容存入$services变量中
}
}
$header = '// This file is automatically generated at:' . date('Y-m-d H:i:s') . PHP_EOL . 'declare (strict_types = 1);' . PHP_EOL; //编写php文件模板内容 header部分
$content = '
file_put_contents($this->app->getRootPath() . 'vendor/services.php', $content); // 将文件内容写入到vendor/services.php文件中
$output->writeln('
}
}
var_export 此函数返回关于传递给该函数的变量的结构信息,它和 var_dump() 类似,不同的是其返回的表示是合法的 PHP 代码。
您可以通过将函数的第二个参数设置为 TRUE,从而返回变量的表示。
用法参见:https://www.php.net/manual/zh/function.var-export.php