Работа с файлами — это как уборка в гараже: вроде всё просто, но стоит отвернуться, и там уже бардак. В Yii2 есть отличные инструменты для наведения порядка в файловой системе. Сегодня разберём, как читать, писать, удалять и проверять файлы, не изобретая велосипед.
Почему не стоит работать с файлами напрямую
Многие начинающие разработчики используют нативные функции 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');
Работа с директориями: создаём, читаем, удаляем
Директории — это контейнеры для файлов. 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, но с умом. И не забывайте про права доступа: неправильные права могут сломать весь проект.
Надеюсь, статья была полезной. Если остались вопросы — пишите в комментариях.


