Пользовательский пакет Laravel с ресурсами Nova и моделями Laravel

Вопрос или проблема

Я только начинаю разбираться с управлением пакетами composer/laravel и после своих исследований не могу добиться своей цели.

Что я сделал:
Я использовал этот пакет для создания оболочки для своего пакета:
composer require jeroen-g/laravel-packager --dev

Создал оболочку пакета:
php artisan packager:new NowakAdmin SomePackage

Затем я добавил папки:
Packages\NowakAdmin\SomePackage\src\Models <- там я положил свои файлы моделей
Packages\NowakAdmin\SomePackage\src\Nova <- там я положил свои файлы ресурсов nova

После этого я создал приватный репозиторий на Github, добавил в composer.json:

"require-dev": {
    "nowakadmin/somepackage": "dev-main",
}
...
"repositories": [
            {
                "type": "vcs",
                "url": "[email protected]:nowakadmin/somepackage.git"
            }

Удалил пакет из /Packages/:
php artisan packager:remove NowakAdmin SomePackage

В конце выполнил composer update – ошибок нет, скачал с github, установил.

Но модели / ресурсы не загружены (не отображаются в меню nova)

Я пытался сделать что-то проще в начале, поэтому добавил код в

    /**
     * Регистрация любых сервисов пакета.
     *
     * @return void
     */
    public function register(): void
    {
        $this->mergeConfigFrom(__DIR__.'/../config/namsbase.php', 'namsbase');

        // Логотип Nova
        $this->setNovaLogo();

        // Нижний колонтитул Nova
        Nova::footer(function ($request) {
            return Blade::render('
            <p class="mt-8 text-center text-xs text-80">
            <a href="" class="text-primary dim no-underline"></a>
            <span class="px-1">&middot;</span>
            &copy; {{ date("Y") }} от Nowak Admin
            <span class="px-1">&middot;</span>
            Nova {{ \Laravel\Nova\Nova::version() }} || PHP {{ phpversion() }} || Laravel {{ app()->version() }}
        </p>
            ', ['mysql' => $this->mysql_version()]);
        });

        // Регистрация сервиса, который предоставляет пакет.
        $this->app->singleton('namsbase', function ($app) {
            return new NamsBase;
        });

    }

Вышеприведенный код работает и переопределяет нижний колонтитул и логотип Nova. Но я не знаю, правильное ли это место для размещения этого кода.

В composer.json загружается весь src

"autoload": {
        "psr-4": {
            "NowakAdmin\\SomePackage\\": "src"
        }
    },

И в моделях я пробовал несколько решений:
как в ответе на вопрос: Использование моделей в пакетах

<?php
// Обратите внимание, без пространства имен

use \Illuminate\Database\Eloquent\Model as Eloquent;

class YourModel extends Eloquent {
    //
}

или как в https://www.laravelpackage.com/08-models-and-migrations/

<?php
namespace NowakAdmin\SomePackage\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;

class Distribution extends Model
{

Источники вышеуказанного несколько устарели (2011/ 2018), и я предполагаю, что в настоящее время это должно делаться иначе.

Также я не нашел ничего о добавлении моделей в пакеты в документации Laravel:
https://laravel.com/docs/11.x/packages

Я предполагаю, что, возможно, мне просто нужно сделать какой-то хук меню Nova в своем пакете? (это в стандартном, режим установки изначально)

Я использую Laravel 11.27.2 и nova 4.35.3 на php 8.2.22; надеюсь, мой английский понятен.

Чтобы прояснить:
Моя цель – иметь модели laravel, связанные с ресурсами nova внутри пользовательского пакета laravel.

Ответ или решение

Создание пользовательского пакета Laravel с ресурсами Nova и моделями Laravel может быть сложным процессом, особенно для новичков. Давайте разберем шаги, которые вы уже предприняли, и какие дополнительные действия могут быть необходимы для достижения вашей цели.

Шаги по созданию пакета

  1. Создание оболочки пакета: Вы правильно начали с установки пакета laravel-packager, который значительно упрощает процесс создания пакета.

  2. Структура папок: Вы создали папки для моделей и ресурсов Nova, что является правильным подходом:

    Packages/NowakAdmin/SomePackage/src/Models
    Packages/NowakAdmin/SomePackage/src/Nova
  3. Регистрация пакета в composer.json: Вы добавили ваш пакет в секцию repositories, а затем выполнили команду composer update, чтобы загрузить пакет. Это также правильные действия.

Проблемы с загрузкой моделей и ресурсов Nova

На этом этапе у вас возникла проблема с тем, что модели и ресурсы Nova не отображаются в меню Nova. Вот несколько пунктов, которые нужно проверить и корректировать:

  1. Проверьте автозагрузку классов:
    Убедитесь, что в вашем composer.json в корневом проекте всё правильно указано для автозагрузки вашего пакета:

    "autoload": {
       "psr-4": {
           "NowakAdmin\\SomePackage\\": "src"
       }
    },

    После этого выполните команду:

    composer dump-autoload
  2. Регистрация ресурсов Nova:
    Вам нужно явно зарегистрировать ресурсы Nova в вашем пакете. Это можно сделать в методе boot() вашего пакета. Например, в классе вашего пакета вы можете добавить:

    use Laravel\Nova\Nova;
    use NowakAdmin\SomePackage\Nova\YourNovaResource; // Подключите ваши ресурсы
    
    public function boot()
    {
       Nova::resources([
           YourNovaResource::class,
       ]);
    }

    Эта регистрация позволит Nova обнаруживать ваши ресурсы.

  3. Создание модели:
    Убедитесь, что ваша модель имеет пространство имен и расширяет класс Eloquent. Например:

    namespace NowakAdmin\SomePackage\Models;
    
    use Illuminate\Database\Eloquent\Model;
    
    class YourModel extends Model {
       // Ваш код модели
    }

Другие рекомендации

  • Включение миграций: Если ваши модели зависят от миграций, убедитесь, что ваш пакет также включает миграции и они выполняются в вашем приложении.

  • Документация: Если вам нужно больше информации о том, как организовать пакеты для Laravel, обратитесь к официальной документации Laravel и Nova. Несмотря на то что вы уже заметили отсутствие информации о моделях в документации по пакетам, вам может пригодиться раздел о ресурсах Nova.

  • Тестирование: После внесения изменений не забудьте удалить кэш Nova, если он есть, и протестировать интеграцию, чтобы убедиться, что всё работает корректно.

Заключение

Следуя указанным выше рекомендациям, вы сможете успешно интегрировать Laravel модели с ресурсами Nova в свой пользовательский пакет. Не стесняйтесь исследовать другие источники и примеры на GitHub, чтобы увидеть, как другие разработчики организуют свои пакеты. Это поможет вам углубить свое понимание и ускорит процесс разработки. Удачи в вашем проекте!

Оцените материал
Добавить комментарий

Капча загружается...