grigor / scanner
Сканер
Requires
- php: >=7.4
- ext-mbstring: *
- ext-yaml: *
- laminas/laminas-servicemanager: ^3.6.4
- psr/container: ^1.0.0
Requires (Dev)
- phpunit/phpunit: 8.5.x-dev
- dev-master
- 1.0.1
- 1.0.0
- dev-add-license-1
- dev-Refactoring_SettingsInstalling
- dev-Refactpring_ScanStrategy
- dev-Optimisation
- dev-extracting_the_bypass
- dev-refactor_scanner_add_psr11_and_serch_support
- dev-supports
- dev-path_equals
- dev-add_Filter_support
- dev-refactor_node_builder
- dev-fix_readme.md
- dev-Refinement
This package is not auto-updated.
Last update: 2025-03-31 18:44:10 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); // установка настроек и поиск
Visitor может быть таким
В данном случае печатает название файла и результат обработки 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 шт.
Пример реального использования вы можете посмотреть в проекте который генерирует настройки rest api в Yii2 на основе аннотаций yii2-generator, yii2-rest
Тестировать
composer tests