gzhegow/front

1.0.0 2025-08-03 00:59 UTC

This package is auto-updated.

Last update: 2025-08-03 00:59:24 UTC


README

Установить

composer require gzhegow/front

Запустить тесты

php test.php

Примеры и тесты

<?php

// > настраиваем PHP
\Gzhegow\Lib\Lib::entrypoint()
    ->setDirRoot(__DIR__ . '/..')
    ->useAllRecommended()
;



// > добавляем несколько функций для тестирования
$ffn = new class {
    function root() : string
    {
        return realpath(__DIR__ . '/..');
    }


    function values($separator = null, ...$values) : string
    {
        return \Gzhegow\Lib\Lib::debug()->dump_values([], $separator, ...$values);
    }


    function print(...$values) : void
    {
        echo $this->values(' | ', ...$values) . PHP_EOL;
    }


    function test(\Closure $fn, array $args = []) : \Gzhegow\Lib\Modules\Test\TestCase
    {
        $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1);

        return \Gzhegow\Lib\Lib::test()->newTestCase()
            ->fn($fn, $args)
            ->trace($trace)
        ;
    }
};



// > сначала всегда фабрика
$factory = new \Gzhegow\Front\FrontFactory();

// > создаем конфигурацию
$config = new \Gzhegow\Front\Core\Config\FrontConfig();
$config->configure(
    function (\Gzhegow\Front\Core\Config\FrontConfig $config) use ($ffn) {
        // >>> шаблонизатор
        $config->isDebug = true;
        //
        // > устанавливаем папку и формат файла
        $config->directory = __DIR__ . '/../disc/html';
        $config->fileExtension = 'phtml';
        //
        // > можно установить собственные обработчики RESOLVE (подключить языки?), GET (подключить контейнер?) и CATCH (не бросать исключения?) для шаблонов
        $config->fnTemplateGet = function (string $name, \Gzhegow\Front\Package\League\Plates\Template\TemplateInterface $template) {
            $data = $template->getData();

            return $data[ $name ] ?? null;
        };
        $config->fnTemplateCatch = function (\Throwable $e, string $content, \Gzhegow\Front\Package\League\Plates\Template\TemplateInterface $template) {
            $eMessage = $e->getMessage();
            $templateName = $template->name();

            return $content . " [ ERROR : {$templateName} : {$eMessage} ]";
        };
        //
        // > подключаем работу с языковыми шаблонами
        $config->langCurrent = 'ru';
        $config->langDefault = 'ru';

        // >>> менеджер тегов
        $config->tagManager->appNameFull = 'My Website | A personal Portfolio';
        $config->tagManager->appNameShort = 'My Website';
    }
);

// > создаем менеджер HTML-тегов
// > его задача создавать HTML теги для верстки в тех случаях, когда они управляются глобально и влияют на SEO
$tagManager = new \Gzhegow\Front\Core\TagManager\FrontTagManager($config->tagManager);

// > создаем роутер
$front = new \Gzhegow\Front\FrontFacade(
    $factory,
    //
    $tagManager,
    //
    $config
);

// > можно добавить папки в регистр, чтобы вызывать их напрямую через ->render('modals::{path}')
// > субъективно я предпочитаю использовать html::{путь}, не разделяя каждую папку отдельно
$front->folderAdd('html', __DIR__ . '/../disc/html');
// $plates->folderAdd('blocks', __DIR__ . '/../disc/html/blocks');
// $plates->folderAdd('layouts', __DIR__ . '/../disc/html/layouts');
// $plates->folderAdd('modals', __DIR__ . '/../disc/html/modals');
// $plates->folderAdd('pages', __DIR__ . '/../disc/html/pages');
// $plates->folderAdd('sections', __DIR__ . '/../disc/html/sections');

// > можно добавить resolver, чтобы, например, подключить языковые шаблоны или искать шаблон в нескольких папках
$front->resolverSet(new \Gzhegow\Front\Core\Resolver\FrontI18nResolver());
// $front->resolverSet(new \Gzhegow\Front\Core\Resolver\DefaultResolver());
// $front->resolverSet(new \Gzhegow\Front\Core\Resolver\CallableResolver(
//     function (\League\Plates\Template\Name $name) { },
//     $fnArgs = [ 1, 2, 3 ]
// ));

// > создаем фасад, если удобно пользоваться статикой
\Gzhegow\Front\Front::setFacade($front);



// >>> ТЕСТЫ

// > TEST
// > так можно отрисовать шаблон с его содержимым
$fn = function () use ($ffn, $front) {
    $ffn->print('TEST 1');
    echo "\n";

    $before = $front->langDefaultSet('ru');

    $front->langCurrentSet('ru');
    $ffn->print($front->render('html::pages/demo/page.demo.phtml'));
    echo "\n";

    $front->langCurrentSet('en');
    $ffn->print($front->render('html::pages/demo/page.demo'));
    echo "\n";

    // > будет использован `default`, то есть `ru`
    $front->langCurrentSet('unknown');
    $ffn->print($front->render('html::pages/demo/page.demo'));

    $front->langDefaultSet($before);
};
$test = $ffn->test($fn);
$test->expectStdout('
"TEST 1"

"<!-- [ >>> layouts/demo/ru/layout.demo.phtml ] -->\n
<div>Пример шаблона</div>\n
<div>\n
<!-- [ >>> pages/demo/page.demo.phtml ] -->\n
<!-- [ >>> blocks/demo/ru/block.demo.phtml ] -->\n
<div>Пример блока</div>\n
<!-- [ <<< blocks/demo/ru/block.demo.phtml ] -->\n
<!-- [ <<< pages/demo/page.demo.phtml ] -->\n
</div>\n
<!-- [ <<< layouts/demo/ru/layout.demo.phtml ] -->"

"<!-- [ >>> layouts/demo/en/layout.demo.phtml ] -->\n
<div>Demo Layout</div>\n
<div>\n
<!-- [ >>> pages/demo/page.demo.phtml ] -->\n
<!-- [ >>> blocks/demo/en/block.demo.phtml ] -->\n
<div>Demo Block</div>\n
<!-- [ <<< blocks/demo/en/block.demo.phtml ] -->\n
<!-- [ <<< pages/demo/page.demo.phtml ] -->\n
</div>\n
<!-- [ <<< layouts/demo/en/layout.demo.phtml ] -->"

"<!-- [ >>> layouts/demo/layout.demo.phtml ] -->\n
<div>Пример шаблона</div>\n
<div>\n
<!-- [ >>> pages/demo/page.demo.phtml ] -->\n
<!-- [ >>> blocks/demo/block.demo.phtml ] -->\n
<div>Пример блока</div>\n
<!-- [ <<< blocks/demo/block.demo.phtml ] -->\n
<!-- [ <<< pages/demo/page.demo.phtml ] -->\n
</div>\n
<!-- [ <<< layouts/demo/layout.demo.phtml ] -->"
');
$test->run();