Skip to content

Commit

Permalink
A "Moving Directories" section has been created for the user manual.
Browse files Browse the repository at this point in the history
  • Loading branch information
vinogradsoft committed Nov 13, 2023
1 parent f872b4d commit 0daa60c
Show file tree
Hide file tree
Showing 2 changed files with 123 additions and 1 deletion.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ composer require vinogradsoft/simple-files "^2.0"
* [Прикладные методы директорий](./docs/guide-ru/applied-methods.md)
* [Копирование директорий](./docs/guide-ru/copying-directories.md)
* [Запись директорий](./docs/guide-ru/writing-directories.md)
* [Перемещение директорий](./docs/guide-ru/stub.md)
* [Перемещение директорий](./docs/guide-ru/moving-directories.md)
* [Удаление директорий](./docs/guide-ru/stub.md)

### Работа с функциональностями
Expand Down
122 changes: 122 additions & 0 deletions docs/guide-ru/moving-directories.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
# Перемещение директорий

В этом разделе рассматривается пример процесса перемещения файлов и директорий. Процесс включает два основных этапа:

1) Создание объектной модели дерева файлов и директорий.
2) Перемещение созданного дерева на диск.

## Пример

В этом примере используются структурные методы для работы с объектами директорий. Если вы ещё не читали этот раздел, я
рекомендую вам прочитать. Ссылка на раздел ["Структурные методы директорий"](directory-structural-methods.md).

> Консольная команда в этом примере создается для выдуманного приложения. Для понимания как работает метод перемещения
> и понимания структуры модуля в примере, следует прочитать раздел с [описанием](applied-methods.md). Код для запуска
> можно скачать из этого [репозитория](https://github.com/vinogradsoft/example).
### Постановка задачи

Для автоматизации перемещения картинок требуется создать консольную команду, которая по не коему шаблону сможет найти
картинки в модуле и переместить их в папку `public/images`. Консольная команда должна принимать два аргумента: название
вендора и модуля в формате `<Vendor Name>/<Module Name>` и шаблон поиска в виде строки, такой же как принимает
функция php [glob](https://www.php.net/manual/ru/function.glob.php).

### Реализация

Напишем класс, который будет перемещать изображения в папку `example/public/images`.

Код:

```php
<?php

namespace Example;

use Vinograd\SimpleFiles\Directory;
use Vinograd\SimpleFiles\File;

class ImageMover
{

public function move(string $destination, string $pattern): void
{
$images = glob($pattern);
$imagesDirectory = new Directory('images');
foreach ($images as $image) {
$imagesDirectory->addFile(File::createBinded($image));
}
$imagesDirectory->move($destination);
}

}
```

Класс имеет один метод `move` с двумя аргументами: `$destination` и `$pattern`. Первый `$destination` - место назначения
для изображений (абсолютный путь до папки `example/public`). Второй `$pattern` - шаблон для поиска изображений.

Код довольно прост: функция `glob` сначала ищет изображения по указанному шаблону. После этого создается объект
директории назначения - `$imagesDirectory`. Затем в цикле создаются изображения, найденные по указанному шаблону, и
добавляются в объект директории `$imagesDirectory`. В конце вызывается метод `move` у объекта `$imagesDirectory` с
заданным путем назначения. В результате создается директория `images` в `example/public` (если она еще не существует) и
в неё перемещаются файлы изображений из текущего модуля.

Напишем файл запуска из консоли:

```php
#!/usr/bin/env php
<?php
declare(strict_types=1);

require_once dirname(__DIR__, 1) . '/vendor/autoload.php';

if (PHP_SAPI !== 'cli') exit(1);

$options = getopt('v:p:');

if (empty($options['v']) || empty($options['p'])) {
echo 'Accept option: -v=<Vendor Name/Module Name> -p=<pattern>';
exit(1);
}

$pathToModules = realpath(__DIR__ . '/../private/packages');
$viewFolder = $pathToModules . '/' . $options['v'] . '/View/';
if (!is_dir($viewFolder)) {
echo 'View folder not found.', PHP_EOL;
exit(1);
}

$pattern = $viewFolder . $options['p'];
(new \Example\ImageMover())->move(
realpath(__DIR__ . '/../public'),
$pattern
);
```

В этом файле создаётся объект `Example\ImageMover`, вызывается его метод `move`, передавая подготовленные параметры.
Важно отметить, что к паттерну добавляется путь к папке `View` целевого модуля для поиска изображений именно в ней.

В итоге команда может выглядеть так:

```
php move -v="VendorName/ModuleName" -p="*.png"
```

Пример для запуска вы можете клонировать себе из этого [репозитория](https://github.com/vinogradsoft/example).

Чтобы запустить команду, перейдите в консоли в папку с проектом:

```
cd path/to/cloned/example/bin/
```

Где `path/to/cloned` та папка, в которую вы скачали пример.
После этого можно перемещать изображения из модулей.

Команда ниже переместит все изображения с расширением `png` в модуле `VendorName/ModuleName` в
папку `example/public/images`. Причем если папка `images` не существует, она будет создана.

```
php move -v="VendorName/ModuleName" -p="*.png"
```

[К оглавлению](../../README.md#руководство)

0 comments on commit 0daa60c

Please sign in to comment.