Создание плагина для панели Filament
- Информация о материале
- Родительская категория: Основные понятия (Core Concepts)
- Категория: Плагины в Filament (Plugins)
- Предисловие
- Обзор
- Шаг 1: Создание плагина
- Шаг 2: Наведение порядка
- Шаг 3: Настройка
Provider - Шаг 4: Создание
Widget - Шаг 5: Обновление Readme
Предисловие
Прежде чем продолжить, ознакомьтесь с документацией по разработке плагинов для панелей Filament и руководством по началу работы c плагинами всё в том же Filament.
Обзор
В этом руководстве рассмотрим создание простого плагина, который добавляет новое поле формы, которое можно использовать в формах. Это также означает, что оно будет доступно пользователям в их панелях Filament.
Окончательный код этого плагина находится тут: https://github.com/awcodes/clock-widget.
Шаг 1: Создание плагина.
Сначала создадим плагин, используя шаги, описанные в руководстве по началу работы с плагинами в Filament.
Шаг 2: Наведение порядка.
Далее почистим плагин, чтобы удалить ненужный шаблонный код. Это покажется много, но так как это простой плагин, то можно удалить много ненужного кода.
Удалите следующие каталоги и файлы:
configdatabasesrc/Commandssrc/Facadesstubs
Поскольку наш плагин не содержит никаких настроек или дополнительных методов, необходимых для функциональности, можно также удалить файл ClockWidgetPlugin.php.
ClockWidgetPlugin.php
Поскольку Filament v3 рекомендует оформлять свои плагины в соответствии с пользовательской темой Filament, вместе с этим будут удалены файлы, необходимые для использования css в плагине. Это необязательно, и при желании можно продолжать использовать css, но это не рекомендуется.
resources/csspostcss.config.jstailwind.config.js
Теперь можно навести порядок в файле composer.json, чтобы удалить ненужные параметры.
"autoload": {
"psr-4": {
// Можно удалить фабрики баз данных
"Awcodes\\ClockWidget\\Database\\Factories\\": "database/factories/"
}
},
"extra": {
"laravel": {
// Можно удалить фасад
"aliases": {
"ClockWidget": "Awcodes\\ClockWidget\\Facades\\ClockWidget"
}
}
},
Последний шаг - это обновление файла package.json для удаления ненужных параметров. Замените содержимое файла package.json на следующее:
{
"private": true,
"type": "module",
"scripts": {
"dev": "node bin/build.js --dev",
"build": "node bin/build.js"
},
"devDependencies": {
"esbuild": "^0.17.19"
}
}
После этого нужно установить зависимости:
npm install
Ещё можно удалить директории и файлы Testing, но пока их оставим, хотя в этом примере они не будут использоваться, и вообще рекомендуется писать тесты для своих плагинов.
Шаг 3: Настройка Provider.
Теперь, когда плагин очищен, можно приступать к добавлению кода. В файле src/ClockWidgetServiceProvider.php очень много шаблонов, поэтому давайте удалим все и начнем с нуля.
Важно:
В этом примере будет зарегистрирован асинхронный компонент Alpine. Поскольку эти активы загружаются только по запросу, их можно зарегистрировать как обычно в методеpackageBooted(). Если нужно зарегистрировать активы, такие как CSS или JS файлы, которые загружаются на каждой странице, независимо от того, используются они или нет, их следует зарегистрировать в методеregister()объектаPluginконфигурации, используя$panel->assets(). В противном случае, если их зарегистрировать в методеpackageBooted(), они будут загружаться в каждой панели, независимо от того, был ли плагин зарегистрирован для этой панели.
Теперь необходимо зарегистрировать наш Widget в панели и загрузить наш компонент Alpine при использовании виджета. Для этого нужно добавить следующий код в метод packageBooted нашего сервис-провайдера. Это зарегистрирует компонент виджета в Livewire и компонент Alpine в Filament Asset Manager.
use Filament\Support\Assets\AlpineComponent;
use Filament\Support\Facades\FilamentAsset;
use Livewire\Livewire;
use Spatie\LaravelPackageTools\Package;
use Spatie\LaravelPackageTools\PackageServiceProvider;
class ClockWidgetServiceProvider extends PackageServiceProvider
{
public static string $name = 'clock-widget';
public function configurePackage(Package $package): void
{
$package->name(static::$name)
->hasViews()
->hasTranslations();
}
public function packageBooted(): void
{
Livewire::component('clock-widget', ClockWidget::class);
// Asset Registration
FilamentAsset::register(
assets:[
AlpineComponent::make('clock-widget', __DIR__ . '/../resources/dist/clock-widget.js'),
],
package: 'awcodes/clock-widget'
);
}
}
Шаг 4: Создание Widget.
Теперь можно создавать наш виджет. Сначала нужно расширить класс Widget Filament в файле ClockWidget.php и указать ему, где найти view для этого виджета. Поскольку для регистрации представлений используется PackageServiceProvider, чтобы указать Filament, где найти представление, используется синтаксис ::.
use Filament\Widgets\Widget;
class ClockWidget extends Widget
{
protected static string $view = 'clock-widget::widget';
}
Далее необходимо создать view для нашего виджета. Создайте новый файл расположенного тут: resources/views/widget.blade.php и добавьте код, приведенный ниже. Чтобы сэкономить время на написание html для виджета, воспользуемся компонентами Blade в Filament.
Для загрузки компонента Alpine используется async Alpine, поэтому нужно добавить атрибут x-ignore в div, который будет загружать наш компонент. Нам также нужно добавить атрибут ax-load к div, чтобы указать Alpine на загрузку нашего компонента. Подробнее об этом вы можете узнать в разделе документации Filament "Основные понятия".
<x-filament-widgets::widget>
<x-filament::section>
<x-slot name="heading">
{{ __('clock-widget::clock-widget.title') }}
</x-slot>
<div
x-ignore
ax-load
ax-load-src="{{ \Filament\Support\Facades\FilamentAsset::getAlpineComponentSrc('clock-widget', 'awcodes/clock-widget') }}"
x-data="clockWidget()"
class="text-center"
>
<p>{{ __('clock-widget::clock-widget.description') }}</p>
<p class="text-xl" x-text="time"></p>
</div>
</x-filament::section>
</x-filament-widgets::widget>
Далее необходимо написать наш компонент Alpine в src/js/index.js. И собрать наши активы с помощью npm run build.
export default function clockWidget() {
return {
time: new Date().toLocaleTimeString(),
init() {
setInterval(() => {
this.time = new Date().toLocaleTimeString();
}, 1000);
}
}
}
Кроме того, необходимо добавить переводы для текста в виджете, чтобы пользователи могли перевести виджет на свой язык. Переводы будут добавлены в файл resources/lang/en/widget.php.
return [
'title' => 'Clock Widget',
'description' => 'Your current time is:',
];
Шаг 5: Обновление Readme.
Ещё стоит обновить файл README.md, включив в него инструкции по установке плагина и любую другую информацию, которой хочется поделиться с пользователями, например, как использовать его в своих проектах. Например:
// Зарегистрируйте плагин и/или виджет в своём провайдере Panel:
use Awcodes\ClockWidget\ClockWidgetWidget;
public function panel(Panel $panel): Panel
{
return $panel
->widgets([
ClockWidgetWidget::class,
]);
}
Вот и все, теперь пользователи могут установить наш плагин и использовать его в своих проектах.
Перевод с английского официальной документации Filament:
https://filamentphp.com/docs/3.x/support/plugins/build-a-panel-plugin
Бинарные файлы вендора и каталог vendor/bin в Composer
- Информация о материале
- Родительская категория: Программы для автоматизации работы
- Категория: Composer
- Что такое бинарный файл вендора в Composer?
- Как определяется бинарный файл вендора в Composer?
- Что дает определение бинарных файлов поставщика в
composer.json? - Что происходит, когда в Composer запускается сайт
composer.json, в котором определены бинарные файлы поставщика? - Что произойдет, если запустить Composer с
composer.json, в котором перечислены зависимости с бинарными файлами поставщиков? - Поиск автозагрузчика Composer из бинарного файла
- Поиск
bin-dirComposer из бинарного файла. - А как насчет Windows и
.bat-файлов? - Можно ли установить бинарные файлы поставщика куда-то еще, кроме
vendor/bin?
Что такое бинарный файл вендора в Composer?
Любой сценарий командной строки, который пакет Composer хотел бы передать пользователю, устанавливающему пакет, должен быть указан как бинарный файл поставщика.
Если пакет содержит другие скрипты, которые не нужны пользователям пакета (например, скрипты сборки или компиляции), этот код не должен быть указан в качестве бинарного файла поставщика.
Как определяется бинарный файл вендора в Composer?
Исполняемый файл поставщика определяется с помощью добавления ключа bin в composer.json проекта. Он задается в виде массива файлов, поэтому для любого проекта можно добавить несколько двоичных файлов.
{
"bin": ["bin/my-script", "bin/my-other-script"]
}
Что дает определение бинарных файлов поставщика в composer.json?
composer.json указывает Composer установить двоичные файлы пакета в vendor/bin для любого проекта, который зависит от этого проекта.
Это удобный способ опубликовать полезные скрипты, которые в противном случае были бы спрятаны глубоко в каталоге vendor/.
Что происходит, когда в Composer запускается сайт composer.json, в котором определены бинарные файлы поставщика?
Для бинарных файлов, которые определяются пакетом напрямую, ничего не происходит.
Что произойдет, если запустить Composer с composer.json, в котором перечислены зависимости с бинарными файлами поставщиков?
Composer ищет бинарные файлы, определенные во всех зависимостях. Создается прокси-файл (или два в Windows/WSL) из двоичных файлов каждой зависимости в vendor/bin.
Скажем, пакет my-vendor/project-a имеет двоичные файлы, настроенные следующим образом:
{
"name": "my-vendor/project-a",
"bin": ["bin/project-a-bin"]
}
Запуск composer install для этого composer.json ничего не сделает с bin/project-a-bin.
Допустим, проект my-vendor/project-b имеет такие требования:
{
"name": "my-vendor/project-b",
"require": {
"my-vendor/project-a": "*"
}
}
Запуск composer install для этого composer.json просмотрит все двоичные файлы project-a и установит их в vendor/bin.
В этом случае Composer сделает vendor/my-vendor/project-a/bin/project-a-bin доступным как vendor/bin/project-a-bin.
Поиск автозагрузчика Composer из бинарного файла
Начиная с версии Composer 2.2, новая глобальная переменная $_composer_autoload_path определяется прокси-файлом bin, чтобы при выполнении вашего бинарного файла она могла использовать его для легкого нахождения автозагрузчика проекта.
Однако эта глобальная переменная будет недоступна при запуске бинарных файлов, определенных самим корневым пакетом, поэтому вам необходимо иметь запасной вариант.
Это может выглядеть, например, так:
<?php
include $_composer_autoload_path ?? __DIR__ . '/../vendor/autoload.php';
Если вы хотите полагаться на это в своем пакете, вам следует, однако, убедиться, что вам также требуется "composer-runtime-api": "^2.2", чтобы гарантировать, что пакет будет установлен с версией Composer, поддерживающей эту функцию.
Поиск bin-dir Composer из бинарного файла
Начиная с Composer 2.2.2, новая глобальная переменная $_composer_bin_dir определяется прокси-файлом bin, чтобы при выполнении вашего бинарного файла она могла использовать его, чтобы легко найти каталог bin Composer проекта.
Для не-PHP бинарных файлов, начиная с Composer 2.2.6, bin proxy устанавливает переменную окружения COMPOSER_RUNTIME_BIN_DIR.
Однако эта глобальная переменная не будет доступна при запуске бинарных файлов, определенных самим корневым пакетом, поэтому вам необходимо иметь запасной вариант.
Это может выглядеть, например, так:
<?php
$binDir = $_composer_bin_dir ?? __DIR__ . '/../vendor/bin';
#!/bin/bash
if [[ -z "$COMPOSER_RUNTIME_BIN_DIR" ]]; then
BIN_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
else
BIN_DIR="$COMPOSER_RUNTIME_BIN_DIR"
fi
Если вы хотите полагаться на это в своем пакете, вам следует, однако, убедиться, что вам также требуется "composer-runtime-api": "^2.2.2", чтобы гарантировать, что пакет будет установлен с версией Composer, поддерживающей эту функцию.
А как насчет Windows и .bat-файлов?
Пакеты, полностью управляемые Composer, не должны содержать никаких файлов .bat для совместимости с Windows. Composer особым образом обрабатывает установку бинарных файлов при запуске в среде Windows:
- Автоматически генерируется файл
.batдля ссылки на бинарный файл. - Также генерируется прокси-файл в стиле Unix с тем же именем, что и бинарный файл, что полезно для WSL, виртуальных машин Linux и т. д.
Пакеты, которые должны поддерживать рабочие процессы, не включающие Composer, могут поддерживать собственные файлы .bat. В этом случае пакет не должен указывать файл .bat в качестве бинарного файла, поскольку он не нужен.
Можно ли установить бинарные файлы поставщика куда-то еще, кроме vendor/bin?
Да, есть два способа указать альтернативное местоположение бинарных файлов поставщика:
- Установка параметра конфигурации
bin-dirв файлеcomposer.json. - Установка переменной окружения
COMPOSER_BIN_DIR.
Пример первого варианта выглядит следующим образом:
Запуск composer install для этого composer.json приведет к тому, что все бинарные файлы поставщика будут установлены в scripts/ вместо vendor/bin/.
{
"config": {
"bin-dir": "scripts"
}
}
Вы можете установить bin-dir в ./, чтобы поместить двоичные файлы в корень проекта.
Перевод с английского официальной документации Composer:
https://getcomposer.org/doc/articles/vendor-binaries.md
Что делать, если аккаунт AdSense для YouTube отключен за недействительный трафик?
- Системы Google регулярно проверяют, действителен ли трафик видео на платформе YouTube
- Можно ли как-то восстановить аккаунт AdSense для YouTube, отключенный за недействительный трафик?
- Как увеличить вероятность успешной апелляции для восстановления заблокированного аккаунта AdSense для YouTube?
- Аккаунт AdSense для YouTube отключен, а апелляция отклонена. Можно ли возобновить участие в программе или создать новый аккаунт AdSense для YouTube?
- Почему аккаунт AdSense для YouTube отключили в Google из-за связи с аккаунтом с недействительным трафиком?
- Можно ли получить заработанные средства в AdSense для YouTube в отключенном аккаунте?
- Как получить формы налога на полученные выплаты в AdSense для YouTube?
- Аккаунт AdSense для YouTube был восстановлен. Почему на сайтах, в приложениях и видео не появляются рекламные объявления?
Системы Google регулярно проверяют, действителен ли трафик видео на платформе YouTube.
Системы Google проверяют, действителен ли трафик видео на платформе YouTube. Недействительный трафик – это любые действия, совершенные не реальными, но очень заинтересованными пользователями забрать деньги рекламодателей Google. К нему, в частности, относится мошеннические и искусственные способы увеличения дохода от рекламы Google на YouTube. Иногда недействительный трафик получен ненамеренно, но даже тогда он может негативно отразиться на том, что Google недополучит свой доход из-за потери клиентов, готовых платить за рекламу.
Google может заблокировать аккаунт AdSense для YouTube, если заподозрит, что он связан с недействительным трафиком. Отмазка такая: Так Google якобы защищает зрителей, авторов и рекламодателей на YouTube. Благодаря этому рекламодатели понимают, что инвестируют в показ рекламы реальным людям, а авторы YouTube получают стабильный доход.
Можно ли как-то восстановить аккаунт AdSense для YouTube, отключенный за недействительный трафик?
В большинстве случаев системы Google очень приблизительно определяют недействительный трафик. И, если вы считаете, что активность на канале действительная, то можете попробовать подать апелляцию. И тут самое интересное: каким-то образом нужно будет подтвердить, что вы и пользователи, за которых вы ответственны, не привлекали на канал YouTube недействительный трафик случайно или намеренно.
Когда Google получит эту апелляцию, он её возможно рассмотрит, и может быть сообщит окончательное решение об отключении аккаунт AdSense для YouTube. Обратите внимание, что Google не гарантирует восстановление аккаунта. Решение по апелляции будет окончательным, и дальнейшие апелляции не будут рассматриваться. В общем, не тот прав, кто прав, а тот, чьим сервисом вы пытались воспользоваться!
Как увеличить вероятность успешной апелляции для восстановления заблокированного аккаунта AdSense для YouTube?
- Изучите примеры недействительного трафика на YouTube и подумайте, относится ли к ним ваш случай. Возможно, кто-то слишком много раз нажал на объявление в вашем контенте и кому-то нужно подавать по башке за то, что он не понимает разницы между рекламой и тем, что вы пытаетесь ему впарить в своих видосах? Покупали ли вы недействительный трафик? Если да, то не пора ли сменить поставщика этого накруточного трафика? Можете ли вы изменить стратегию работы с контентом на YouTube или поведение, чтобы избежать недействительного трафика в будущем так, чтобы никто не кликал на рекламные объявления?
- В форме апелляции на решение о недействительной активности укажите адрес электронной почты, связанный с отключенным аккаунтом AdSense для YouTube. Это поможет Google найти ваш аккаунт и уменьшить задержки при рассмотрении апелляции с выносом обвинительного приговора без возможности его обжалования.
- Укажите возможные причины недействительного трафика и объясните, как вы планируете предотвращать его появление в будущем. В общем, старайтесь покаяться Google в том, чего никогда не делали, при этом клянитесь всеми богами, что больше никогда так делать не будете. Чем больше информации вы предоставите, тем лучше. Всё отправленное вами будет использовано Google против вас.
- Например, если вы купили трафик у стороннего поставщика, чтобы увеличить аудиторию, объясните, что вы больше с ним не сотрудничаете и в будущем не будете обращаться к таким поставщикам для продвижения канала. Или, если не покупали никакого трафика и вообще про это первый раз узнали, что оказывается там можно было делать, всё равно, кайтесь и клянитесь. =D
Аккаунт AdSense для YouTube отключен, а апелляция отклонена. Можно ли возобновить участие в программе или создать новый аккаунт AdSense для YouTube?
Ваш аккаунт был закрыт после тщательного расследования, проведенного специалистами Google с учетом интересов рекламодателей, авторов и пользователей. По крайней мере, они будут именно в этом кляться и божится.
Пользователи, чьи аккаунты AdSense для YouTube были закрыты из-за недействительного трафика на канале, больше не могут участвовать в программе AdSense. Открывать новые аккаунты им нельзя... Но, если очень хочется, то можно. =)
Компания Google оставляет за собой право отключать аккаунты по любой причине, в том числе из-за недействительного трафика из любого источника. Ещё раз: Google владеет тем ресурсом, в который вы пытаетесь втиснуться для того, чтобы получить несколько процентов с того, что зарабатывает Google. Не думайте, что ваша возня вообще как-то интересует Google с его доходами.
Почему аккаунт AdSense для YouTube отключили в Google из-за связи с аккаунтом с недействительным трафиком?
Если связанный аккаунт был отключен AdSense для YouTube, имейте ввиду, что специалисты Google пробовали какой-нибудь новый алгоритм, возможно даже с использованием искусственного интеллекта и пришли к выводу, что ваш аккаунт может нанести вред авторам, зрителям и рекламодателям. Ничего личного — просто бизнес у них такой.
Можно ли получить заработанные средства в AdSense для YouTube в отключенном аккаунте?
Если аккаунт AdSense для YouTube отключен за недействительный трафик или нарушения правил и у вас остался невыплаченный доход, то вы его возможно получите. Однако из него будет вычтен недействительный доход. Т.е. ровно столько, чтобы вы ничего не получили, а ещё и остались должны. Чтобы в Google могли рассчитать сумму итоговой выплаты, после отключения аккаунта в нем на 30 дней приостанавливаются все платежи. После истечения 30 дней вы сможете войти в аккаунт AdSense для YouTube и, если оставшийся баланс аккаунта это позволяет (он не отрицательный), настроить выплату. Доход, который вы получили в результате нарушения правил и привлечения недействительного трафика, будет возвращен рекламодателям (если они очень сильно попросят конечно).
Как получить формы налога на полученные выплаты в AdSense для YouTube?
Google может отправить вам налоговую форму, если:
- вы получали от хоть какие-то выплаты ранее, или
- баланс вашего аккаунта позволяет получить выплату.
Т.е. скорее всего, ничего не получите.
Узнайте больше об оплате налогов на доходы в AdSense для YouTube.
Аккаунт AdSense для YouTube был восстановлен. Почему на сайтах, в приложениях и видео не появляются рекламные объявления?
После восстановления аккаунта AdSense для YouTube может пройти до 48 часов, прежде чем снова начнут показываться объявления.
Примечание. Вам может понадобиться повторно связать канал YouTube и аккаунт AdSense для YouTube. Узнайте, как настроить аккаунт AdSense для YouTube, чтобы получать выплаты.
По материалам:
https://support.google.com/youtube/answer/14340193
Спам в Интернете! Кому и зачем он нужен?
- Информация о материале
- Категория: SEO (search engine optimization) — Поисковая оптимизация
Что такие спам?
Спам — это рассылка рекламной и коммерческой информации, предоставление других данных пользователям, которые не подтвердили своего желания получать их. В Рунете спамом преимущественно считаются электронные письма (email).
Если интересует более развёрнутое определением спама, рекомендую найти канал «Информационное насилие» на YouTube, где автор подробно объясняет, что такое насилие, почему спам является частным случаем этого самого насилия, и почему он считает это неприемлемым видом деятельности уважающего себя примата вида Homo sapiens.

