() 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 предоставляет методы, делающие взаимодействие с файловой системой легким и простым. Мы посмотрели, как установить компонент, и создали несколько примеров для демонстрации различных аспектов применения компонента.
Я надеюсь, что вам понравилась эта статья, и не стесняйтесь поделиться своими мысли по поводу нее.