Работа с файлами — это как уборка в гараже: вроде всё просто, но стоит отвернуться, и там уже бардак. В Yii2 есть отличные инструменты для наведения порядка в файловой системе. Сегодня разберём, как читать, писать, удалять и проверять файлы, не изобретая велосипед.

Digital-студия WNDER

Почему не стоит работать с файлами напрямую

Многие начинающие разработчики используют нативные функции PHP: file_get_contents, file_put_contents, unlink. Это работает, но есть нюансы. Yii2 предлагает обёртку — класс yii\helpers\FileHelper. Он берёт на себя рутину: проверку прав, обработку ошибок, работу с путями. Согласитесь, приятнее вызвать один метод, чем писать пять проверок.

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

use yii\helpers\FileHelper;

// Проверяем, существует ли файл
if (FileHelper::fileExists('path/to/file.txt')) {
    // Читаем содержимое
    $content = file_get_contents('path/to/file.txt');
}

Кстати, FileHelper::fileExists — это просто обёртка над file_exists, но с поддержкой потоков и удалённых файлов. Мелочь, а приятно.

Правило: Всегда используйте FileHelper для базовых операций. Это сэкономит время и убережёт от ошибок с правами доступа.

Чтение и запись: от простого к сложному

Чтение файла — задача настолько частая, что Yii2 предлагает несколько способов. Самый простой — file_get_contents. Но если файл большой, лучше читать построчно, чтобы не съесть всю память.

Вот пример построчного чтения с помощью FileHelper::readFile:

use yii\helpers\FileHelper;

$lines = FileHelper::readFile('path/to/large-file.txt');
foreach ($lines as $line) {
    // Обрабатываем строку
    echo $line . "\n";
}

А вот запись. Тут тоже есть нюансы. Если вы пишете в файл часто, используйте file_put_contents с флагом FILE_APPEND, чтобы не перезаписывать данные.

$data = "Новая строка\n";
file_put_contents('path/to/log.txt', $data, FILE_APPEND | LOCK_EX);

Флаг LOCK_EX блокирует файл на время записи. Это спасает от гонок, когда два процесса пишут одновременно.

Но Yii2 предлагает и более элегантный способ — FileHelper::writeFile. Он автоматически создаёт директории, если их нет, и возвращает количество записанных байт.

use yii\helpers\FileHelper;

$bytes = FileHelper::writeFile('path/to/new/file.txt', 'Содержимое');
if ($bytes === false) {
    throw new \Exception('Не удалось записать файл');
}

Удаление и копирование: осторожно, не снесите лишнее

Удаление файлов — операция опасная. Одна ошибка в пути, и вы потеряете что-то важное. В Yii2 есть FileHelper::unlink, который проверяет существование файла перед удалением.

use yii\helpers\FileHelper;

if (FileHelper::unlink('path/to/file.txt')) {
    echo 'Файл удалён';
} else {
    echo 'Файл не найден или не удалось удалить';
}

Копирование и перемещение тоже реализованы. FileHelper::copy и FileHelper::rename работают с проверками и возвращают булево значение.

FileHelper::copy('source.txt', 'destination.txt');
FileHelper::rename('old.txt', 'new.txt');
Лайфхак: Перед удалением всегда делайте резервную копию. Даже если уверены на 100%. Файловая система — дама капризная.

Работа с директориями: создаём, читаем, удаляем

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

Создание директории:

use yii\helpers\FileHelper;

FileHelper::createDirectory('path/to/new/dir', 0775, true);

Третий параметр true означает рекурсивное создание. То есть если родительских папок нет, они тоже создадутся.

Чтение содержимого директории:

$files = FileHelper::findFiles('path/to/dir', [
    'only' => ['*.txt', '*.log'],
    'recursive' => true,
]);

Здесь мы ищем только текстовые и лог-файлы, причём рекурсивно. Удобно, когда нужно обработать все файлы в проекте.

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

FileHelper::removeDirectory('path/to/dir');

Метод удаляет всё содержимое, включая подпапки. Будьте осторожны.

Продвинутые трюки: работа с путями и правами

Пути — это головная боль многих разработчиков. Относительные, абсолютные, с символическими ссылками. Yii2 предлагает FileHelper::normalizePath, который приводит путь к каноническому виду.

$path = FileHelper::normalizePath('path/../to/./file.txt');
// Вернёт 'path/to/file.txt'

Ещё одна полезная штука — FileHelper::getMimeType. Определяет MIME-тип файла по его содержимому, а не по расширению.

$mime = FileHelper::getMimeType('image.jpg');
// Вернёт 'image/jpeg'

А вот таблица с основными методами FileHelper, которые стоит запомнить:

Метод Описание Возвращает
fileExists Проверяет существование файла bool
readFile Читает файл построчно array
writeFile Записывает данные в файл int|false
unlink Удаляет файл bool
createDirectory Создаёт директорию bool
findFiles Ищет файлы по маске array
removeDirectory Удаляет директорию рекурсивно bool

Права доступа — ещё одна тема. Yii2 позволяет устанавливать их при создании файлов и директорий. Например, FileHelper::createDirectory принимает второй параметр — режим доступа. По умолчанию 0775, что означает чтение и запись для владельца и группы, чтение для остальных.

Что в итоге

Yii2 даёт разработчику удобные инструменты для работы с файловой системой. FileHelper избавляет от рутинных проверок и делает код чище. Главное — помнить о безопасности: всегда проверяйте пути, не доверяйте пользовательским данным и делайте резервные копии перед удалением.

Используйте FileHelper для базовых операций, а для сложных сценариев — нативные функции PHP, но с умом. И не забывайте про права доступа: неправильные права могут сломать весь проект.

Надеюсь, статья была полезной. Если остались вопросы — пишите в комментариях.

Студия WNDER