Разновидности спама
- Реклама.
- Продвижение товарной продукции или услуг с помощью этого инструмента отличается дешевизной и широким охватом аудитории. Но спамная реклама, как правило, встречается холодно и настороженно её получателями.
- Антиреклама.
- В этом случае спамом может быть информация, направленная на причинение вреда имиджу или деятельности компаний. Используется конкурентами.
- Фишинг.
- Данный вид спама преследует цель получения паролей и иной конфиденциальной информации об используемых платежных системах, кредитных картах и т.д.
- Раскрутка незаконной продукции.
- Это актуально для наркотиков, порнографии, поддельной продукции, конфиската, некоторых лекарственных препаратов и т.д.
- "Нигерийские письма"
- Это спам, нацеленный на выманивание денежных средств. Суть подобной рассылки заключается в убеждении получателя в возможности выиграть деньги, получить большое наследство за определенную помощь со стороны отправителя.
- Другие разновидности спама,
- в том числе пропаганда, "письма счастья", рассылки с вирусами и вредоносным ПО.

Поисковый спам.
Отдельная разновидность спамной информации — это поисковый спам, которым являются веб-ресурсы и сайты, которые создаются для манипуляции результатами поисковой выдачи поисковых машин типа Yandex или Google.
Виды поискового спама.
- Использование дорвеев и клоакинга.
- Прописывание метатегов и ключей (
title,description,keywords), не имеющих связи с содержанием странички. - Повышение частотности ключей, а также придание им большего веса за счет применения различных составляющих html-разметки.
- Покупка ссылок, которые могут поднять рейтинг ресурса в глазах поисковиков.
- Использование невидимых текстов для индексации поисковыми ботами. Как правило, используется цвет шрифта, сливающийся с фоном страницы.

