Finder 4.0: 10 let zkušeností pod kapotou

před 2 lety od David Grudl  

Nette Finder umožňuje hledat soubory a složky na základě kritérií. Nová verze 4.0 byla kompletně přepsána s využitím 10 let zkušeností s používáním předchozích verzí. Díky tomu vznikl nástroj, který se vám bude ještě lépe a efektivněji používat.

Masky, všude, najednou

Nová verze Nette Finder 4.0 podporuje znak ** zvaný globstar, který je mocným trumfem, protože umožňuje hledat i v podadresářích. Například pomocí masky src/**/tests/*.php hledáte všechny PHP soubory v adresáři tests nacházejícím se v src nebo jakémkoliv jeho podadresáři:

Finder::findFiles('src/**/tests/*.php');

Masky lze používat i v metodách in(), from() nebo exclude():

Finder::findFiles('*.php')->in('/foo/**/vendor'); // najde /foo/sub1/sub2/vendor/file.php
Finder::findFiles('*.php')->from('/foo/**/vendor'); // najde i /foo/sub1/sub2/vendor/sub3/file.php

FileInfo

Vrácené soubory jsou objekty Nette\Utils\FileInfo, což je potomek původního SplFileInfo, který navíc přidává metody getRelativePath() a getRelativePathname() užitečné při procházení do hloubky přes from(). A dále metody read() a write() pro přečtení/zápis obsahu souboru:

foreach (Finder::findFiles('*.md') as $file) {
	$contents = $file->read();
	$contents = str_replace('http://', 'https://', $contents);
	$file->write($contents);
}

Rozšířené API

Pomocí metod files() a directories() můžete doplňovat, co dalšího se má vyhledat. Metody lze volat opakovaně a jako parametr lze uvést i pole masek:

Finder::findDirectories('tests') // všechny adresáře tests/
	->files(['*.php', '*.phtml']); // plus všechny PHP soubory

Alternativou statických metod je vytvoření instance pomocí new Finder (takto vytvořený objekt nevyhledává nic) a uvedení, co hledat, pomocí files() a directories():

(new Finder)
	->directories()      // všechny adresáře
	->files('*.php');    // plus všechny PHP soubory

Pokud potřebujete hledat různé typy souborů, které jsou v odlišných umístěních nebo splňují rozdílná kritéria, použijte metodu append(). Vrací nový objekt Finder, takže je možné řetězit volání metod:

($finder = new Finder) // do proměnné $finder si uložíme první Finder
	->files('*.php')   // v src/ hledáme soubory *.php
	->from('src')
	->append()
	->files('*.md')    // v docs/ hledáme soubory *.md větší než 1000 bajtů
	->from('docs')
	->size('>', 1000)
	->append()
	->files('*.json'); // v aktuální složce hledáme soubory *.json

Alternativně lze použít metodu append() pro přidání konkrétního souboru nebo pole souborů:

$finder = Finder::findFiles('*.txt')
	->append(__FILE__);

Řazení výsledků

Finder 4.0 nabízí možnost řazení výsledků. Metoda sortByName() řadí výsledky podle názvů souborů. Řazení je naturální, tedy správně si poradí s čísly v názvech a vrací např. foo1.txt před foo10.txt. Finder umožňuje také řadit pomocí vlastní funkce. Například takto seřadíme soubory podle velikosti:

$finder->sortBy(fn($a, $b) => $a->getSize() <=> $b->getSize());

A mnoho dalšího

Kompletní přehled funkcí najdete v dokumentaci Finderu.

Finder je nově součástí balíčku Nette Utils 4.0. Tedy balíček nette/utils verze 4 nahrazuje původní nette/finder. Poznámky pro upgrade jsou v migrační příručce.