Вопрос или проблема
Я только начинаю разбираться с управлением пакетами 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">·</span>
© {{ date("Y") }} от Nowak Admin
<span class="px-1">·</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 может быть сложным процессом, особенно для новичков. Давайте разберем шаги, которые вы уже предприняли, и какие дополнительные действия могут быть необходимы для достижения вашей цели.
Шаги по созданию пакета
-
Создание оболочки пакета: Вы правильно начали с установки пакета
laravel-packager
, который значительно упрощает процесс создания пакета. -
Структура папок: Вы создали папки для моделей и ресурсов Nova, что является правильным подходом:
Packages/NowakAdmin/SomePackage/src/Models Packages/NowakAdmin/SomePackage/src/Nova
-
Регистрация пакета в
composer.json
: Вы добавили ваш пакет в секциюrepositories
, а затем выполнили командуcomposer update
, чтобы загрузить пакет. Это также правильные действия.
Проблемы с загрузкой моделей и ресурсов Nova
На этом этапе у вас возникла проблема с тем, что модели и ресурсы Nova не отображаются в меню Nova. Вот несколько пунктов, которые нужно проверить и корректировать:
-
Проверьте автозагрузку классов:
Убедитесь, что в вашемcomposer.json
в корневом проекте всё правильно указано для автозагрузки вашего пакета:"autoload": { "psr-4": { "NowakAdmin\\SomePackage\\": "src" } },
После этого выполните команду:
composer dump-autoload
-
Регистрация ресурсов Nova:
Вам нужно явно зарегистрировать ресурсы Nova в вашем пакете. Это можно сделать в методеboot()
вашего пакета. Например, в классе вашего пакета вы можете добавить:use Laravel\Nova\Nova; use NowakAdmin\SomePackage\Nova\YourNovaResource; // Подключите ваши ресурсы public function boot() { Nova::resources([ YourNovaResource::class, ]); }
Эта регистрация позволит Nova обнаруживать ваши ресурсы.
-
Создание модели:
Убедитесь, что ваша модель имеет пространство имен и расширяет класс Eloquent. Например:namespace NowakAdmin\SomePackage\Models; use Illuminate\Database\Eloquent\Model; class YourModel extends Model { // Ваш код модели }
Другие рекомендации
-
Включение миграций: Если ваши модели зависят от миграций, убедитесь, что ваш пакет также включает миграции и они выполняются в вашем приложении.
-
Документация: Если вам нужно больше информации о том, как организовать пакеты для Laravel, обратитесь к официальной документации Laravel и Nova. Несмотря на то что вы уже заметили отсутствие информации о моделях в документации по пакетам, вам может пригодиться раздел о ресурсах Nova.
-
Тестирование: После внесения изменений не забудьте удалить кэш Nova, если он есть, и протестировать интеграцию, чтобы убедиться, что всё работает корректно.
Заключение
Следуя указанным выше рекомендациям, вы сможете успешно интегрировать Laravel модели с ресурсами Nova в свой пользовательский пакет. Не стесняйтесь исследовать другие источники и примеры на GitHub, чтобы увидеть, как другие разработчики организуют свои пакеты. Это поможет вам углубить свое понимание и ускорит процесс разработки. Удачи в вашем проекте!