Последствия использования спама.
Пользователь может пожаловаться и спам-сайты в результате многих факторов отправляют в бан, на них накладывают фильтры. Поисковый спам негативно влияет на качество выдачи, усложняет работу поисковиков, манипулирует с ранжированием.
Спам вредит репутации тех компаний, которые используют его для раскрутки, а массовые спам-рассылки генерируют избыточную нагрузку на интернет-каналы, оборудование хостинг-провайдера.
Популярность спамовых методов раскрутки и рекламы обусловлена дешевизной. Для пользователей она несет преимущественно вред. Они тратят время на удаление ненужных писем, переходят по спам-ссылкам, заражают ПК вирусами.
Начало работы с плагинами в Filament
- Информация о материале
- Родительская категория: Основные понятия (Core Concepts)
- Категория: Плагины в Filament (Plugins)
Краткий обзор
Хотя Filament содержит практически все инструменты, необходимые для создания отличных приложений, иногда возникают потребности в добавлении собственной функциональности либо только для своего приложения, либо в виде распространения пакетов, которые другие разработчики могут включать в свои приложения. Именно поэтому Filament предлагает систему плагинов, которая позволяет расширять его функциональность.
Прежде чем перейти к рассмотрению, важно понять, в каких контекстах могут использоваться плагины. Существует два основных контекста:
- Плагины для панелей Filament: Это плагины, которые используются в конструкторах панелей Filament. Обычно они используются только для добавления функциональности при использовании внутри панели или как полноценная панель сама по себе. Примерами могут быть:
- Плагин, добавляющий определенную функциональность в набор инструментов в виде виджетов.
- Плагин, который добавляет набор ресурсов и/или функциональность в приложение, например, блог или функцию управления пользователями.
- Отдельные плагины Filament: Это плагины, которые используются в любом контексте вне Panel Builder. Примерами могут быть:
- Плагин, добавляющий пользовательские поля для использования в конструкторах форм Filament.
- Плагин, добавляющий пользовательские поля или фильтры в конструктор таблиц Filament.
Хотя это два разных понятия, о которых следует помнить при создании плагинов, они могут использоваться вместе в одном плагине. Они не обязательно должны быть взаимоисключающими.
Важные понятия
Прежде чем перейти к рассмотрению особенностей создания плагинов для Filament, важно понять несколько важных вещей. Перед созданием плагина необходимо ознакомиться со следующими понятиями:
Объект Plugin
В Filament версии 3 появилось понятие объекта Plugin, который используется для настройки плагина. Этот объект представляет собой простой PHP-класс, который расширяет класс Filament\Support\Plugin. Этот класс используется для настройки плагина и является основной точкой входа для плагина. Он также используется для регистрации Resources и Icons, которые могут быть использованы плагином.
Хотя объект плагина очень полезен, он не является обязательным для создания плагина. Можно создавать плагины и без использования объекта плагина, как показано в руководстве "Создание плагина панели".
Информация:
Объект Plugin используется только для Panel Providers. Самостодостаточные плагины не используют этот объект. Все настройки для таких автономных плагинов должны выполняться в сервис-провайдере плагина.
Регистрация активов
Вся регистрация активов, включая CSS, JavaScript и Alpine Components, должна осуществляться через service provider плагина в методе packageBooted(). Это позволит Filament зарегистрировать активы в Asset Manager и загрузить их при необходимости.
Создание плагина
Конечно, можно создавать плагины с нуля, но для быстрого начала работы рекомендуется использовать Filament Plugin Skeleton. Этот каркас включает в себя все необходимые шаблоны, которые помогут быстрее приступить к работе.
Использование шаблона для создания плагина Filament
Чтобы использовать этот шаблон, просто перейдите в репозиторий GitHub и нажмите кнопку "Использовать этот шаблон" (Use this template). В результате в вашем аккаунте будет создано новый репозиторий с кодом этого шаблона. После этого можно клонировать это репозиторий на свою машину. Как только код окажется на вашей машине, перейдите в корень проекта и выполните следующую команду:
php ./configure.php
Она задаст несколько вопросов для настройки плагина. После того как вы ответите на все вопросы, скрипт создаст для вас новый плагин, и вы сможете приступить к созданию нового удивительного расширения для Filament.
Обновление существующих плагинов
Поскольку каждый плагин сильно различается по объему использования и функциональности, не существует универсального подхода к обновлению существующих плагинов. Однако следует отметить одну вещь, которая касается всех плагинов, - это устаревание PluginServiceProvider.
В вашем сервис-провайдере плагинов необходимо изменить его, чтобы вместо него расширить PackageServiceProvider. Также необходимо добавить статическое свойство $name в сервис-провайдер. Это свойство используется для регистрации плагина в Filament. Вот пример того, как может выглядеть сервис-провайдер:
class MyPluginServiceProvider extends PackageServiceProvider
{
public static string $name = 'my-plugin';
public function configurePackage(Package $package): void
{
$package->name(static::$name);
}
}
Полезные ссылки
Пожалуйста, прочитайте эти инструкции полностью, прежде чем обновлять свой плагин. Это поможет понять концепции и способы создания плагина.
- Управление активами Filament
- Разработка плагина для панели Filament
- Управление иконками в Filament
- Управление цветами в Filament
- Настройка стилей в Filament
Перевод с английского официальной документации Filament:
https://filamentphp.com/docs/3.x/forms/fields/rich-editor
Работа с базами данных
- Информация о материале
- Родительская категория: Полное руководство по Yii 2.0
- Категория: Первое знакомство
- Работа с базами данных
- Подготавливаем базу данных
- Настраиваем подключение к БД
- Создаём потомка Active Record
- Создаём Action
- Создаём View
- Испытываем в действии
- Заключение
Работа с базами данных
Этот раздел расскажет о том, как создать новую страницу, отображающую данные по странам, полученные из таблицы countries базы данных. Для достижения этой цели вам будет необходимо настроить подключение к базе данных, создать класс Active Record, определить action и создать view.
Изучив эту часть, вы научитесь:
- Настраивать подключение к БД.
- Определять класс Active Record.
- Запрашивать данные, используя класс Active Record.
- Отображать данные во view с использованием пагинации.
Обратите внимание, чтобы усвоить этот раздел, вы должны иметь базовые знания и навыки использования баз данных. В частности, вы должны знать, как создать базу данных и как выполнять SQL запросы, используя клиентские инструменты для работы с БД.
- Подготавливаем базу данных
- Настраиваем подключение к БД
- Создаём потомка Active Record
- Создаём Action
- Создаём View
- Испытываем в действии
- Заключение
Подготавливаем базу данных
Для начала создайте базу данных под названием yii2basic, из которой вы будете получать данные в вашем приложении. Вы можете создать базу данных SQLite, MySQL, PostgreSQL, MSSQL или Oracle, так как Yii имеет встроенную поддержку для многих баз данных. Для простоты, в дальнейшем описании будет подразумеваться MySQL.
После этого создайте в базе данных таблицу country и добавьте в неё немного демонстрационных данных. Вы можете запустить следующую SQL инструкцию, чтобы сделать это:
CREATE TABLE `country` (
`code` CHAR(2) NOT NULL PRIMARY KEY,
`name` CHAR(52) NOT NULL,
`population` INT(11) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `country` VALUES ('AU','Australia',24016400);
INSERT INTO `country` VALUES ('BR','Brazil',205722000);
INSERT INTO `country` VALUES ('CA','Canada',35985751);
INSERT INTO `country` VALUES ('CN','China',1375210000);
INSERT INTO `country` VALUES ('DE','Germany',81459000);
INSERT INTO `country` VALUES ('FR','France',64513242);
INSERT INTO `country` VALUES ('GB','United Kingdom',65097000);
INSERT INTO `country` VALUES ('IN','India',1285400000);
INSERT INTO `country` VALUES ('RU','Russia',146519759);
INSERT INTO `country` VALUES ('US','United States',322976000);
На данный момент у вас есть база данных под названием yii2basic и внутри неё таблица country с тремя столбцами, содержащими десять строк данных.
Настраиваем подключение к БД
Перед продолжением убедитесь, что у вас установлены PHP-расширение PDO и драйвер PDO для используемой вами базы данных (например, pdo_mysql для MySQL). Это базовое требование в случае использования вашим приложением реляционной базы данных. После того, как они установлены, откройте файл config/db.php и измените параметры на верные для вашей базы данных. По умолчанию этот файл содержит следующее:
<?php
return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=yii2basic',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
];
Файл config/db.php — типичный конфигурационный инструмент, базирующийся на файлах. Данный конфигурационный файл определяет параметры, необходимые для создания и инициализации экземпляра [[yii\db\Connection]], через который вы можете делать SQL запросы к подразумеваемой базе данных.
Подключение к БД, настроенное выше, доступно в коде приложения через выражение Yii::$app->db.
Info: файл
config/db.phpбудет подключен главной конфигурацией приложенияconfig/web.php, описывающей то, как экземпляр приложения должен быть инициализирован. Для детальной информации, пожалуйста, обратитесь к разделу Конфигурации.
Если вам необходимо работать с базами данных, поддержка которых не включена непосредственно в фреймворк, стоит обратить внимание на следующие расширения:
Создаём потомка Active Record
Чтобы представлять и получать данные из таблицы country, создайте класс — потомок Active Record, под названием Country и сохраните его в файле models/Country.php.
<?php
namespace app\models;
use yii\db\ActiveRecord;
class Country extends ActiveRecord
{
}
Класс Country наследуется от [[yii\db\ActiveRecord]]. Вам не нужно писать ни строчки кода внутри него! С кодом, приведённым выше, Yii свяжет имя таблицы с именем класса.
Info: Если нет возможности задать прямую зависимость между именем таблицы и именем класса, вы можете переопределить метод [[yii\db\ActiveRecord::tableName()]], чтобы явно задать имя связанной таблицы.
Используя класс Country, вы можете легко манипулировать данными в таблице country, как показано в этих фрагментах:
use app\models\Country;
// получаем все строки из таблицы "country" и сортируем их по "name"
$countries = Country::find()->orderBy('name')->all();
// получаем строку с первичным ключом "US"
$country = Country::findOne('US');
// отобразит "United States"
echo $country->name;
// меняем имя страны на "U.S.A." и сохраняем в базу данных
$country->name = 'U.S.A.';
$country->save();
Info: Active Record — мощный способ доступа и манипулирования данными БД в объектно-ориентированном стиле. Вы можете найти подробную информацию в разделе Active Record. В качестве альтернативы, вы также можете взаимодействовать с базой данных, используя более низкоуровневый способ доступа, называемый Data Access Objects.
Создаём Action
Для того, чтобы показать данные по странам конечным пользователям, вам надо создать новый action. Вместо размещения нового action'a в контроллере site, как вы делали в предыдущих разделах, будет иметь больше смысла создать новый контроллер специально для всех действий, относящихся к данным по странам. Назовите новый контроллер CountryController, и создайте action index внутри него, как показано ниже.
<?php
namespace app\controllers;
use yii\web\Controller;
use yii\data\Pagination;
use app\models\Country;
class CountryController extends Controller
{
public function actionIndex()
{
$query = Country::find();
$pagination = new Pagination([
'defaultPageSize' => 5,
'totalCount' => $query->count(),
]);
$countries = $query->orderBy('name')
->offset($pagination->offset)
->limit($pagination->limit)
->all();
return $this->render('index', [
'countries' => $countries,
'pagination' => $pagination,
]);
}
}
Сохраните код выше в файле controllers/CountryController.php.
Action index вызывает Country::find(). Данный метод Active Record строит запрос к БД и извлекает все данные из таблицы country. Чтобы ограничить количество стран, возвращаемых каждым запросом, запрос разбивается на страницы с помощью объекта [[yii\data\Pagination]]. Объект Pagination служит двум целям:
- Устанавливает пункты
offsetиlimitдля SQL инструкции, представленной запросом, чтобы она возвращала только одну страницу данных за раз (в нашем случае максимум 5 строк на страницу). - Он используется во view для отображения пагинатора, состоящего из набора кнопок с номерами страниц, это будет разъяснено в следующем подразделе.
В конце кода action index выводит view с именем index, и передаёт в него данные по странам вместе c информацией о пагинации.
Создаём View
Первым делом создайте поддиректорию с именем country внутри директории views. Эта папка будет использоваться для хранения всех view, выводимых контроллером country. Внутри директории views/country создайте файл с именем index.php, содержащий следующий код:
<?php
use yii\helpers\Html;
use yii\widgets\LinkPager;
?>
<h1>Countries</h1>
<ul>
<?php foreach ($countries as $country): ?>
<li>
<?= Html::encode("{$country->code} ({$country->name})") ?>:
<?= $country->population ?>
</li>
<?php endforeach; ?>
</ul>
<?= LinkPager::widget(['pagination' => $pagination]) ?>
View имеет 2 части относительно отображения данных по странам. В первой части предоставленные данные по странам выводятся как неупорядоченный HTML-список. Во второй части выводится виджет [[yii\widgets\LinkPager]], используя информацию о пагинации, переданную из action во view. Виджет LinkPager отображает набор постраничных кнопок. Клик по любой из них обновит данные по странам в соответствующей странице.
Испытываем в действии
Чтобы увидеть, как работает весь вышеприведённый код, перейдите по следующей ссылке в своём браузере:
http://hostname/index.php?r=country%2Findex

