Advertisement
  1. Code
  2. PHP

Как использовать Symfony-компонент Filesystem

Scroll to top
Read Time: 5 min

() translation by (you can also view the original English article)

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

Symfony-компонент Filesystem 

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

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

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

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

Установка и настройка

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

Так, идем дальше и устанавливаем компонент Filesystem с помощью следующей команды.

1
$composer require symfony/filesystem

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

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

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

1
<?php
2
require_once './vendor/autoload.php';
3
4
// application code

5
?>

Пример из реальной жизни

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

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

1
<?php
2
require_once './vendor/autoload.php';
3
4
use Symfony\Component\Filesystem\Filesystem;
5
use Symfony\Component\Filesystem\Exception\IOExceptionInterface;
6
7
// init file system

8
$fsObject = new Filesystem();
9
$current_dir_path = getcwd();
10
11
// make a new directory

12
// create a new file and add contents

13
// copy a directory

14
// remove a directory

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

Создание новой директории

Во-первых мы создадим новую директорию.

1
//make a new directory

2
try {
3
    $new_dir_path = $current_dir_path . "/foo";
4
5
    if (!$fsObject->exists($new_dir_path))
6
    {
7
        $old = umask(0);
8
        $fsObject->mkdir($new_dir_path, 0775);
9
        $fsObject->chown($new_dir_path, "www-data");
10
        $fsObject->chgrp($new_dir_path, "www-data");
11
        umask($old);
12
    }
13
} catch (IOExceptionInterface $exception) {
14
    echo "Error creating directory at". $exception->getPath();
15
}

Мы использовали метод exists для проверки, существует ли уже директория foo, перед тем как создать ее.

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

Создание нового файла и добавление содержимого

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

1
// create a new file and add contents

2
try {
3
    $new_file_path = $current_dir_path . "/foo/bar.txt";
4
5
    if (!$fsObject->exists($new_file_path))
6
    {
7
        $fsObject->touch($new_file_path);
8
        $fsObject->chmod($new_file_path, 0777);
9
        $fsObject->dumpFile($new_file_path, "Adding dummy content to bar.txt file.\n");
10
        $fsObject->appendToFile($new_file_path, "This should be added to the end of the file.\n");
11
    }
12
} catch (IOExceptionInterface $exception) {
13
    echo "Error creating file at". $exception->getPath();
14
}

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

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

Копирование директории

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

1
//copy a directory

2
try {
3
    $src_dir_path = $current_dir_path . "/foo";
4
    $dest_dir_path = $current_dir_path . "/foo_copy";
5
6
    if (!$fsObject->exists($dest_dir_path))
7
    {
8
        $fsObject->mirror($src_dir_path, $dest_dir_path);
9
    }
10
} catch (IOExceptionInterface $exception) {
11
    echo "Error copying directory at". $exception->getPath();
12
}

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

Удаление директории

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

1
//remove a directory

2
try {
3
    $arr_dirs = array(
4
        $current_dir_path . "/foo",
5
        $current_dir_path . "/foo_copy"
6
    );
7
8
    $fsObject->remove($arr_dirs);
9
} catch (IOExceptionInterface $exception) {
10
    echo "Error deleting directory at". $exception->getPath();
11
}

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

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

Заключение

Это было краткое введение в компонент Filesystem, разработанный Symfony. Symfony-компонент Filesystem предоставляет методы, делающие взаимодействие с файловой системой легким и простым. Мы посмотрели, как установить компонент, и создали несколько примеров для демонстрации различных аспектов применения компонента.

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

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.