Статьи

Как использовать компонент файловой системы Symfony

В этой статье мы рассмотрим компонент файловой системы Symfony, который предоставляет полезные методы взаимодействия с файловой системой. После установки и настройки мы создадим несколько реальных примеров того, как его использовать.

Чаще всего вам нужно взаимодействовать с файловой системой, если вы имеете дело с PHP-приложениями. В большинстве случаев вы либо используете основные функции PHP, либо создаете свой собственный класс-оболочку для достижения желаемой функциональности. В любом случае, это трудно поддерживать в течение более длительного периода времени. Так что вам нужна библиотека, которая хорошо поддерживается и проста в использовании. Вот где появляется компонент Symfony Filesystem.

Компонент Symfony Filesystem предоставляет полезные методы-оболочки, которые делают взаимодействие с файловой системой легким и увлекательным. Давайте быстро посмотрим на что он способен:

  • создание каталога
  • создание файла
  • редактирование содержимого файла
  • изменение владельца и группы файла или каталога
  • создание символической ссылки
  • копирование файла или каталога
  • удаление файла или каталога
  • и более

В этой статье я покажу вам, как раскрыть возможности компонента Symfony Filesystem. Как обычно, мы начнем с инструкций по установке и настройке, а затем реализуем несколько реальных примеров, чтобы продемонстрировать ключевые концепции.

В этом разделе мы собираемся установить компонент файловой системы Symfony. Я предполагаю, что вы уже установили Composer в своей системе, так как он нам понадобится для установки компонента файловой системы, доступного в Packagist.

Итак, установите компонент Файловая система, используя следующую команду.

1
$composer require symfony/filesystem

Это должно было создать файл composer.json , который должен выглядеть следующим образом:

1
2
3
4
5
{
    «require»: {
        «symfony/filesystem»: «^4.1»
    }
}

Так что это часть установки, но как вы должны ее использовать? Фактически, это просто вопрос включения файла autoload.php, созданного Composer, в ваше приложение, как показано в следующем фрагменте.

1
2
3
4
5
<?php
require_once ‘./vendor/autoload.php’;
 
// application code
?>

В этом разделе мы создадим пример, который демонстрирует, как вы можете использовать компонент файловой системы в своих приложениях для выполнения различных операций файловой системы.

Для начала давайте создадим файл index.php со следующим содержимым.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
<?php
require_once ‘./vendor/autoload.php’;
 
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Filesystem\Exception\IOExceptionInterface;
 
// init file system
$fsObject = new Filesystem();
$current_dir_path = getcwd();
 
// make a new directory
// create a new file and add contents
// copy a directory
// remove a directory

Здесь мы инициализировали объект Filesystem в $fsObject и сохранили текущий каталог в $current_dir_path . В следующих разделах мы будем использовать $fsObject для выполнения различных операций.

Сначала мы создадим новый каталог.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
//make a new directory
try {
    $new_dir_path = $current_dir_path .
 
    if (!$fsObject->exists($new_dir_path))
    {
        $old = umask(0);
        $fsObject->mkdir($new_dir_path, 0775);
        $fsObject->chown($new_dir_path, «www-data»);
        $fsObject->chgrp($new_dir_path, «www-data»);
        umask($old);
    }
} catch (IOExceptionInterface $exception) {
    echo «Error creating directory at».
}

Здесь мы использовали метод exists чтобы проверить, существует ли каталог foo, до его создания.

Затем мы использовали метод mkdir для создания каталога foo с разрешениями 0775 , что означает возможность чтения и выполнения всеми, но только для записи владельцем файла и их группой. (Это восьмеричная нотация для разрешений файловой системы — чтобы узнать больше, ознакомьтесь с этой разбивкой восьмеричной нотации .) Далее, мы использовали методы chown и chgrp, чтобы изменить владельца и группу каталога foo .

В этом разделе мы создадим новый файл и добавим в него содержимое.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
// create a new file and add contents
try {
    $new_file_path = $current_dir_path .
 
    if (!$fsObject->exists($new_file_path))
    {
        $fsObject->touch($new_file_path);
        $fsObject->chmod($new_file_path, 0777);
        $fsObject->dumpFile($new_file_path, «Adding dummy content to bar.txt file.\n»);
        $fsObject->appendToFile($new_file_path, «This should be added to the end of the file.\n»);
    }
} catch (IOExceptionInterface $exception) {
    echo «Error creating file at».
}

Здесь мы использовали touch метод для создания нового файла, а затем использовали chmod для установки его разрешений на 0777 — глобально читаемый, записываемый и исполняемый.

После создания файла вы можете использовать метод dumpFile для добавления содержимого в этот файл. С другой стороны, если вы хотите добавить содержимое в уже существующий файл, вы можете использовать метод appendToFile , как показано в приведенном выше примере.

До сих пор мы создали каталог foo и файл bar.txt, используя объект $fsObject . В этом разделе мы увидим, как скопировать каталог вместе с содержимым.

01
02
03
04
05
06
07
08
09
10
11
12
//copy a directory
try {
    $src_dir_path = $current_dir_path .
    $dest_dir_path = $current_dir_path .
 
    if (!$fsObject->exists($dest_dir_path))
    {
        $fsObject->mirror($src_dir_path, $dest_dir_path);
    }
} catch (IOExceptionInterface $exception) {
    echo «Error copying directory at».
}

Как видите, сначала мы создали имена путей с конкатенацией строк. Затем, как только мы убедились в том, что каталог еще не существует, используя метод exist, мы использовали метод mirror чтобы скопировать каталог foo в каталог foo_copy .

Наконец, давайте посмотрим, как удалить каталог.

01
02
03
04
05
06
07
08
09
10
11
//remove a directory
try {
    $arr_dirs = array(
        $current_dir_path .
        $current_dir_path .
    );
 
    $fsObject->remove($arr_dirs);
} catch (IOExceptionInterface $exception) {
    echo «Error deleting directory at».
}

Опять же, это довольно просто — чтобы удалить каталог, вы просто используете метод remove .

Вы можете найти полный код index.php в нашем репозитории GitHub .

Итак, это краткое введение в компонент Symfony Filesystem. Компонент Symfony Filesystem предоставляет методы, которые упрощают взаимодействие с файловой системой. Мы рассмотрели, как установить компонент, и создали несколько примеров, демонстрирующих различные аспекты компонента.

Я надеюсь, что вам понравилась эта статья, и не стесняйтесь оставлять свои мысли, используя канал ниже!