Str

Moony\bootstrap\core\helpers\Str — statická třída pro práci s řetězci. Dostupná i v Twig šablonách přes {{ app.str.metoda() }}.

Str::isJson(string $value)Vrátí true pokud je string validní JSON
Str::limit(string $value, int $limit = 100, string $end = '...')Ořízne string na zadanou délku, přidá koncovku
Str::random(int $length = 16)Vygeneruje náhodný alfanumerický řetězec
Str::replaceFirst(string $search, string $replace, string $subject)Nahradí první výskyt
Str::replaceLast(string $search, string $replace, string $subject)Nahradí poslední výskyt
Str::replaceAll(string|array $search, string|array $replace, string $subject)Nahradí všechny výskyty (wrapper nad str_replace)
Str::startsWith(string $haystack, string $needle)Začíná řetězec daným prefixem
Str::endsWith(string $haystack, string $needle)Končí řetězec daným suffixem
Str::contains(string $haystack, string $needle)Obsahuje řetězec podřetězec
Str::empty(?string $var)Skutečná kontrola prázdného stringu (null nebo ''). Bezpečnější než nativní empty().
Str::slug(string $title, string $separator = '-')URL-friendly slug — odstraní diakritiku, speciální znaky, lowercase
Str::camel(string $value)Převede na camelCase: 'user-name' → 'userName'
Str::snake(string $value, string $delimiter = '_')Převede na snake_case: 'userName' → 'user_name'
Str::kebab(string $value)Převede na kebab-case: 'userName' → 'user-name'
Str::mask(string $value, string $char = '*', int $visibleStart = 2, int $visibleEnd = 2)Zamaskuje část stringu: 'denis@email.com' → 'de***********om'
Str::slug('Článek o PHP frameworku');   // "clanek-o-php-frameworku"
Str::limit('Dlouhý text...', 10);       // "Dlouhý te..."
Str::random(32);                          // "a1b2c3d4e5f6..."
Str::mask('denis@email.com');             // "de***********om"
Str::camel('created_at');                 // "createdAt"
Str::snake('createdAt');                  // "created_at"
Str::empty('');                           // true
Str::empty(null);                         // true
Str::empty('0');                          // false (rozdíl od native empty())

Arr

Moony\bootstrap\core\helpers\Arr — statická třída pro práci s poli. Podporuje tečkovou notaci pro přístup k vnořeným hodnotám. Dostupná v Twig přes {{ app.arr.metoda() }}.

Arr::get(array $array, string|int|null $key, mixed $default = null)Vrátí hodnotu z pole, podporuje tečkovou notaci: 'user.address.city'
Arr::exists(array $array, string|int|float $key)Existuje klíč v poli
Arr::accessible(mixed $value)Je hodnota pole
Arr::sum(array $array, string|int|null $key)Součet hodnot v multidimenzionálním poli dle klíče (tečková notace)
Arr::groupBy(array $array, string $key)Seskupí prvky pole podle hodnoty klíče
Arr::depth(array $array)Vrátí hloubku (počet dimenzí) pole
Arr::only(array $array, array $keys)Vrátí jen zadané klíče z pole
Arr::except(array $array, array $keys)Vrátí pole bez zadaných klíčů
Arr::flatten(array $array, int $depth = INF)Zploští vícerozměrné pole do jednorozměrného
Arr::generateCombinations(array $array)Vygeneruje všechny kombinace hodnot z více polí
Arr::mergeByDataRichness(array ...$arrays)Sloučí pole — vybere hodnotu s nejvíce daty (nejdelší string, největší pole)
Arr::mergeRecursiveOverride(array $base, array $override)Rekurzivní merge — override přepíše base (používá se pro config)
$user = ['name' => 'Denis', 'address' => ['city' => 'Praha']];

Arr::get($user, 'address.city');           // "Praha"
Arr::get($user, 'phone', 'N/A');           // "N/A"

$items = [
    ['name' => 'A', 'price' => 100, 'category' => 'food'],
    ['name' => 'B', 'price' => 200, 'category' => 'food'],
    ['name' => 'C', 'price' => 50,  'category' => 'drink'],
];

Arr::sum($items, 'price');                  // 350
Arr::groupBy($items, 'category');           // ['food' => [...], 'drink' => [...]]

Arr::only(['a' => 1, 'b' => 2, 'c' => 3], ['a', 'c']);   // ['a' => 1, 'c' => 3]
Arr::except(['a' => 1, 'b' => 2, 'c' => 3], ['b']);       // ['a' => 1, 'c' => 3]
Arr::flatten([[1, 2], [3, [4, 5]]]);                        // [1, 2, 3, 4, 5]

Filesystem

Moony\bootstrap\core\helpers\Filesystem — práce se soubory a složkami.

Filesystem::copyDirectory(string $source, string $target)Rekurzivně zkopíruje složku včetně obsahu
Filesystem::deleteDirectory(string $dir)Rekurzivně smaže složku a celý její obsah
Filesystem::emptyDirectory(string $dir)Smaže obsah složky, ale ponechá samotnou složku
Filesystem::getFileExtension(string $fileName)Vrátí příponu souboru (lowercase)
Filesystem::humanizeFileSize(int $sizeInBytes, int $decimals = 1)Převede bajty na čitelný formát: 1048576 → '1.0 MB'
Filesystem::getLastLineOfFile(string $path, bool $excludeEmpty = false)Vrátí poslední řádek souboru (efektivně, bez čtení celého souboru)
Filesystem::getFileLines(string $file)Generator — čte soubor řádek po řádku (paměťově efektivní pro velké soubory)
Filesystem::humanizeFileSize(5 * MB);     // "5.0 MB"
Filesystem::getFileExtension('foto.JPG');  // "jpg"

// Čtení velkého souboru po řádcích
foreach(Filesystem::getFileLines('/storage/log/app.log') as $line) {
    // zpracování řádku bez načtení celého souboru do RAM
}

UTC

Moony\bootstrap\core\helpers\UTC — práce s UTC časem. Veškerá data v databázi by měla být v UTC.

UTC::get(?string $format = null)Vrátí aktuální UTC čas. Bez parametru vrátí formát pro DB: 2026-04-07 14:30:22.15
UTC::getTimestamp()Vrátí Unix timestamp v UTC
UTC::getFromDibi(\Dibi\DateTime $dateTime)Převede Dibi DateTime na PHP DateTime v UTC zóně
UTC::getListOfTimezones()Vrátí formátovaný seznam časových zón: '(UTC +01:00) - Europe/Prague'
// Uložení do DB
$data['created_at'] = UTC::get();            // "2026-04-07 14:30:22.15"

// Vlastní formát
UTC::get('Y-m-d');                            // "2026-04-07"

// Timestamp
UTC::getTimestamp();                           // 1775657422

// Seznam zón pro select
$timezones = UTC::getListOfTimezones();
// ['Europe/Prague' => '(UTC +01:00) - Europe/Prague', ...]
V databázi vždy ukládejte čas v UTC. Převod na uživatelovu časovou zónu se provádí až při zobrazení pomocí getTimezone().