halestar / dicms-blogger
halestar/laravel-drop-in-cms 的插件,为 CMS 添加博客功能。
Requires
- halestar/laravel-drop-in-cms: ^0.4.0
README
Laravel Drop-In 内容管理系统的一个插件
这是 DiCMS(Laravel Drop-In 内容管理系统)的第一个插件,旨在展示如何创建插件,并提供一个非常简单的博客附加组件,允许用户创建和更新博客文章。这不是一个功能齐全的博客系统,而是一个简单的项目,用于展示在 DiCMS 中如何处理插件。
目录
安装
安装假设您
- 有一个正在使用的 Laravel 项目,
- 您的项目中已安装 DiCMS。
一旦满足这些要求,您可以通过执行以下命令安装插件
composer require halestar/dicms-blogger
接下来,通过以下操作发布供应商文件
php artisan vendor:publish --provider=halestar\DiCmsBlogger\Providers\DiCmsBloggerServiceProvider
这将发布迁移文件和配置文件。在运行迁移之前,打开配置文件并查看初始配置。此时您可以更改的唯一内容是 table_prefix
选项,如果您想自定义 CMS 表的表名。一旦满意,运行
php artisan migrate
最后,前往您的 config/dicms.php
文件,并将以下策略添加到您的策略列表中
'policies' =>
[
...
\halestar\DiCmsBlogger\Models\BlogPost::class => \halestar\DiCmsBlogger\Policies\BlogPostPolicy::class,
],
并通过将条目添加到插件部分来启用插件
'plugins' =>
[
\halestar\DiCmsBlogger\DiCmsBlogger::class,
]
就这么多!完成这些后,“博客”菜单项将出现在您的 DiCMS 管理控制台中。
配置
博客的配置完全通过“博客”菜单项中的设置选项完成。您会注意到所有这些设置都是直接附加到显示模板中元素的简单 HTML。目的是使其尽可能简单。
还有一个单独的策略项,\halestar\DiCmsBlogger\Policies\BlogPostPolicy::class
,它定义了整个插件所需的所有权限。您可以扩展它以获得更好的权限。
构建插件
本节将解释如何构建此插件,以希望给您提供构建自己插件的想法。这个‘教程’假设您对Laravel 包开发有一定了解。如果您不了解,我强烈建议阅读Farhan Hasin Chowdhury 的这个精彩的教程,这是我学习很多知识的地方。
插件接口
构建插件包括实现两个接口:halestar\LaravelDropInCms\Plugins\DiCmsPlugin
和 halestar\LaravelDropInCms\Plugins\DiCmsPluginHome
。这些是 DiCMS 施加的唯一两个要求。您可以添加任何其他您想要的,包括迁移、控制器、策略、视图、资源等。DiCMS 只会关注这两个实现接口的类。
让我们看看这些接口以及我们如何创建自己的插件。为了这个例子,我将创建这个插件,DiCmsBlogger。主要的插件定义是通过实现接口 halestar\LaravelDropInCms\Plugins\DiCmsPlugin
来完成的。让我们看看这个接口。
interface DiCmsPlugin
{
public static function adminRoutes(): void;
public static function hasPublicRoute($path): bool;
public static function getPublicContent($path): string;
public static function getPublicPages(): array;
public static function getEntryPoint(): DiCmsPluginHome;
public static function getBackUpableTables(): array;
}
您应该阅读此文件以了解其文档,但我们将简要介绍一些基本内容。
public static function adminRoutes(): void;
这可能是你首先构建的,因为它包含了你希望在插件中定义的所有管理路由。我 强烈建议你将所有管理路由包裹在一个前缀和一个名称中,以区分其他可能使用的CMS或插件。你可以通过以下方式包裹所有路由来实现
Route::prefix('blog')
->name('blog.')
->group(function ()
{
//your routes go here
});
接下来,让我们看看方法 public static function hasPublicRoute($path): bool
和 public static function getPublicContent($path): string
,因为它们都执行类似的功能。这两个方法将由FrontController调用,该控制器负责提供CMS内容。该控制器首先查找活动站点,然后查看提供的路径是否与任何内部页面匹配。如果不匹配,则它将遍历所有插件,并将整个路径(除起始的'/'外)传递给方法 public static function hasPublicRoute($path): bool
,如果路径与插件使用的内部路径匹配,则返回true,否则返回false。
在我的插件中,我会检查用户是否试图访问 /blogs 或 /blogs/,并将他们重定向到所有博客文章的列表。如果之后还有更多内容,我会检查文章的任何slugs是否与博客之后的内容匹配。如果找到匹配项,则返回true,否则返回false,然后调用下一个插件。
如果前一个方法返回true,则调用方法 public static function getPublicContent($path): string
,并使用相同的路径。返回的字符串将被直接粘贴到前端模板中。有一个专门用于插件的模板。目前,它从网站的默认模板填充标题和页脚。但最终它将允许插件执行相同操作。
接下来是 public static function getPublicPages(): array
,它实际上是一个包含 halestar\LaravelDropInCms\Plugins\DiCmsPluginPage
对象的数组。DiCmsPluginPage
对象是一个非常简单的对象,它接受一个名称和一个URL。此方法的目的为DiCms提供一个通过插件可用的页面列表。
例如,我想要列出页面 /blog 作为所有博客文章的列表。此页面应命名为“博客”。因此,我返回一个包含单个 DiCmsPluginPage
对象的数组,该对象以“博客”为名称,以“blog”为URL(注意没有前面的斜杠!)。现在,将有一个名为“博客”的“插件页面”,您可以将其设置为网站的首页或添加到菜单中。
我将在备份部分稍后介绍 public static function getBackUpableTables(): array;
,这留下了最后一个方法,public static function getEntryPoint(): DiCmsPluginHome
。此方法简单返回我们创建的另一个类的实例,该类实现了 halestar\LaravelDropInCms\Plugins\DiCmsPluginHome
。让我们看看这个接口
interface DiCmsPluginHome
{
public function getAdminUrl(): string;
public function getPluginMenuName(): string;
public function getPolicyModel(): string;
public function getRoutePrefix(): string;
}
这个类背后的思想是为你的插件建立一个“入口点”。你应该阅读每个方法的官方代码文档,但它们非常简单。
你的插件将在顶部获得一个菜单项。此菜单项的名称是由 public function getPluginMenuName(): string
方法返回的字符串,并且是 public function getAdminUrl(): string
方法提供的URL字符串的链接。
当当前URL的基本匹配由 'public function getRoutePrefix(): string' 返回的字符串时,菜单项知道它是活动的(它位于你的插件内容中)。实际的菜单项被 @can('view any', $plugin::getPolicyModel())
包围,这意味着 public function getPolicyModel(): string
方法返回的 模型 将用于权限检查。
请注意,这不仅仅是策略对象,而是策略对象的模型。
因此,你的插件可能有多个模型和多个针对这些模型的策略。该方法返回在授予访问你的插件之前检查的模型。
服务容器
模型和迁移
您的管理区域
备份
1.0 版本路线图
在撰写本文时,这个包并不是我所说的“发布版”。我的计划是在所有功能都构建完毕后,正式发布为v1.0版本。这里的空间是为了详细说明我认为发布v1.0版本所必需的功能和升级。
这些需求可能会变化(实际上,很可能会有变化),我会在构建过程中划掉它们(可能)。我计划将稳定的版本保持为奇数版本,使用偶数版本作为开发、不稳定版本的发布。例如,第一个发布版本(被认为是稳定的,我知道)是v0.1.0,最新的版本设置为v0.1.3。一旦所有这些新指令都编写并发布,我将为DiCms和Blogger插件创建一个v0.3.0版本。
以下功能需要在发布v1.0版本前实现
- 需要清理界面
- 帖子需要可存档
日期应该是发布日期,而不是创建日期。更好的资产管理。能够添加自定义的CSS/JS脚本、页眉和页脚- 预览系统
- 完成插件文档的编写
- 更好地执行政策。
其他可能被添加到这个列表中,或者被移除。