grigor/scanner

1.0.1 2021-03-07 23:30 UTC

README

通用扫描器。允许扫描树形结构。目前实现了用于处理文件和目录的驱动程序。

安装

安装此扩展的首选方式是通过 composer

运行以下命令

php composer require --prefer-dist grigor/scanner "1.0.1"

或将其添加到 composer.json 中

"grigor/scanner": "~1.0.1"

基本使用

index.php 文件

<?php
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
require __DIR__ . '/../vendor/autoload.php';
require 'Visitor.php';
require 'LeafHandler.php';

use Laminas\ServiceManager\Factory\InvokableFactory;
use Scanner\Driver\File\FilesSearchSettings;
use Scanner\Driver\File\System\Read\YamlReadSupport;
use Scanner\Scanner;

/** 
 * Создание экземпляра сканера и установка зависимостей 
 * (внутри живет Laminas\ServiceManager\ServiceManager подробности https://docs.laminas.dev/laminas-servicemanager/) 
 * вы можете передать свою реализацию PSR 11.
 * LeafHandler - это обработчик целевых файлов (ваша реализация поиска внутри файла который прошел фильтры 
 * или получение другой информации о файле: дата создания и тп.)
 */
$scanner = new Scanner(['factories' => [
    LeafHandler::class => InvokableFactory::class,
]]);
/**
* Визитер ваша реализация обработки целевого файла который прошел фильтры 
 * и поиск внутри если был установлен (в данном случае LeafHandler)
 */
$visitor = new Visitor();
$scanner->setScanVisitor($visitor);

$path = realpath(__DIR__ . '/../../bigland');

$settings = new FilesSearchSettings();
$settings->search(['source' => $path])
    ->filter(['FILE' => ['extension' => 'yml']]) // установка фильтра по расширению 
    ->support(['FILE' => [YamlReadSupport::class]]) //добавление возможности парсить yml файлы 
    ->strategy([
        'handle' => [
            'leaf' => [LeafHandler::class, 'multiTarget' => true] //установка обработчика который копается внутри файла который прошел фильтры
        ]
    ]);

    $scanner->search($settings); // установка настроек и поиск

访客可以是这样的

在这种情况下,打印文件名和 LeafHandler 的处理结果,并在最后打印出找到的总文件数。

<?php

use Scanner\Driver\Parser\NodeFactory;
use Scanner\Strategy\AbstractScanStrategy;
use Scanner\Strategy\ScanVisitor;

class Visitor implements ScanVisitor
{
    private $counter = 0;

    public function scanStarted(AbstractScanStrategy $scanStrategy, $detect): void {}

    public function scanCompleted(AbstractScanStrategy $scanStrategy, $detect): void
    {
        echo '______________________________' . PHP_EOL;
        echo 'Найдено файлов: ' . $this->counter . ' шт.' . PHP_EOL;
    }

    /**
     * определил лист
     * @param AbstractScanStrategy $scanStrategy
     * @param NodeFactory $factory
     * @param $detect
     * @param $found
     */
    public function visitLeaf(AbstractScanStrategy $scanStrategy, NodeFactory $factory, $detect, $found, $data = null): void
    {
        $this->counter++;
        echo 'Найден файл: ' . $found . PHP_EOL;;
        echo $data . PHP_EOL;
        echo '====================================' . PHP_EOL;
    }

    public function visitNode(AbstractScanStrategy $scanStrategy, NodeFactory $factory, $detect, $found, $data = null): void {}

}

LeafHandler 可以是这样的

解析经过过滤的文件,并返回结果或 null。如果返回 null,则不执行 Visitor::visitLeaf(...) 方法。

<?php

use Scanner\Strategy\TargetHandler;
use Scanner\Driver\Parser\NodeFactory;

class LeafHandler implements TargetHandler
{
    public function handle(NodeFactory $factory, $detect, $found)
    {
        $file = $factory->createLeaf($detect, $found);
        $yml = $file->yamlParseFile();// метод появился благодаря поддержке YamlReadSupport::class 
        $file->revokeAllSupports(); // если хотите, чтобы экземпляры удалялись из памяти вам нужно освободить их от поддержек которые назначены в версии для  php8 будет использоваться WeakMap и проблема будет решена
        if (isset($yml['version'])) {
            return 'Значение версии равно ' . $yml['version'];
        }
        return null;
    }
}

示例可以在控制台运行。

$ php example/index.php

输出

Найден файл: test.yml
Значение версии равно 45
====================================
Найден файл: test2.yml
Значение версии равно 70
====================================
Найден файл: test.yml
Значение версии равно 3.2
====================================
______________________________
Найдено файлов: 3 шт.

您可以在基于注解生成 Yii2 REST API 配置的项目中查看实际使用示例 yii2-generatoryii2-rest

测试

composer tests