geeksceo / laravel-project-builder
构建通常的 Laravel 项目
Requires
- tcg/voyager: 1.6.x-dev
Requires (Dev)
- orchestra/testbench: ^7.0
- phpunit/phpunit: 9.6.x-dev
This package is auto-updated.
Last update: 2024-09-27 19:45:45 UTC
README
此包包含一个 InitServiceProvider
,您可以在您的包中使用它来轻松注册配置文件、迁移等。
以下是如何使用它的示例。
use Illuminate\Support\ServiceProvider; use ZDSLab\Init\Console\InitProject; class InitServiceProvider extends ServiceProvider { /** * Bootstrap services. * * @return void */ public function boot() { // Register the command if we are using the application via the CLI if ($this->app->runningInConsole()) { $this->commands([ InitProject::class ]); // config file $this->publishes([ __DIR__.'/../config/config.php' => config_path('init.php'), ], 'config' ); } $this->loadMigrationsFrom(__DIR__ . '/../database/migrations'); // $this->loadRoutesFrom(__DIR__.'/../routes/web.php'); // $this->loadViewsFrom(__DIR__.'/../resources/views', 'init'); } public function register() { $this->mergeConfigFrom(__DIR__.'/../config/config.php', 'init'); /* $this->registerPublishables(); $this->loadHelpers(); */ } private function registerPublishables() { /* $publishablePath = dirname(__DIR__).'/publishable'; $publishable = [ 'login-assets' => [ "{$publishablePath}/login-assets/" => app_path('public'), ] ]; foreach ($publishable as $group => $paths) { $this->publishes($paths, $group); } */ } protected function loadHelpers() { /* foreach (glob(__DIR__.'/Helpers/*.php') as $filename) { require_once $filename; } */ } }
在内部,它将执行必要的操作来注册所需的项目,并使各种文件可发布。
入门
关于如何使用我们的实现构建您的 Laravel 项目,此包有一些看法。
用法
在您的包中,您应该让您的服务提供程序扩展 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
如果您的包有多个配置文件,您可以将它们的名称作为数组传递给 hasConfigFile
$package ->name('your-package-name') ->hasConfigFile(['my-config-file', 'another-config-file']);
处理视图
您的包提供的任何视图都应放在 <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
方法。
$package ->name('your-package-name') ->hasViews('custom-view-namespace');
现在您可以使用包的视图如下
view('custom-view-namespace::myView');
发布视图
调用 hasViews
也会使视图可发布。您的包的用户可以使用此命令发布视图
php artisan vendor:publish --tag=your-package-name-views
注意
如果您使用自定义视图命名空间,则应将发布命令更改为如下
php artisan vendor:publish --tag=custom-view-namespace-views
与视图共享全局数据
您可以使用 sharesDataWithAllViews
方法与所有视图共享数据。这将使共享变量对所有视图可用。
$package ->name('your-package-name') ->sharesDataWithAllViews('companyName', 'Spatie');
处理 Blade 视图组件
您的包提供的任何 Blade 视图组件都应放在 <package root>/src/Components
目录中。
您可以使用 hasViewComponents
命令注册这些视图。
$package ->name('your-package-name') ->hasViewComponents('spatie', Alert::class);
这将注册您的视图组件到 Laravel。在 Alert::class
的情况下,它可以在视图中引用为 <x-spatie-alert />
,其中 spatie
是您在注册期间提供的前缀。
调用 hasViewComponents
也会使视图组件可发布,并将发布到 app/Views/Components/vendor/<package name>
。
您的包的用户可以使用此命令发布视图组件
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); });
与翻译协同工作
您提供的任何翻译应放置在 <package root>/resources/lang/<language-code>
目录中。
您可以使用 hasTranslations
命令来注册这些翻译。
$package ->name('your-package-name') ->hasTranslations();
这将注册翻译到 Laravel。
假设您将此翻译文件保存在 <package root>/resources/lang/en/translations.php
...
return [ 'translatable' => 'translation', ];
...您的包和用户可以通过以下方式检索翻译
trans('your-package-name::translations.translatable'); // returns 'translation'
如果您的包名称以 laravel-
开头,那么您应该在上述示例中省略它。
以翻译字符串作为键进行编码时,您应在 <package root>/resources/lang/<language-code>.json
中创建 JSON 文件。
例如,创建如下所示的 <package root>/resources/lang/it.json
文件
{ "Hello!": "Ciao!" }
...的输出将为...
trans('Hello!');
...如果应用程序使用意大利语,输出将为 Ciao!
调用 hasTranslations
也将使翻译可发布。您的包的用户可以通过此命令发布翻译
php artisan vendor:publish --tag=your-package-name-translations
与资产协同工作
您提供的任何资产应放置在 <package root>/resources/dist/
目录中。
您可以使用 hasAssets
方法使这些资产可发布。
$package ->name('your-package-name') ->hasAssets();
您的包的用户可以通过此命令发布资产
php artisan vendor:publish --tag=your-package-name-assets
这将把资产复制到应用程序中您的包安装位置的 public/vendor/<your-package-name>
目录。
与迁移协同工作
PackageServiceProvider
假设任何迁移都放置在这个目录中: <package root>/database/migrations
。在该目录中,您可以放置任何迁移。
要注册您的迁移,您应该将不带扩展名的迁移名称传递给 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
如您所期望的,已发布的迁移文件将带有当前日期和时间的前缀。
您还可以启用迁移,使其在没有需要您的包的用户发布它们的情况下注册
$package ->name('your-package-name') ->hasMigrations(['my_package_tables', 'some_other_migration']) ->runsMigrations();
与可发布的服务提供器协同工作
一些包需要将示例服务提供器复制到 Laravel 应用的 app\Providers
目录中。例如,laravel/horizon
包将一个 HorizonServiceProvider
复制到您的应用中,并设置了一些合理的默认值。
$package ->name('your-package-name') ->publishesServiceProvider($nameOfYourServiceProvider);
将被复制到应用的文件应存储在您的包中 /resources/stubs/{$nameOfYourServiceProvider}.php.stub
。
当您的包安装到应用中时,运行此命令...
php artisan vendor:publish --tag=your-package-name-provider
...将您的包中的 /resources/stubs/{$nameOfYourServiceProvider}.php.stub
复制到用户的 app/Providers/{$nameOfYourServiceProvider}.php
。
注册命令
您可以使用 hasCommand
函数注册您包提供的任何命令。
$package ->name('your-package-name') ->hasCommand(YourCoolPackageCommand::class);
如果您的包提供了多个命令,您可以使用 hasCommand
多次,或者将数组传递给 hasCommands
$package ->name('your-package-name') ->hasCommands([ YourCoolPackageCommand::class, YourOtherCoolPackageCommand::class, ]);
添加安装命令
而不是让您的用户手动发布配置文件、迁移和其他文件,您可以选择添加一个安装命令,一次完成所有这些工作。像 Laravel Horizon 和 Livewire 这样的包提供了这样的命令。
当使用 Laravel Package Tools 时,您不需要自己编写 InstallCommand
。相反,您只需调用 hasInstallCommand
并使用闭包进行配置。以下是一个示例。
use Spatie\LaravelPackageTools\PackageServiceProvider; use Spatie\LaravelPackageTools\Package; use Spatie\LaravelPackageTools\Commands\InstallCommand; class YourPackageServiceProvider extends PackageServiceProvider { public function configurePackage(Package $package): void { $package ->name('your-package-name') ->hasConfigFile() ->hasMigration('create_package_tables') ->publishesServiceProvider('MyServiceProviderName') ->hasInstallCommand(function(InstallCommand $command) { $command ->publishConfigFile() ->publishMigrations() ->askToRunMigrations() ->copyAndRegisterServiceProviderInApp() ->askToStarRepoOnGitHub('your-vendor/your-repo-name') }); } }
有了这个,包的用户可以调用此命令
php artisan your-package-name:install
使用上面的代码,该命令将会
- 发布配置文件
- 发布迁移文件
- 将
/resources/stubs/MyProviderName.php.stub
从你的包复制到app/Providers/MyServiceProviderName.php
,并在config/app.php
中注册该服务提供者 - 询问是否现在运行迁移
- 提示用户在浏览器中打开
https://github.com/'your-vendor/your-repo-name'
以便进行星标
您还可以在 InstallCommand
上调用 startWith
和 endWith
。它们将在运行 php artisan your-package-name:install
时分别执行开始和结束操作。您可以使用此功能执行额外工作或显示额外输出。
use use Spatie\LaravelPackageTools\Commands\InstallCommand; public function configurePackage(Package $package): void { $package // ... configure package ->hasInstallCommand(function(InstallCommand $command) { $command ->startWith(function(InstallCommand $command) { $command->info('Hello, and welcome to my great new package!') }) ->publishConfigFile() ->publishMigrations() ->askToRunMigrations() ->copyAndRegisterServiceProviderInApp() ->askToStarRepoOnGitHub('your-vendor/your-repo-name') ->endWith(function(InstallCommand $command) { $command->info('Have a great day!'); }) }); }
处理路由
PackageServiceProvider
假设任何路由文件都放置在这个目录中:<package root>/routes
。在该目录内,您可以放置任何路由文件。
要注册您的路由,您应该将不带扩展名的路由名传递给 hasRoute
方法。
如果您的路由文件名为 web.php
,您可以这样注册它们
$package ->name('your-package-name') ->hasRoute('web');
如果您的包包含多个路由文件,您可以多次调用 hasRoute
或使用 hasRoutes
。
$package ->name('your-package-name') ->hasRoutes(['web', 'admin']);
使用生命周期钩子
您可以将任何自定义逻辑放在这些方法之一中,以便在启动时执行
registeringPackage
:将在PackageServiceProvider
的register
方法开始时调用packageRegistered
:将在PackageServiceProvider
的register
方法结束时调用bootingPackage
:将在PackageServiceProvider
的boot
方法开始时调用packageBooted
:将在PackageServiceProvider
的boot
方法结束时调用
测试
composer test
更新日志
请参阅 更新日志 了解最近更改的信息。
贡献
请参阅 贡献指南 了解详细信息。
安全漏洞
请参阅 我们的安全策略 了解如何报告安全漏洞。
致谢
许可
MIT 许可证 (MIT)。请参阅 许可文件 了解更多信息。