В начале вы увидите страницу, показывающую пять стран. Под странами вы увидите пагинатор с четырьмя кнопками. Если вы кликните по кнопке "2", то увидите страницу, отображающую другие пять стран из базы данных: вторая страница записей. Посмотрев внимательней, вы увидите, что URL в браузере тоже сменилось на
http://hostname/index.php?r=country%2Findex&page=2
За кадром [[yii\data\Pagination|Pagination]] предоставляет всю необходимую функциональность для постраничной разбивки набора данных:
- В начале [[yii\data\Pagination|Pagination]] показывает первую страницу, которая отражает SELECT запрос стран с параметрами
LIMIT 5 OFFSET 0. Как результат, первые пять стран будут получены и отображены. - Виджет [[yii\widgets\LinkPager|LinkPager]] выводит кнопки страниц используя URL'ы, созданные [[yii\data\Pagination::createUrl()|Pagination]]. Эти URL'ы будут содержать параметр запроса
page, который представляет различные номера страниц. - Если вы кликните по кнопке "2", сработает и обработается новый запрос для маршрута
country/index. Таким образом новый запрос стран будет иметь параметрыLIMIT 5 OFFSET 5и вернет следующие пять стран для отображения.
Заключение
В этом разделе вы научились работать с базой данных. Также вы научились получать и отображать данные с постраничной разбивкой с помощью [[yii\data\Pagination]] и [[yii\widgets\LinkPager]].
В следующем разделе вы научитесь использовать мощный инструмент генерации кода, называемый Gii, чтобы с его помощью быстро осуществлять некоторые часто используемые функции, такие как операции Create-Read-Update-Delete (CRUD) для работы с данными в таблице базы данных. На самом деле код, который вы только что написали, в Yii может быть полностью сгенерирован автоматически с использованием Gii.
Как переименовать в Joomla шаблон Helix Ultimate
- Информация о материале
- Родительская категория: JoomShaper
- Категория: Helix Ultimate
- Переименование шаблона Helix Ultimate для Joomla
- Переименование до установки шаблона в админке Joomla
Переименование шаблона Helix Ultimate для Joomla.
Переименование шаблона Helix Ultimate в Joomla требует тщательной настройки различных файлов и базы данных из-за того, как Joomla работает с шаблонами как с расширениями. Процесс, описанный здесь, применим к переименованию любого шаблона на основе Helix Ultimate.
Примечание: В данном руководстве рассматривается только переименование шаблонов, а не плагина фреймворка Helix Ultimate, который переименовывать не следует.
Переименование до установки шаблона в админке Joomla.
Этот метод прост и подходит для большинства новичков. Выполните следующие шаги:
- Скачайте пакет шаблонов Helix Ultimate из раздела загрузок JoomShaper.
- Переименуйте ZIP-файл пакета шаблонов в нужное вам имя (например,
newname_template.zip). - Распакуйте пакет, перейдите в раздел templates и откройте файл
templateDetails.xmlс помощью текстового редактора, например Notepad. - Найдите строку
<name>shaper_helixultimate</name>и измените ее на<name>newname</name>. - Переименуйте языковой файл: Замените
en-GB.shaper_helixultimate.iniнаen-GB.tpl_newname.ini. - Внутри файла
templateDetails.xmlобновите строку<language tag="en-GB">en-GB.tpl_shaper_helixultimate.ini</language>на<language tag="en-GB">en-GB.tpl_newname.ini</language>. - Сохраните изменения в XML-файле.
- Сожмите измененный пакет шаблонов в ZIP-файл.
- Установите измененный шаблон в качестве нового шаблона и установите его по умолчанию.
- При необходимости вручную настройте параметры, особенно если используется пакет QuickStart. При использовании QuickStart удалите старый шаблон после сохранения новых настроек.
Перевод с английского официальной документации Helix Ultimate:
www.joomshaper.com
Текстовый редактор HTML (Rich editor) в Filament Form Builder
- Информация о материале
- Родительская категория: Конструктор форм (Form Builder)
- Категория: Поля конструктора форм Filament
- Обзор встраиваемого текстового редактора HTML в Filament Form Builder
- Настройка кнопок панели инструментов текстового редактора HTML
- Загрузка изображений в текстовый редактор HTML Filament Form Builder
Обзор встраиваемого текстового редактора HTML в Filament Form Builder
С помощью встраиваемого в Filament Form Builder текстового редактора можно редактировать и просматривать HTML-контент, а также загружать изображения.
use Filament\Forms\Components\RichEditor;
RichEditor::make('content')

