217 lines
7.3 KiB
PHP
217 lines
7.3 KiB
PHP
<?php
|
|
|
|
namespace Spatie\LaravelPackageTools;
|
|
|
|
use Carbon\Carbon;
|
|
use Illuminate\Support\Facades\View;
|
|
use Illuminate\Support\ServiceProvider;
|
|
use Illuminate\Support\Str;
|
|
use ReflectionClass;
|
|
use Spatie\LaravelPackageTools\Exceptions\InvalidPackage;
|
|
|
|
abstract class PackageServiceProvider extends ServiceProvider
|
|
{
|
|
protected Package $package;
|
|
|
|
abstract public function configurePackage(Package $package): void;
|
|
|
|
public function register()
|
|
{
|
|
$this->registeringPackage();
|
|
|
|
$this->package = $this->newPackage();
|
|
|
|
$this->package->setBasePath($this->getPackageBaseDir());
|
|
|
|
$this->configurePackage($this->package);
|
|
|
|
if (empty($this->package->name)) {
|
|
throw InvalidPackage::nameIsRequired();
|
|
}
|
|
|
|
foreach ($this->package->configFileNames as $configFileName) {
|
|
$this->mergeConfigFrom($this->package->basePath("/../config/{$configFileName}.php"), $configFileName);
|
|
}
|
|
|
|
$this->packageRegistered();
|
|
|
|
return $this;
|
|
}
|
|
|
|
public function newPackage(): Package
|
|
{
|
|
return new Package();
|
|
}
|
|
|
|
public function boot()
|
|
{
|
|
$this->bootingPackage();
|
|
|
|
if ($this->package->hasTranslations) {
|
|
$langPath = 'vendor/' . $this->package->shortName();
|
|
|
|
$langPath = (function_exists('lang_path'))
|
|
? lang_path($langPath)
|
|
: resource_path('lang/' . $langPath);
|
|
}
|
|
|
|
if ($this->app->runningInConsole()) {
|
|
foreach ($this->package->configFileNames as $configFileName) {
|
|
$this->publishes([
|
|
$this->package->basePath("/../config/{$configFileName}.php") => config_path("{$configFileName}.php"),
|
|
], "{$this->package->shortName()}-config");
|
|
}
|
|
|
|
if ($this->package->hasViews) {
|
|
$this->publishes([
|
|
$this->package->basePath('/../resources/views') => base_path("resources/views/vendor/{$this->packageView($this->package->viewNamespace)}"),
|
|
], "{$this->packageView($this->package->viewNamespace)}-views");
|
|
}
|
|
|
|
if ($this->package->hasInertiaComponents) {
|
|
$packageDirectoryName = Str::of($this->packageView($this->package->viewNamespace))->studly()->remove('-')->value();
|
|
|
|
$this->publishes([
|
|
$this->package->basePath('/../resources/js/Pages') => base_path("resources/js/Pages/{$packageDirectoryName}"),
|
|
], "{$this->packageView($this->package->viewNamespace)}-inertia-components");
|
|
}
|
|
|
|
$now = Carbon::now();
|
|
foreach ($this->package->migrationFileNames as $migrationFileName) {
|
|
$filePath = $this->package->basePath("/../database/migrations/{$migrationFileName}.php");
|
|
if (! file_exists($filePath)) {
|
|
// Support for the .stub file extension
|
|
$filePath .= '.stub';
|
|
}
|
|
|
|
$this->publishes([
|
|
$filePath => $this->generateMigrationName(
|
|
$migrationFileName,
|
|
$now->addSecond()
|
|
), ], "{$this->package->shortName()}-migrations");
|
|
|
|
if ($this->package->runsMigrations) {
|
|
$this->loadMigrationsFrom($filePath);
|
|
}
|
|
}
|
|
|
|
if ($this->package->hasTranslations) {
|
|
$this->publishes([
|
|
$this->package->basePath('/../resources/lang') => $langPath,
|
|
], "{$this->package->shortName()}-translations");
|
|
}
|
|
|
|
if ($this->package->hasAssets) {
|
|
$this->publishes([
|
|
$this->package->basePath('/../resources/dist') => public_path("vendor/{$this->package->shortName()}"),
|
|
], "{$this->package->shortName()}-assets");
|
|
}
|
|
}
|
|
|
|
if (! empty($this->package->commands)) {
|
|
$this->commands($this->package->commands);
|
|
}
|
|
|
|
if (! empty($this->package->consoleCommands) && $this->app->runningInConsole()) {
|
|
$this->commands($this->package->consoleCommands);
|
|
}
|
|
|
|
if ($this->package->hasTranslations) {
|
|
$this->loadTranslationsFrom(
|
|
$this->package->basePath('/../resources/lang/'),
|
|
$this->package->shortName()
|
|
);
|
|
|
|
$this->loadJsonTranslationsFrom($this->package->basePath('/../resources/lang/'));
|
|
|
|
$this->loadJsonTranslationsFrom($langPath);
|
|
}
|
|
|
|
if ($this->package->hasViews) {
|
|
$this->loadViewsFrom($this->package->basePath('/../resources/views'), $this->package->viewNamespace());
|
|
}
|
|
|
|
foreach ($this->package->viewComponents as $componentClass => $prefix) {
|
|
$this->loadViewComponentsAs($prefix, [$componentClass]);
|
|
}
|
|
|
|
if (count($this->package->viewComponents)) {
|
|
$this->publishes([
|
|
$this->package->basePath('/Components') => base_path("app/View/Components/vendor/{$this->package->shortName()}"),
|
|
], "{$this->package->name}-components");
|
|
}
|
|
|
|
if ($this->package->publishableProviderName) {
|
|
$this->publishes([
|
|
$this->package->basePath("/../resources/stubs/{$this->package->publishableProviderName}.php.stub") => base_path("app/Providers/{$this->package->publishableProviderName}.php"),
|
|
], "{$this->package->shortName()}-provider");
|
|
}
|
|
|
|
|
|
foreach ($this->package->routeFileNames as $routeFileName) {
|
|
$this->loadRoutesFrom("{$this->package->basePath('/../routes/')}{$routeFileName}.php");
|
|
}
|
|
|
|
foreach ($this->package->sharedViewData as $name => $value) {
|
|
View::share($name, $value);
|
|
}
|
|
|
|
foreach ($this->package->viewComposers as $viewName => $viewComposer) {
|
|
View::composer($viewName, $viewComposer);
|
|
}
|
|
|
|
$this->packageBooted();
|
|
|
|
return $this;
|
|
}
|
|
|
|
public static function generateMigrationName(string $migrationFileName, Carbon $now): string
|
|
{
|
|
$migrationsPath = 'migrations/' . dirname($migrationFileName) . '/';
|
|
$migrationFileName = basename($migrationFileName);
|
|
|
|
$len = strlen($migrationFileName) + 4;
|
|
|
|
if (Str::contains($migrationFileName, '/')) {
|
|
$migrationsPath .= Str::of($migrationFileName)->beforeLast('/')->finish('/');
|
|
$migrationFileName = Str::of($migrationFileName)->afterLast('/');
|
|
}
|
|
|
|
foreach (glob(database_path("{$migrationsPath}*.php")) as $filename) {
|
|
if ((substr($filename, -$len) === $migrationFileName . '.php')) {
|
|
return $filename;
|
|
}
|
|
}
|
|
|
|
return database_path($migrationsPath . $now->format('Y_m_d_His') . '_' . Str::of($migrationFileName)->snake()->finish('.php'));
|
|
}
|
|
|
|
public function registeringPackage()
|
|
{
|
|
}
|
|
|
|
public function packageRegistered()
|
|
{
|
|
}
|
|
|
|
public function bootingPackage()
|
|
{
|
|
}
|
|
|
|
public function packageBooted()
|
|
{
|
|
}
|
|
|
|
protected function getPackageBaseDir(): string
|
|
{
|
|
$reflector = new ReflectionClass(get_class($this));
|
|
|
|
return dirname($reflector->getFileName());
|
|
}
|
|
|
|
public function packageView(?string $namespace)
|
|
{
|
|
return is_null($namespace) ? $this->package->shortName() : $this->package->viewNamespace;
|
|
}
|
|
}
|