Skip to content

Расширение кода

JournalPHP построен на стандартных механизмах Laravel. Добавить новую функциональность можно без форка — через Service Providers, Events, Middleware и собственный код.

Сервис-провайдеры

Провайдеры зарегистрированы в config/app.php → providers:

ProviderНазначение
AppServiceProviderПривязки интерфейсов (AI, модерация изображений)
RepositoryServiceProviderРепозитории данных и конфигурации
MetaBuilderServiceProviderSEO meta builders
EventServiceProviderРегистрация событий и Socialite-провайдеров
HorizonServiceProviderHorizon (доступ по email из админки → Доступы, /admin-panel/system/access)
RouteServiceProviderЗагрузка файлов маршрутов

Добавить привязку сервиса

В AppServiceProvider::register():

php
$this->app->bind(MyServiceInterface::class, MyService::class);
// или
$this->app->singleton(AnotherService::class);

Добавить OAuth-провайдер

  1. Установите пакет из SocialiteProviders
  2. Зарегистрируйте Listener в EventServiceProvider:
php
protected $listen = [
    SocialiteWasCalled::class => [
        'SocialiteProviders\\MyProvider\\MyProviderExtendSocialite',
    ],
];
  1. Добавьте поля в AuthSettingsController и resources/js/Admin/Pages/Settings/Auth/Edit.vue
  2. Сохраняйте Client ID / Secret в таблице config

Поддерживаемые OAuth-провайдеры: Google, Яндекс, ВКонтакте, Facebook, Apple, GitHub. One Tap (Google, Яндекс) настраивается на той же странице.

Паттерн Repository

Добавить новую настройку через Админ-панель

  1. Миграция — добавьте запись в config:
php
DB::table('config')->insert([
    'key' => 'my_feature',
    'value' => json_encode(['enabled' => false]),
]);
  1. Интерфейсapp/Repositories/Config/Interfaces/GetMyFeatureRepositoryInterface.php

  2. Реализацияapp/Repositories/Config/GetMyFeatureRepository.php

  3. Привязка в RepositoryServiceProvider:

php
$this->app->bind(
    GetMyFeatureRepositoryInterface::class,
    GetMyFeatureRepository::class
);
  1. Контроллерapp/Http/Controllers/Admin/MyFeatureSettingsController.php

  2. Vue-страницаresources/js/Admin/Pages/Settings/MyFeature.vue

  3. Маршрут в routes/admin.php

  4. Раздел в config/admin_sections.php (ключ вида settings/my-feature) и пункт меню в AppSidebar.vue

Actions

Новые бизнес-операции оформляйте как Action-классы:

php
namespace App\Actions\MyFeature;

class DoSomethingAction
{
    public function execute(DoSomethingDTO $dto): Result
    {
        // бизнес-логика
    }
}

Вызов из контроллера:

php
public function store(MyRequest $request, DoSomethingAction $action)
{
    $result = $action->execute(DoSomethingDTO::fromRequest($request));
    return back();
}

Artisan-команды

Новые команды в app/Console/Commands/. Автозагружаются через $this->load() в Kernel.php.

bash
php artisan make:command MyCommand

Middleware

Новый Middleware:

bash
php artisan make:middleware MyMiddleware

Регистрация в app/Http/Kernel.php (глобально или в группах маршрутов).

События и Listeners

bash
php artisan make:event PostPublished
php artisan make:listener NotifySubscribers --event=PostPublished

Регистрация в EventServiceProvider::$listen.

Observers

Наблюдатели за жизненным циклом модели:

php
// AppServiceProvider::boot()
Post::observe(PostObserver::class);

Добавить раздел в Админ-панель

  1. Добавьте ключ в config/admin_sections.php:
php
'settings/my-section' => 'Мой раздел',
  1. Добавьте пункт в resources/js/Admin/Layout/AppSidebar.vue

  2. Создайте контроллер и маршрут в routes/admin.php:

php
Route::get('/admin-panel/my-section', [MySectionController::class, 'index']);
  1. Создайте Inertia-страницу в resources/js/Admin/Pages/

Сменный драйвер (Driver Pattern)

Пример добавления нового AI-провайдера:

  1. Реализуйте AiServiceInterface из app/Contracts/
  2. Зарегистрируйте в AiServiceProvider с условием на конфигурацию
  3. Добавьте поля выбора в AI Настройки (/admin-panel/ai-settings); переменные DEEPSEEK_* в .env используются как fallback до первой настройки в админке

Локальные пакеты

Через Composer path repository:

json
{
    "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.

Released under the MIT License.