Komponent Finder sprawia, że wyszukiwanie plików i katalogów w PHP przestaje być męczące. Pozwala na filtrowanie po nazwie, wzorcu, rozmiarze, dacie modyfikacji i kilku innych kryteriach. W wyniku dostaniemy listę obiektów klasy SplFileInfo, która oferuje wygodny interfejs do pozyskiwania szczegółów na temat plików i katalogów. Uwaga: Kod tworzony w tym wpisie jest dostępny na githubie: https://github.com/jakzal/SymfonyComponentsExamples
Instalacja
Komponent możemy zainstalować za pomocą kanału PEAR Symfony2 lub go po prostu pobrać z githuba. Na potrzeby tego wpisu sklonujemy źródła do katalogu vendor/ naszego projektu.
git clone https://github.com/symfony/Finder.git vendor/Symfony/Component/Finder
Użyjemy ClassLoader, innego komponentu Symfony2, do automatycznego ładowania klas. Więcej o tym komponencie we wpisie "Automatyczne ładowanie klas w dowolnym projekcie PHP z komponentem ClassLoader Symfony2". Poniższy kod wystarczy, aby wszystkie klasy z dowolnego komponentu Symfony2 były automatycznie ładowane (zakładając, że komponenty są umieszczane w katalogu vendor/Symfony/Component):
<?php
// src/autoload.php
require_once __DIR__.'/../vendor/Symfony/Component/ClassLoader/UniversalClassLoader.php';
$loader = new Symfony\Component\ClassLoader\UniversalClassLoader();
$loader->registerNamespaces(array(
'Symfony' => __DIR__.'/../vendor',
'PSS' => __DIR__
));
$loader->register();
Przykłady
Główną klasą komponentu, z którą będziemy pracować, to Finder. Po utworzeniu obiektu metodą create() użyjemy płynnego interfejsu (ang. fluent interface), aby zdefiniować kryteria. Metod filtrujących i sortujących najlepiej nauczymy się ze źródeł klasy Finder. Przykład 1: Poniższy skrypt wypisze komponenty Symfony zainstalowane w katalogu vendor/Symfony/Component:
<?php
// finderdir.php
require_once __DIR__.'/src/autoload.php';
use Symfony\Component\Finder as Finder;
$components = Finder\Finder::create()
->directories()
->depth(0)
->in('vendor/Symfony/Component');
echo "Installed Symfony components:\n";
foreach ($components as $dir) {
printf("* %s \n", $dir->getFilename());
}
Przykład 2, bardziej wyrafinowany: Poniższy skrypt wypisze pliki pasujące do wzorca /^He.+Command.php$/, mniejsze niż 4kb i zmodyfikowane do wczoraj. Wynik zostanie posortowany po nazwie pliku, a szukać będziemy w aktualnym katalogu:
<?php
// finder.php
require_once __DIR__.'/src/autoload.php';
use Symfony\Component\Finder as Finder;
$files = Finder\Finder::create()
->files()
->name('/^He.+Command.php$/')
->size('<4k')
->date('until yesterday')
->sortByName()
->in('.');
echo "Command files starting with 'He' below 4k modified until yesterday:\n";
foreach ($files as $file) {
printf("* %s %s\n", $file->getFilename(), date('Y-m-d H:i', $file->getMTime()));
}
Proste, nieprawdaż?