halestar/dicms-blogger

halestar/laravel-drop-in-cms 的插件,为 CMS 添加博客功能。

安装: 11

依赖项: 0

建议者: 0

安全性: 0

星标: 0

关注者: 1

分支: 0

开放问题: 0

语言:Blade

类型:插件

0.4.0 2024-08-11 23:55 UTC

This package is auto-updated.

Last update: 2024-09-12 00:09:10 UTC


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\DiCmsPluginhalestar\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): boolpublic 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脚本、页眉和页脚
  • 预览系统
  • 完成插件文档的编写
  • 更好地执行政策。

其他可能被添加到这个列表中,或者被移除。