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