Wyszukiwanie plików i katalogów w PHP z komponentem Finder Symfony2

Ten wpis został napisany dawno temu i może być już nieaktualny.

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ż?

Jakub Zalas

Jakub Zalas

Architekt, Programista, Trener