composer手记

手记:新版安装后自动执行两条命令 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('Succeed!');    // 结束语

    }

}


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('Succeed!');  // 结束语

    }

}


var_export 此函数返回关于传递给该函数的变量的结构信息,它和 var_dump() 类似,不同的是其返回的表示是合法的 PHP 代码。

您可以通过将函数的第二个参数设置为 TRUE,从而返回变量的表示。

用法参见:https://www.php.net/manual/zh/function.var-export.php

你可能感兴趣的:(composer手记)