包开发
建议编辑⚠️ 注意: 本节仍在开发中,尚未完全准备好使用。🚧
可能缺乏完整的信息或包含不准确之处。如果您不是爱好者或经验丰富的用户,建议等到本节完成并验证后再依赖此处提供的信息。我们会尽快更新以确保本节完整准确。感谢您的耐心和理解。
包服务提供者
在 Laravel 中,服务提供者是一个关键组件,用于设置和配置包的各种功能。 Orchid 包也需要一个服务提供者来与您的 Laravel 应用集成。
初学者注意: 请注意,Orchid 文档页面主要侧重于展示 Orchid 平台的使用和功能。 它不涉及创建 Composer 包、在 Packagist 上注册或基本的 Laravel 包开发等更基础的主题。 如果您是 PHP 和 Laravel 的新手,建议在深入 Orchid 文档之前,先查阅其他专门针对这些主题的初学者友好资源。↩
要了解有关 Laravel 中服务提供者及其工作原理的更多信息,您可以参考 Laravel 官方文档关于服务提供者的部分。
Orchid 包提供了自己的服务提供者,称为 Orchid\Platform\OrchidServiceProvider
。
该服务提供者扩展了核心 Laravel ServiceProvider
类,并提供了特定于 Orchid 包的附加功能。
它允许您在 Orchid 仪表板中注册菜单、权限、路由和其他功能。
要为您的包创建一个自定义服务提供者以扩展 OrchidServiceProvider
的功能,可以按照以下示例操作:
- 在您的包目录中创建一个名为
MyPackageServiceProvider.php
的新文件。 - 在
MyPackageServiceProvider
类中,扩展 Orchid 提供的OrchidServiceProvider
类:
use Orchid\Platform\OrchidServiceProvider;
class MyPackageServiceProvider extends OrchidServiceProvider
{
// 您的包特定代码在此
}
这样,您可以利用 OrchidServiceProvider
类提供的功能和方法,同时添加您自己的特定于包的自定义和配置。
定义路由
要在您的包中定义路由,请在您的服务提供者中创建一个 routes
方法。
您可以使用标准的 Laravel 路由机制通过 Router
实例注册您的路由。
use Illuminate\Routing\Router;
/**
* 定义路由设置。
*
* @param \Illuminate\Routing\Router $router
*
* @return void
*/
public function routes(Router $route): void
{
// 在此定义您的路由
$route->screen('private-route', MyPackageScreen::class)
->name('package');
}
定义权限
Laravel Orchid 提供了一个灵活的权限系统来控制对包中不同部分的访问。
要定义权限,请在您的服务提供者中重写 permissions
方法。
此方法应返回由 Orchid 包提供的 ItemPermission
实例数组。
use Orchid\Platform\ItemPermission;
/**
* 为应用注册权限。
*
* @return ItemPermission[]
*/
public function permissions(): array
{
// 在此定义您的权限
return [
ItemPermission::group('包名称')
->addPermission('platform.package.option', '查看选项')
->addPermission('platform.package.other', '查看内容'),
];
}
为每个权限指定组名、权限键和描述。
定义导航
要为您的包定义导航菜单,请在您的服务提供者中重写 menu
方法。
此方法应返回由 Orchid 包提供的 Menu
实例数组。
use Orchid\Screen\Actions\Menu;
/**
* 注册应用菜单。
*
* @return Menu[]
*/
public function menu(): array
{
// 在此定义您的菜单项
return [
Menu::make('我的包')
->icon('bs.book')
->route('package.index'),
];
}
定义资源
Laravel Orchid 允许您注册自定义资源,如样式表和脚本,可以在仪表板中包含。要注册这些资源,您需要通过重写适当的方法在您的服务提供者中定义它们。
样式表
要定义要注册的样式表,请在您的服务提供者中重写 stylesheets
方法。此方法应返回一个字符串数组,其中每个字符串代表您要包含的样式表的路径。
/**
* 定义要注册的样式表。
*
* @return string[]
*/
protected function stylesheets(): array
{
return [
'https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css', // CDN 路径
'/absolute/path/to/your/styles.css', // 绝对路径
Vite::asset('resources/css/app.css'), // Vite 资源
];
}
脚本
要定义要注册的脚本,请在您的服务提供者中重写 scripts
方法。此方法应返回一个字符串数组,其中每个字符串代表您要包含的 JavaScript 文件的路径。
/**
* 定义要注册的脚本。
*
* @return string[]
*/
protected function scripts(): array
{
return [
'https://cdn.jsdelivr.net/npm/vue@3.2.26/dist/vue.global.js', // CDN 路径
'/absolute/path/to/your/script.js', // 绝对路径
Vite::asset('resources/js/app.js'), // Vite 资源
];
}
定义图标
要在您的包中使用不同图标集的图标,您可以在服务提供者的 icons
方法中指定图标路径和前缀。
/**
* 获取图标路径和前缀。
*
* @return array
*/
public function icons(): array
{
// 在此定义您的图标集
return ['fa' => '/path/to/fontawesome'];
}
在此示例中,您可以定义不同图标集的路径和前缀。一旦注册,您可以在包的视图或组件中使用这些图标。
版本管理
在开发支持多个版本的包时,建议使用 Composer 进行版本管理。 Composer 提供了解决版本冲突的全面工具。如果由于某种原因,Composer 不适合您的项目,您可以考虑使用以下常量:
Orchid\Platform\Dashboard::version()
此常量返回当前使用版本的字符串表示形式。
扩展布局
Layouts
类是多个布局的集合;要向其添加新功能,只需在服务提供者中指定即可:
use Orchid\Screen\Layout;
use Orchid\Screen\LayoutFactory;
use Orchid\Screen\Repository;
/**
* 为 LayoutFactory 定义自定义宏。
*
* @param string $name
* @return Layout
*/
LayoutFactory::macro('hello', fn (string $name) => new class($name) extends Layout
{
/**
* 在视图中使用的名称。
*
* @var string
*/
public function __construct(
private string $name
) {}
/**
* 构建布局并返回视图。
*
* @param Repository $repository
* @return \Illuminate\View\View
*/
protected function build(Repository $repository)
{
return view('hello', ['name' => $this->name]);
}
});
然后在屏幕上调用将如下所示:
use Orchid\Support\Facades\Layout;
public function layout(): array
{
return [
Layout::hello('Alexandr Chernyaev')
];
}
扩展列
在处理相同类型的数据时,通常需要以相同的方式处理它,为了不在层中重复代码,可以使用自己的方法扩展 TD
类。为此,需要在服务提供者中注册闭包函数。
注册示例:
// AppServiceProvider.php
TD::macro('bool', function () {
$column = $this->column;
$this->render(function ($datum) use ($column) {
return view('bool',[
'bool' => $datum->$column
]);
});
return $this;
});
模板示例:
// bool.blade.php
<span class="{{ $bool ? 'text-success' : 'text-danger' }}">●</span>
使用示例:
public function grid(): array
{
return [
TD::make('status')->bool(),
];
}