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