Расширение кода
JournalPHP построен на стандартных механизмах Laravel. Добавить новую функциональность можно без форка — через Service Providers, Events, Middleware и собственный код.
Сервис-провайдеры
Провайдеры зарегистрированы в config/app.php → providers:
| Provider | Назначение |
|---|---|
AppServiceProvider | Привязки интерфейсов (AI, модерация изображений) |
RepositoryServiceProvider | Репозитории данных и конфигурации |
MetaBuilderServiceProvider | SEO meta builders |
EventServiceProvider | Регистрация событий и Socialite-провайдеров |
HorizonServiceProvider | Horizon (доступ по email из админки → Доступы, /admin-panel/system/access) |
RouteServiceProvider | Загрузка файлов маршрутов |
Добавить привязку сервиса
В AppServiceProvider::register():
$this->app->bind(MyServiceInterface::class, MyService::class);
// или
$this->app->singleton(AnotherService::class);Добавить OAuth-провайдер
- Установите пакет из SocialiteProviders
- Зарегистрируйте Listener в
EventServiceProvider:
protected $listen = [
SocialiteWasCalled::class => [
'SocialiteProviders\\MyProvider\\MyProviderExtendSocialite',
],
];- Добавьте поля в
AuthSettingsControllerиresources/js/Admin/Pages/Settings/Auth/Edit.vue - Сохраняйте Client ID / Secret в таблице
config
Поддерживаемые OAuth-провайдеры: Google, Яндекс, ВКонтакте, Facebook, Apple, GitHub. One Tap (Google, Яндекс) настраивается на той же странице.
Паттерн Repository
Добавить новую настройку через Админ-панель
- Миграция — добавьте запись в
config:
DB::table('config')->insert([
'key' => 'my_feature',
'value' => json_encode(['enabled' => false]),
]);Интерфейс —
app/Repositories/Config/Interfaces/GetMyFeatureRepositoryInterface.phpРеализация —
app/Repositories/Config/GetMyFeatureRepository.phpПривязка в
RepositoryServiceProvider:
$this->app->bind(
GetMyFeatureRepositoryInterface::class,
GetMyFeatureRepository::class
);Контроллер —
app/Http/Controllers/Admin/MyFeatureSettingsController.phpVue-страница —
resources/js/Admin/Pages/Settings/MyFeature.vueМаршрут в
routes/admin.phpРаздел в
config/admin_sections.php(ключ видаsettings/my-feature) и пункт меню вAppSidebar.vue
Actions
Новые бизнес-операции оформляйте как Action-классы:
namespace App\Actions\MyFeature;
class DoSomethingAction
{
public function execute(DoSomethingDTO $dto): Result
{
// бизнес-логика
}
}Вызов из контроллера:
public function store(MyRequest $request, DoSomethingAction $action)
{
$result = $action->execute(DoSomethingDTO::fromRequest($request));
return back();
}Artisan-команды
Новые команды в app/Console/Commands/. Автозагружаются через $this->load() в Kernel.php.
php artisan make:command MyCommandMiddleware
Новый Middleware:
php artisan make:middleware MyMiddlewareРегистрация в app/Http/Kernel.php (глобально или в группах маршрутов).
События и Listeners
php artisan make:event PostPublished
php artisan make:listener NotifySubscribers --event=PostPublishedРегистрация в EventServiceProvider::$listen.
Observers
Наблюдатели за жизненным циклом модели:
// AppServiceProvider::boot()
Post::observe(PostObserver::class);Добавить раздел в Админ-панель
- Добавьте ключ в
config/admin_sections.php:
'settings/my-section' => 'Мой раздел',Добавьте пункт в
resources/js/Admin/Layout/AppSidebar.vueСоздайте контроллер и маршрут в
routes/admin.php:
Route::get('/admin-panel/my-section', [MySectionController::class, 'index']);- Создайте Inertia-страницу в
resources/js/Admin/Pages/
Сменный драйвер (Driver Pattern)
Пример добавления нового AI-провайдера:
- Реализуйте
AiServiceInterfaceизapp/Contracts/ - Зарегистрируйте в
AiServiceProviderс условием на конфигурацию - Добавьте поля выбора в AI Настройки (
/admin-panel/ai-settings); переменныеDEEPSEEK_*в.envиспользуются как fallback до первой настройки в админке
Локальные пакеты
Через Composer path repository:
{
"repositories": [
{
"type": "path",
"url": "./packages/my-package"
}
]
}Зарегистрируйте Service Provider пакета в config/app.php.
Маршруты
| Файл | Тип маршрутов |
|---|---|
routes/web.php | Публичные и авторизованные |
routes/admin.php | Только для администраторов |
Laravel Sanctum установлен, но routes/api.php отсутствует.
Форк
MIT-лицензия разрешает любые изменения в форке. Для значительных кастомизаций — сделайте форк и работайте в отдельном репозитории. Мержите обновления из основного репозитория через git merge upstream/master.