thomascombe/laravel-package-tools

Laravel 包创建工具

1.7.1 2021-04-21 19:09 UTC

README

Latest Version on Packagist Tests Total Downloads

此包包含一个 PackageServiceProvider,您可以在您的包中使用它轻松注册配置文件、迁移等。

以下是如何使用它的示例。

use Spatie\LaravelPackageTools\PackageServiceProvider;
use Spatie\LaravelPackageTools\Package;
use MyPackage\ViewComponents\Alert;

class YourPackageServiceProvider extends PackageServiceProvider
{
    public function configurePackage(Package $package): void
    {
        $package
            ->name('your-package-name')
            ->hasConfigFile()
            ->hasViews()
            ->hasViewComponent('spatie', Alert::class)
            ->hasViewComposer('*', MyViewComposer::class)
            ->sharesDataWithAllViews('downloads', 3)
            ->hasTranslations()
            ->hasAssets()
            ->hasRoute('web')
            ->hasMigration('create_package_tables')
            ->hasCommand(YourCoolPackageCommand::class);
    }
}

在底层,它将执行必要的操作来注册必要的事物并使各种文件可发布。

支持我们

我们在创建 最佳开源包 上投入了大量资源。您可以通过 购买我们的付费产品之一 来支持我们。

我们非常感谢您从家乡给我们寄来明信片,说明您正在使用我们的哪个(些)包。您可以在 我们的联系页面 上找到我们的地址。我们将把所有收到的明信片发布在 我们的虚拟明信片墙上

入门指南

此包对您应如何构建包有自己的看法。为了轻松开始,请考虑使用 我们的 package-skeleton 仓库 来开始您的包。该骨架结构完美,可以与此包中的 PackageServiceProvider 配合使用。

用法

在您的包中,您应该让您的服务提供程序扩展 Spatie\LaravelPackageTools\PackageServiceProvider

use Spatie\LaravelPackageTools\PackageServiceProvider;
use Spatie\LaravelPackageTools\Package;

class YourPackageServiceProvider extends PackageServiceProvider
{
    public function configurePackage(Package $package) : void
    {
        $package->name('your-package-name');
    }
}

将包名称传递到 name 是强制性的。

处理配置文件

要注册配置文件,您应该在您的包的 config 目录中创建一个以您的包名称命名的 php 文件。在此示例中,它应该在 <package root>/config/your-package-name.php

如果您的包名称以 laravel- 开头,我们期望您的配置文件不包含该前缀。因此,如果您的包名称是 laravel-cool-package,则配置文件应命名为 cool-package.php

要注册该配置文件,请在 configurePackage 方法中调用 $package 上的 hasConfigFile

$package
    ->name('your-package-name')
    ->hasConfigFile();

hasConfigFile 方法还将使配置文件可发布。您的包的用户将能够使用此命令发布配置文件。

php artisan vendor:publish --tag=your-package-name-config

处理视图

您的包提供的任何视图都应放置在 <package root>/resources/views 目录中。

您可以使用 hasViews 命令注册这些视图。

$package
    ->name('your-package-name')
    ->hasViews();

这将注册您的视图与 Laravel。

如果您有一个视图 <package root>/resources/views/myView.blade.php,您可以使用它如下: view('your-package-name::myView')。当然,您也可以使用子目录来组织您的视图。位于 <package root>/resources/views/subdirectory/myOtherView.blade.php 的视图可以使用 view('your-package-name::subdirectory.myOtherView') 使用。

调用 hasViews 还将使视图可发布。您的包的用户将能够使用此命令发布视图。

php artisan vendor:publish --tag=your-package-name-views

与视图共享全局数据

您可以使用 sharesDataWithAllViews 方法与所有视图共享数据。这将使共享变量对所有视图可用。

$package
    ->name('your-package-name')
    ->sharesDataWithAllViews('companyName', 'Spatie');

处理 Blade 视图组件

您的包提供的任何 Blade 视图组件都应放置在 <package root>/Components 目录中。

您可以使用 hasViewComponents 命令注册这些视图。

$package
    ->name('your-package-name')
    ->hasViewComponents('spatie', [Alert::class]);

这将使用Laravel注册您的视图组件。对于Alert::class,您可以在视图中使用<x-spatie-alert />进行引用,其中spatie是在注册过程中提供的命名空间前缀。

调用hasViewComponents也将使视图组件可发布,并将发布到app/Views/Components/vendor/<包名>

