Конфигурация

← URL · Назад к README · Типы контента →

После php artisan yazar:install весь конфиг движка публикуется в config/yazar.php. Ниже — за что отвечает каждая опция, со ссылками на код, который её читает.

Скалярные опции

Опция ENV-переменная По умолчанию За что отвечает
content_path YAZAR_CONTENT_PATH base_path('_content') Корневая директория Markdown-контента. Используется хелпером content_path() — из неё строится полный путь до файла (content_path('posts/hello.md')).
deploy_target YAZAR_DEPLOY_TARGET null Директория, куда php artisan build копирует готовый статический сайт (BuildCommand::move()). Если не задана — build только генерирует файлы в public/{output_directory}, копирование во внешнюю директорию пропускается.
front_page_view YAZAR_FRONT_PAGE_VIEW 'front-page' Имя Blade-вьюхи для главной страницы (ленты последних постов). Читается и в динамическом рендеринге (ContentController), и при статической сборке (BuildCommand).
render_mode CONTENT_RENDER_MODE 'dynamic' Зарезервирована для переключения между динамическим рендерингом и статической сборкой. На данный момент нигде в коде не читается — оба режима и так работают через независимые друг от друга механизмы (ContentController для HTTP, php artisan build для статики), значение этой опции ни на что не влияет.
pagination_per_page CONTENT_PAGINATION_PER_PAGE 1 Количество документов на одной странице пагинации — и на главной странице, и в категориях. Приводится к int и не может быть меньше 1 (max((int) config(...), 1) в ContentController/BuildCommand).
use_html_suffix USE_HTML_SUFFIX false Формат путей статических страниц (Document::getPathForStaticPageAttribute()). falseslug/index.html (работает без серверных правил переписывания URL); trueslug.html.
output_directory OUTPUT_DIRECTORY 'build' Имя поддиректории внутри public/, куда пишет диск static_output при php artisan build. Значение используется дважды — как отдельная опция и как root диска static_output в массиве disks (см. ниже) — оба места читают одну и ту же ENV-переменную независимо друг от друга.
storage_url STORAGE_URL '' Базовый URL, который хелпер storage() подставляет перед относительным путём к файлу: storage($path)config('yazar.storage_url').$path. Нужен, если статические ассеты отдаются не с того же домена, что сам сайт.

content_types

'content_types' => [
    'posts' => Post::class,
    'pages' => Page::class,
    'categories' => Category::class,
],

Плоское соответствие ключа классу Eloquent-модели, реализующей Yazar\Contracts\Documentable:

disks

'disks' => [
    'content' => ['driver' => 'local', 'root' => $contentPath, 'throw' => false],
    'static_output' => [
        'driver' => 'local',
        'root' => public_path(env('OUTPUT_DIRECTORY', 'build')),
        'url' => rtrim(env('APP_URL', 'http://localhost'), '/').'/storage',
        'visibility' => 'public',
        'throw' => false,
        'report' => false,
    ],
    'imgproxy_build_cache' => [
        'driver' => 'local',
        'root' => storage_path('app/imgproxy-cache'),
        'visibility' => 'public',
        'throw' => false,
    ],
    'imgproxy_cache' => [
        'driver' => 'local',
        'root' => public_path('imgproxy-cache'),
        'url' => '/imgproxy-cache',
        'visibility' => 'public',
        'throw' => false,
    ],
],

Определения Laravel Storage-дисков, которые YazarServiceProvider::boot() регистрирует во время выполнения (config(["filesystems.disks.$name" => $diskConfig])) — они не описываются в стандартном config/filesystems.php приложения.

markdown

'markdown' => [
    'extensions' => [
        // \Yazar\Markdown\Extensions\PhikiHighlightExtension::class,
        // \Yazar\Markdown\Extensions\DiskUrlExtension::class,
    ],
    'default_disk' => env('YAZAR_MARKDOWN_DEFAULT_DISK'),
    'phiki' => [
        'theme' => env('YAZAR_CODE_THEME', 'github-light'),
        'default_grammar' => env('YAZAR_CODE_DEFAULT_GRAMMAR', 'shellscript'),
    ],
],