Настройка кнопок панели инструментов текстового редактора HTML
Кнопки панели инструментов редактора можно установить с помощью метода toolbarButtons(). Параметры, показанные ниже, являются значениями по умолчанию. В дополнение к ним также доступна опция 'h1':
use Filament\Forms\Components\RichEditor;
RichEditor::make('content')
->toolbarButtons([
'attachFiles',
'blockquote',
'bold',
'bulletList',
'codeBlock',
'h2',
'h3',
'italic',
'link',
'orderedList',
'redo',
'strike',
'underline',
'undo',
])
В качестве альтернативы можно отключить определенные кнопки с помощью метода disableToolbarButtons():
use Filament\Forms\Components\RichEditor;
RichEditor::make('content')
->disableToolbarButtons([
'blockquote',
'strike',
])
Чтобы отключить все кнопки панели инструментов, задайте пустой массив с помощью toolbarButtons([]) или используйте disableAllToolbarButtons().
Загрузка изображений в текстовый редактор HTML Filament Form Builder
С помощью настроек можно определить, как загружать изображения:
use Filament\Forms\Components\RichEditor;
RichEditor::make('content')
->fileAttachmentsDisk('s3')
->fileAttachmentsDirectory('attachments')
->fileAttachmentsVisibility('private')
Перевод с английского официальной документации Filament:
https://filamentphp.com/docs/3.x/forms/fields/rich-editor
Исполняемые скрипты Composer
- Информация о материале
- Родительская категория: Программы для автоматизации работы
- Категория: Composer
- Что такое скрипт в Composer?
- Название событий Composer
- Настройка сценариев Composer
- Классы событий Composer
- Запуск скриптов вручную в Composer
- Написание пользовательских команд Composer
- Управление временем ожидания процесса Composer
- Ссылки на скрипты Composer
- Вызов команд Composer
- Выполнение PHP-скриптов Composer
- Установка переменных окружения в Composer
- Пользовательские описания Composer
- Пользовательские алиасы Composer
Что такое скрипт в Composer?
В терминах Composer скрипт (сценарий) может быть как обратным вызовом PHP (определяемым как статический метод), так и любой исполняемой командой командной строки. Скрипты полезны для выполнения пользовательского кода пакета или специфических для пакета команд в процессе выполнения Composer.
Начиная с версии Composer 2.5 скрипты также могут быть классами Symfony Console Command, что позволяет легко запускать их, передавая параметры. Тем не менее, это не рекомендуется для обработки событий.
Примечание:
Выполняются только скрипты, определенные в composer.json корневого пакета. Если зависимость корневого пакета указывает свои собственные скрипты, Composer не будет выполнять дополнительные скрипты.
Название событий Composer.
В процессе выполнения Composer вызывает следующие именованные события:
События команд Composer.
pre-install-cmd:- происходит до выполнения команды
installпри наличии файла блокировки.
- происходит до выполнения команды
post-install-cmd:- происходит после выполнения команды
installпри наличии файла блокировки.
- происходит после выполнения команды
pre-update-cmd:- происходит перед выполнением команды
updateили перед выполнением командыinstallв отсутствие файла блокировки.
- происходит перед выполнением команды
post-update-cmd:- происходит после выполнения команды
updateили после выполнения командыinstallв отсутствие файла блокировки.
- происходит после выполнения команды
pre-status-cmd:- происходит до выполнения команды
status.
- происходит до выполнения команды
post-status-cmd:- происходит после выполнения команды
status.
- происходит после выполнения команды
pre-archive-cmd:- происходит перед выполнением команды
archive.
- происходит перед выполнением команды
post-archive-cmd:- происходит после выполнения команды
archive.
- происходит после выполнения команды
pre-autoload-dump:- происходит перед дампом автозагрузчика, либо во время
install/update, либо с помощью командыdump-autoload.
- происходит перед дампом автозагрузчика, либо во время
post-autoload-dump:- происходит после сброса автозагрузки, либо во время
install/update, либо с помощью командыdump-autoload.
- происходит после сброса автозагрузки, либо во время
post-root-package-install:- происходит после установки корневого пакета в ходе выполнения команды
create-project(но до установки его зависимостей).
- происходит после установки корневого пакета в ходе выполнения команды
post-create-project-cmd:- происходит после выполнения команды
create-project.
- происходит после выполнения команды
События установщика Composer.
pre-operations-exec:- происходит перед выполнением операций
install/upgrade/... при установке файла блокировки. Плагины, которым нужно подключиться к этому событию, должны быть установлены глобально, чтобы их можно было использовать, так как в противном случае они не будут загружены при свежей установке проекта.
- происходит перед выполнением операций
События пакета Composer.
pre-package-install:- происходит до установки пакета.
post-package-install:- происходит после установки пакета.
pre-package-update:- происходит перед обновлением пакета.
post-package-update:- происходит после обновления пакета.
pre-package-uninstall:- происходит перед удалением пакета.
post-package-uninstall:- происходит после удаления пакета.
События плагина Composer.
init:- происходит после завершения инициализации экземпляра Composer.
command:- происходит перед выполнением любой команды Composer в CLI. Она предоставляет доступ к объектам ввода и вывода программы.
pre-file-download:- происходит перед загрузкой файлов и позволяет манипулировать объектом
HttpDownloaderперед загрузкой файлов на основе URL-адреса для загрузки.
- происходит перед загрузкой файлов и позволяет манипулировать объектом
post-file-download:- происходит после загрузки файлов пакета дистрибутива и позволяет выполнить дополнительные проверки файла, если это необходимо.
pre-command-run:- происходит перед выполнением команды и позволяет манипулировать параметрами и аргументами объекта
InputInterface, чтобы изменить поведение команды.
- происходит перед выполнением команды и позволяет манипулировать параметрами и аргументами объекта
pre-pool-create:- происходит перед созданием пула пакетов и позволяет отфильтровать список пакетов, которые попадут в Solver.
Примечание:
Composer не делает никаких предположений о состоянии ваших зависимостей перед командамиinstallилиupdate. Поэтому не следует указывать скрипты, требующие управляемых Composer зависимостей, в сценарияхpre-update-cmdилиpre-install-cmd. Если требуется выполнить скрипты перед процессамиinstallилиupdate, убедитесь, что они находятся в корневом пакете.
Настройка сценариев Composer.
Корневой объект JSON в composer.json должен иметь свойство "scripts", которое содержит пары именованных событий и соответствующие им скрипты. Сценарии события могут быть заданы как строка (только для одного сценария) или массив (для одного или нескольких сценариев).
Для любого заданного события:
- Скрипты выполняются в порядке, определенном при наступлении соответствующего события.
- Массив скриптов, привязанных к одному событию, может содержать как обратные вызовы PHP, так и исполняемые команды командной строки.
- PHP-классы и команды, содержащие определенные обратные вызовы, должны быть автозагружаемыми с помощью функции автозагрузки Composer.
- Обратные вызовы могут автозагружать только классы из определений psr-0, psr-4 и classmap. Если определенный обратный вызов полагается на функции, определенные вне класса, то сам обратный вызов отвечает за загрузку файла, содержащего эти функции.
Пример использования определения сценария:
{
"scripts": {
"post-update-cmd": "MyVendor\\MyClass::postUpdate",
"post-package-install": [
"MyVendor\\MyClass::postPackageInstall"
],
"post-install-cmd": [
"MyVendor\\MyClass::warmCache",
"phpunit -c app/"
],
"post-autoload-dump": [
"MyVendor\\MyClass::postAutoloadDump"
],
"post-create-project-cmd": [
"php -r \"copy('config/local-example.php', 'config/local.php');\""
]
}
}
На примере предыдущего определения приведен класс MyVendor\MyClass, который может быть использован для выполнения обратных вызовов PHP:
<?php
namespace MyVendor;
use Composer\Script\Event;
use Composer\Installer\PackageEvent;
class MyClass
{
public static function postUpdate(Event $event)
{
$composer = $event->getComposer();
// что-то сделать ещё
}
public static function postAutoloadDump(Event $event)
{
$vendorDir = $event->getComposer()->getConfig()->get('vendor-dir');
require $vendorDir . '/autoload.php';
some_function_from_an_autoloaded_file();
}
public static function postPackageInstall(PackageEvent $event)
{
$installedPackage = $event->getOperation()->getPackage();
// что-то сделать ещё
}
public static function warmCache(Event $event)
{
// сделать кэш вкусным
}
}
Примечание:
Во время выполнения командыinstallилиupdateComposer в окружение будет добавлена переменнаяCOMPOSER_DEV_MODE. Если команда была запущена с флагом--no-dev, эта переменная будет установлена в0, в противном случае она будет установлена в1. Переменная также доступна во время выполненияdump-autoload, и она будет установлена в то же значение, в котором была запущена последняя командаinstallилиupdate.
Классы событий Composer.
Когда происходит событие, в качестве первого аргумента ваш обратный вызов PHP получает объект Composer\EventDispatcher\Event. Этот объект имеет метод getName(), который позволяет получить название события.
В зависимости от типа сценария вы получите различные подклассы событий, содержащие различные геттеры с соответствующими данными и связанными с ними объектами:
- Base class:
Composer\EventDispatcher\Event - Command Events:
Composer\Script\Event - Installer Events:
Composer\Installer\InstallerEvent - Package Events:
Composer\Installer\PackageEvent - Plugin Events:
init:Composer\EventDispatcher\Eventcommand:Composer\Plugin\CommandEventpre-file-download:Composer\Plugin\PreFileDownloadEventpost-file-download:Composer\Plugin\PostFileDownloadEvent
Запуск скриптов вручную в Composer.
Если требуется запустить скрипты для события вручную, синтаксис будет следующим:
php composer.phar run-script [--dev] [--no-dev] script
Например, composer run-script post-install-cmd запустит все скрипты и плагины post-install-cmd, которые были определены.
Обработчику скриптов также можно передать дополнительные аргументы, добавив -- после аргументов обработчика. Например, composer run-script post-install-cmd -- --check передаст обработчику скриптов аргумент --check. Эти аргументы принимаются как аргументы CLI обработчиками CLI, и могут быть получены как массив через $event->getArguments() обработчиками PHP.
Написание пользовательских команд Composer.
Если добавляются пользовательские сценарии, которые не подходят ни под одно из предопределенных выше названий событий, их можно запустить с помощью run-script или как собственные команды Composer. Например, обработчик, определенный ниже, выполняется при запуске команды composer test:
{
"scripts": {
"test": "phpunit",
"do-something": "MyVendor\\MyClass::doSomething"
"my-cmd": "MyVendor\\MyCommand"
}
}
Аналогично команде run-script можно передавать дополнительные аргументы скриптам, например, composer test -- --filter <pattern> передаст --filter <pattern> скрипту phpunit.
Использование метода PHP через composer do-something arg позволяет выполнить статическую функцию doSomething(\Composer\Script\Event $event) и arg становится доступным в $event->getArguments(). Однако это не позволяет с легкостью передавать пользовательские параметры в виде --flags.
Используя класс Command из symfony/console, можно определить и получить доступ к аргументам и параметрам более легко.
Например, с командой показанной ниже, можно просто вызвать composer my-cmd --arbitrary-flag без разделителя --. Чтобы команды были распознаны как команды symfony/console, имя класса должно заканчиваться на Command и расширять класс Command symfony. Также обратите внимание, что для запуска будет использоваться встроенная в Composer версия symfony/console, которая может не совпадать с той, что требуется в вашем проекте, и может меняться между минорными выпусками Composer. Если требуется больше гарантий безопасности, лучше использовать собственный бинарный файл, который запускает вашу собственную версию symfony/console изолированно в собственном процессе.
<?php
namespace MyVendor;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
class MyCommand extends Command
{
protected function configure(): void
{
$this->setDefinition([
new InputOption('arbitrary-flag', null, InputOption::VALUE_NONE, 'Example flag'),
new InputArgument('foo', InputArgument::OPTIONAL, 'Optional arg'),
]);
}
public function execute(InputInterface $input, OutputInterface $output): int
{
if ($input->getOption('arbitrary-flag')) {
$output->writeln('The flag was used')
}
return 0;
}
}
Примечание:
Перед выполнением скриптовbin-dirComposer временно помещается поверх переменной окружения PATH, чтобы двоичные файлы зависимостей были доступны напрямую. В данном примере неважно, находится ли двоичный файлphpunitвvendor/bin/phpunitилиbin/phpunit, он будет найден и выполнен.
Управление временем ожидания процесса Composer.
Хотя Composer не предназначен для управления длительными процессами и другими подобными моментами в PHP-проектах, иногда бывает полезно отключить таймаут процесса в пользовательских командах. По умолчанию этот таймаут составляет 300 секунд и может быть переопределен различными способами в зависимости от требуемого эффекта:
- отключить его для всех команд с помощью config-ключа
process-timeout, - отключить его для текущего или будущих вызовов Composer с помощью переменной окружения
COMPOSER_PROCESS_TIMEOUT, - для конкретного вызова с помощью флага
--timeoutкомандыrun-script, - с помощью статического помощника для отдельных скриптов.
Чтобы отключить таймаут для конкретных скриптов, используйте статический помощник непосредственно в composer.json:
{
"scripts": {
"test": [
"Composer\\Config::disableProcessTimeout",
"phpunit"
]
}
}
Чтобы отключить таймаут для каждого скрипта в конкретном проекте, можно воспользоваться конфигурацией composer.json:
{
"config": {
"process-timeout": 0
}
}
Также можно установить глобальную переменную окружения, чтобы отключить тайм-аут всех следующих скриптов в текущем окружении терминала:
export COMPOSER_PROCESS_TIMEOUT=0
Чтобы отключить тайм-аут для одного вызова сценария, необходимо использовать команду run-script composer и указать параметр --timeout:
php composer.phar run-script --timeout=0 test
Ссылки на скрипты Composer.
Чтобы обеспечить повторное использование сценария и избежать дублирования, его можно вызвать из другого сценария, добавив к имени команды префикс @:
{
"scripts": {
"test": [
"@clearCache",
"phpunit"
],
"clearCache": "rm -rf cache/*"
}
}
Можно также обратиться к скрипту и передать ему новые аргументы:
{
"scripts": {
"tests": "phpunit",
"testsVerbose": "@tests -vvv"
}
}
Вызов команд Composer.
Для вызова команд Composer можно использовать @composer, который автоматически перейдет к тому composer.phar, который используется в данный момент:
{
"scripts": {
"test": [
"@composer install",
"phpunit"
]
}
}
Одно из ограничений заключается в том, что невозможно вызвать несколько команд composer подряд, например @composer install && @composer foo. Их необходимо разделить в JSON-массиве команд.
Выполнение PHP-скриптов Composer.
Для выполнения PHP-скриптов можно использовать @php, который автоматически переадресуется на тот процесс php, который используется в данный момент:
{
"scripts": {
"test": [
"@php script.php",
"phpunit"
]
}
}
Одно из ограничений заключается в том, что нельзя вызывать несколько команд подряд, например @php install && @php foo. Их нужно разделить в JSON-массиве команд.
Также можно вызвать скрипт shell/bash, в котором путь к исполняемому файлу PHP будет доступен в качестве переменной окружения PHP_BINARY.
Установка переменных окружения в Composer.
Чтобы установить переменную окружения кроссплатформенным способом, используется @putenv:
{
"scripts": {
"install-phpstan": [
"@putenv COMPOSER=phpstan-composer.json",
"composer install --prefer-dist"
]
}
}
Пользовательские описания Composer.
В файле composer.json можно задать пользовательские описания скриптов:
{
"scripts-descriptions": {
"test": "Запуск всех тестов!"
}
}
Описания используются в командах composer list или composer run -l для описания того, что делают скрипты при выполнении команды.
Примечание:
Настроить пользовательские описания можно только для пользовательских команд.
Пользовательские алиасы Composer.
В файле composer.json можно задать пользовательские псевдонимы скриптов с помощью следующих параметров:
{
"scripts-aliases": {
"phpstan": ["stan", "analyze"]
}
}
Алиасы представляют собой альтернативные имена команд.
Примечание:
Установить пользовательские псевдонимы можно только для пользовательских команд.
Перевод с английского официальной документации Composer:
https://getcomposer.org/doc/articles/scripts.md
Страница 12 из 217