您的包的用户将能够使用此命令发布视图组件

php artisan vendor:publish --tag=your-package-name-components

与视图组合器一起工作

您可以使用hasViewComposers方法注册项目中使用的任何视图组合器。您也可以注册一个接收$view参数的回调,而不是类名。

要注册所有视图的组合器,请使用通配符作为视图名称'*'

$package
    ->name('your-package-name')
    ->hasViewComposer('viewName', MyViewComposer::class)
    ->hasViewComposer('*', function($view) { 
        $view->with('sharedVariable', 123); 
    });

处理翻译

您包提供的任何翻译应放置在<包根目录>/resources/lang/<语言代码>目录中。

您可以使用hasTranslations命令注册这些翻译。

$package
    ->name('your-package-name')
    ->hasTranslations();

这将注册翻译以供Laravel使用。

假设您将此翻译文件保存在<包根目录>/resources/lang/en/translations.php...

<?php

return [
    'translatable' => 'translation',
];

...您的包和用户可以使用以下方式检索翻译

trans('your-package-name::translations.translatable'); // returns 'translation'

如果您的包名以laravel-开头,那么在上面的示例中应该去掉它。

调用hasTranslations也将使翻译可发布。您的包的用户将能够使用此命令发布翻译

php artisan vendor:publish --tag=your-package-name-translations

处理资产

您的包提供的任何资产应放置在<包根目录>/resources/dist/目录中。

您可以使用hasAssets方法使这些资产可发布。

$package
    ->name('your-package-name')
    ->hasAssets();

您的包的用户将能够使用此命令发布资产

php artisan vendor:publish --tag=your-package-name-assets

这将把资产复制到您的包安装的应用程序中的public/vendor/<您的包名>目录。

处理迁移

PackageServiceProvider假设任何迁移都放置在这个目录中:<包根目录>/database/migrations。在该目录内,您可以放置任何迁移。确保它们都有php.stub扩展名。使用此扩展名将确保静态分析器不会在迁移发布时混淆存在于多个位置中的类。

要注册您的迁移,您应该将不带扩展名的名称传递给hasMigration表。

如果您的迁移文件名为create_my_package_tables.php.stub,您可以这样注册它们

$package
    ->name('your-package-name')
    ->hasMigration('create_my_package_tables');

如果您的包包含多个迁移文件,您只需多次调用hasMigration或使用hasMigrations

$package
    ->name('your-package-name')
    ->hasMigrations(['my_package_tables', 'some_other_migration']);

调用hasMigration也将使迁移可发布。您的包的用户将能够使用此命令发布迁移

php artisan vendor:publish --tag=your-package-name-migrations

正如您可能期望的那样,发布的迁移文件将使用当前日期和时间作为前缀。

注册命令

您可以使用hasCommand函数注册您的包提供的任何命令。

$package
    ->name('your-package-name')
    ->hasCommand(YourCoolPackageCommand::class);

如果您的包提供多个命令,您可以使用多次hasCommand,或者将数组传递给hasCommands

$package
    ->name('your-package-name')
    ->hasCommands([
        YourCoolPackageCommand::class,
        YourOtherCoolPackageCommand::class,
    ]);

处理路由

PackageServiceProvider假设任何路由文件都放置在这个目录中:<包根目录>/routes。在该目录内,您可以放置任何路由文件。

要注册您的路由,您应该将不带扩展名的名称传递给hasRoute方法。

如果您的路由文件名为web.php,您可以这样注册它们

$package
    ->name('your-package-name')
    ->hasRoute('web');

如果您的包包含多个路由文件,您只需多次调用hasRoute或使用hasRoutes

$package
    ->name('your-package-name')
    ->hasRoutes(['web', 'admin']);

使用生命周期钩子

您可以将任何自定义逻辑放在这些方法之一中,以便在启动时使用

  • registeringPackage:将在 PackageServiceProviderregister 方法开始时调用
  • packageRegistered:将在 PackageServiceProviderregister 方法结束时调用
  • bootingPackage:将在 PackageServiceProviderboot 方法开始时调用
  • packageBooted:将在 PackageServiceProviderboot 方法结束时调用

测试

composer test

变更日志

有关最近变更的更多信息,请参阅变更日志

贡献

有关详细信息,请参阅贡献指南

安全漏洞

请查看我们的安全策略了解如何报告安全漏洞。

鸣谢

许可证

MIT 许可证 (MIT)。有关更多信息,请参阅许可证文件