Как включить подсветку: добавить \Yazar\Markdown\Extensions\PhikiHighlightExtension::class в markdown.extensions в опубликованном config/yazar.php хост-приложения. Язык блока берётся из info-string фенса (```phpphp); для блоков без языка используется default_grammar.

Ссылки на файлы Laravel-диска из markdown

Yazar\Markdown\Extensions\DiskUrlExtension позволяет ссылаться из markdown-контента на файл на любом зарегистрированном Laravel-диске — не только на собственных дисках движка (content/static_output), а на любом ключе из filesystems.disks, включая public, s3 или кастомный диск хост-приложения — без хардкода абсолютного URL, который отличался бы между окружениями.

Напишите disk(имяДиска)://путь/к/файлу.ext где угодно в документе, и при рендере это превратится в Storage::disk('имяДиска')->url('путь/к/файлу.ext'):

![Скр����шот](disk(s3)://screenshots/dashboard.png)

Полный отчёт — [��д��сь](disk(media)://reports/2026-q1.pdf).

Можно вставить disk(s3)://screenshots/dashboard.png прямо в предложение,
или внутри сырого HTML: <img src="disk(s3)://screenshots/dashboard.png">.

Имя диска можно опустить — disk://путь/к/файлу.ext резолвится через markdown.default_disk (см. раздел markdown выше):

![Скр���шот](disk://screenshots/dashboard.png)

Как включить: добавить \Yazar\Markdown\Extensions\DiskUrlExtension::class в markdown.extensions в опубликованном config/yazar.php хост-приложения.

Ссылки на imgproxy из markdown

Yazar\Markdown\Extensions\ImgproxyExtension позволяет вставлять в markdown-контент подписанные ссылки на сервис imgproxy — синтаксис imgproxy(SOURCE, 'preset-key'), где SOURCE — либо ссылка вида disk(имяДиска)://путь (как в разделе выше), либо произвольный URL как есть:

![Обло�ка](imgproxy(disk(yandex)://images-posts/figma/dashed-line.gif, 'post-cover'))

Можно и с обычным URL: imgproxy(https://example.com/photo.jpg, 'post-cover').

'preset-key' резолвится через новый блок конфига config('yazar.imgproxy.presets') — сырую строку опций обработки imgproxy как есть, без собственного DSL поверх DSL imgproxy:

'imgproxy' => [
    'base_url' => env('IMGPROXY_BASE_URL', 'http://127.0.0.1:6066'),
    'key' => env('IMGPROXY_KEY'),
    'salt' => env('IMGPROXY_SALT'),
    'presets' => [
        'post-cover' => 'rs:fit:1200:630/q:80/f:webp',
    ],
],

Резолвинг disk(имяДиска)://путь внутри imgproxy(...) — по driver диска, не всегда через Storage::url():

Важно про порядок расширений: если ImgproxyExtension и DiskUrlExtension подключены одновременно, ImgproxyExtension должна идти в списке markdown.extensions раньше DiskUrlExtension — иначе DiskUrlExtension испортит вложенный disk(...)-вызов внутри imgproxy(...) раньше, чем до него доберётся ImgproxyExtension.

Как включить: добавить \Yazar\Markdown\Extensions\ImgproxyExtension::class в markdown.extensions (перед DiskUrlExtension::class, если она тоже подключена) в опубликованном config/yazar.php хост-приложения.

Хелпер imgproxy() для Blade и полей front matter. ImgproxyExtension резолвит imgproxy(...) только внутри тела markdown-документа — front matter (например, поле cover_image в YAML-шапке) этим расширением не обрабатывается (см. выше). Для таких случаев доступна глобальная функция imgproxy(string $source, string $presetKey): string, которая строит и подписывает ту же ссылку напрямую из PHP/Blade, используя тот же SOURCE (disk(имяДиска)://путь или голый URL) и тот же config('yazar.imgproxy.presets'):

@if($page->meta->cover_image)
    <img src="{{ imgproxy('disk(yandex)://'.$page->meta->cover_image, 'post-cover') }}">
@endif

Хелпер не требует, чтобы ImgproxyExtension::class была подключена в markdown.extensions — конфиг yazar.imgproxy (base_url/key/salt/presets) используется напрямую.

Кеширование imgproxy-ссылок в статической сборке

Yazar\Build\ImgproxyBuildResolver — шаг постобработки, который выполняет php artisan build после того, как все Exporter'ы (по content_types и FrontPageExporter) закончили писать HTML на static_output, и до копирования результата в deploy_target. Он не меняет ImgproxyExtension или хелпер imgproxy() — оба по-прежнему резолвят обычные runtime-ссылки на imgproxy так, как описано выше. Вместо этого он сканирует уже сгенерированный HTML на предмет любой ссылки, начинающейся с config('yazar.imgproxy.base_url') — независимо от того, произведена ли она ImgproxyExtension внутри тела markdown-документа или прямым вызовом imgproxy() во Blade-вьюхе (оба случая дают побайтово одинаковый подписанный URL для одного и того же SOURCE+пресета) — скачивает её один раз на локальный диск imgproxy_build_cache и переписывает HTML так, чтобы он указывал на соответствующий путь на диске imgproxy_cache вместо runtime-ссылки на imgproxy. Отдельный вызов ImgproxyBuildResolver::publish(), сразу после resolve(), копирует каждый скачанный файл с imgproxy_build_cache на imgproxy_cache — диск, который реально их отдаёт.

Это закрывает пробел, сознательно оставленный исходной фичей markdown-imgproxy-links: без этого шага статически собранный сайт всё равно зависел бы от доступности сервиса imgproxy в момент просмотра страницы, хотя весь смысл статической сборки — не нуждаться в бэкенде вообще.

Никакой дополнительной настройки для включения этого шага не требуется сверх того, что уже нужно ImgproxyExtension/хелперу imgproxy() — он выполняется безусловно при каждом build и просто ничего не делает, если yazar.imgproxy.base_url пуст или подходящих ссылок не найдено.

Очистка кеша. php artisan yazar:clear-imgproxy-cache удаляет все файлы на диске imgproxy_cache. Используйте её, когда закешированная картинка устарела (изменился источник, изменился пресет) и нужно, чтобы следующий build скачал всё заново, а не переиспользовал уже закешированное.

Смотри также