/可内容

使用多态关系和特殊模块类创建动态页面

v0.0.7 2023-11-27 16:20 UTC

README

PHP Version Support GitHub Workflow Status

Laravel 内容可

⚠️ 此软件包目前处于开发阶段,尚未准备好用于生产环境。⚠️

此软件包允许通过附加 Content 动态构建模型。其主要用途是允许创建一个与 Laravel Nova (通过 Repeaters 或其他块编辑系统) 兼容的模块系统,以创建用户定义的页面。

已考虑与 Plank 生态系统中的其他软件包(如 Snapshots)保持兼容性。它还经过架构设计,允许在应用程序内显式地将模块与其他实体链接起来。

目录

 

安装

您可以通过 composer 安装此软件包

composer require plank/contentable

快速开始

安装完成后,要开始使用软件包

  1. HasContent 特性和 Contentable 接口添加到您想要附加内容的任何模型中。
  2. CanRender 特性和 Renderable 接口添加到将充当 "模块" 的任何模型中。
  3. 实现缺失的 Renderable 接口方法,特别是 renderHtml() 方法。可选地添加一个 $renderableFields 类属性,列出所有应由模块访问的字段。

配置

软件包的配置文件位于 config/contentable.php。如果您在安装期间没有发布配置文件,可以使用以下命令发布配置文件

php artisan vendor:publish --tag=contentable-config
# Be sure to run any associated migrations
php artisan migrate

 

使用

构建模块系统

Contentable 的主要目的是在保持 Renderable 模型与应用程序中任何其他任意模型之间明确关系的同时,简化页面构建器风格的体验。这使得轻松构建类似 "呼吁" 模块之类的功能成为可能,这些模块可以链接到数据库中的具体记录。

定义模块

要利用上述方法,任何与其他模块不同的模块都必须定义为它们自己的模型。例如,您可能定义一个简单的 "文本" 模块(即,页面上显示标题和正文文本的部分),如下所示

<?php

namespace App\Models;

use App\Models\Contracts\Renderable;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Plank\Contentable\Concerns\CanRender;

class TextModule extends Model implements Renderable
{
    use CanRender;
    use HasFactory;
    
    protected $guarded = ['id'];

    protected array $renderableFields = ['title', 'body'];
    
    public function renderHtml(): string
    {
        return "<h2>{$this->title}</h2>" +
                "<p>{$this->body}</p>";
    }
}

当然,还需要生成相关的迁移、工厂等...

定义可内容

一旦创建了模块,就可以将它们附加到某些 Contentable 上,例如 Page 模型,如下所示

<?php

namespace App\Models;

use App\Models\Concerns\HasContent;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Plank\Contentable\Contracts\Contentable;


class Page extends Model implements Contentable
{
    use HasContent;
    use HasFactory;

    /**
     * The attributes that aren't mass assignable.
     *
     * @var array
     */
    protected $guarded = ['id'];
    
    /**
     * Get the route key for the model.
     */
    public function getRouteKeyName(): string
    {
        return 'slug';
    }
}

此类页面现在可以附加任意数量的模块并将其渲染。这使得大多数以 Laravel 为导向的内容管理系统可以通过(多态)关系字段将模块与 Page 关联。

您甚至可以使用重复样式字段以更具编辑风格的方式构建页面的内容!

布局

布局允许用户控制页面布局上模块的 "外观装饰"。实际上,布局代表了一个 Contentable 模型(或任何其他模型)使用的模板。

布局原生支持 Blade 模板和 Inertia 页面。

当在适当的位置创建 Blade / JS 文件时,会自动创建布局。默认情况下,这些位置是 Blade 模板所在的 resources/views/layouts 或基于 Inertia 的系统中的 resources/js/Pages/Layouts

调用函数 php artisan contentable:sync 将扫描这些目录

可布局

通常,任何满足Contentable合约的模型也会希望是Layoutable的。这使用户能够完全控制页面上的显示模式。上述的Page模型可以扩展如下,以添加布局功能

use Illuminate\Database\Eloquent\Model;
use App\Models\Concerns\HasLayouts;
use Plank\Contentable\Contracts\Contentable;
use Plank\Contentable\Contracts\Layoutable;

class Page extends Model implements Contentable, Layoutable
{
    // ...
    use HasLayouts;
    
    /**
     * (Optional: Allows for layouts to be model specific)
     * Restrict the Page layouts to ones strictly in the Pages folder
     */
    protected static $globalLayouts = false;
}

Contentable提供了一个函数,使得模型实例使用其设置的布局变得简单。只需调用->layout(),并将其传递给所选的渲染函数即可。

例如

public function show(Page $page): \Illuminate\View\View
{
    return view($page->layout())->with(compact('page'));
}

 

贡献

有关详细信息,请参阅CONTRIBUTING

 

鸣谢

 

许可

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

 

安全漏洞

如果您在siren中发现安全漏洞,请发送电子邮件至security@plankdesign.com。所有安全漏洞都将得到及时处理。