在自定义 cms 中创建像 WordPress 这样的小部件

ktm*_*ktm 0 php laravel-5

我想在我的自定义 cms 上创建最新的帖子小部件等,例如在 WordPress 中,任何从哪里开始的建议都会很棒

Mat*_*son 5

WordPress 中的小部件基本上是可以“挂钩”到主题中特定位置的对象。我想说,Laravel 中最相似的机制是Events

无论您希望小部件出现在 CMS 中的哪个位置,您都可以触发一个事件,说“WidgetsGoHere”,然后将该事件的响应插入到您的视图中。

然后,我可能会为每个小部件创建一个Event Subscriber类(并且可能是 Widget 的基类,所有小部件都可以从中继承有用的代码。)事件订阅者将监听 WidgetsGoHere 事件,然后构建它需要的任何输出——一堆 HTML,大概 - 并将其作为响应返回。触发事件的代码然后将输出响应。

在 WordPress 中,主题或插件将其使用的任何小部件注册为主题或插件启动代码的一部分。如果您还没有为您的 CMS 开发插件或主题,您可能需要添加一些代码(可能在“开始”中)来创建您的小部件并让它们监听事件。您可以先对它们进行硬编码,然后在一切正常后转移到更动态的系统。

这是一个非常简单的工作示例。我们将创建三个“小部件”。从标准安装 Laravel 开始。然后,app\Providers\EventServiceProvider.php$listen那里编辑和更改变量,如下所示:

protected $listen = [
    'App\Events\WantWidgets' => [
        'App\Handlers\WidgetOne',
        'App\Handlers\WidgetTwo',
        'App\Handlers\WidgetThree',
    ],
];
Run Code Online (Sandbox Code Playgroud)

保存,然后运行 ​​artisan 命令php artisan event:generate。这将读取我们刚刚提供的配置并创建一个名为的事件WantWidgets和三个不同的事件侦听器,这将是我们的三个小部件。您应该能够在app\Events和 中看到新类app\Handlers

然后,进行更改,WelcomeController.php以便WelcomeController索引页面触发事件并将其获得的响应传递回其视图:

public function index()
{
    $widgets = Event::fire(new \App\Events\WantWidgets);
    return view('welcome')->with('widgets', $widgets);
}
Run Code Online (Sandbox Code Playgroud)

在视图 ( resources\views\welcome.blade.php) 中获取您现在传递的“小部件”并输出它们:

<ul>
    @foreach ($widgets as $widget)
        <li>{{ $widget}}</li>
    @endforeach
</ul>
Run Code Online (Sandbox Code Playgroud)

如果您现在启动 Web 应用程序,您会发现您没有得到非常有趣的东西,因为“小部件”当前没有输出任何内容。您至少应该看到三个列表项点。

现在,更改“小部件”以返回某些内容。例如,编辑app\Handlers\WidgetOne.php使其handle方法返回一个简单的字符串:

public function handle(WantWidgets $event)
{
    return "I could be a widget when I grow up";
}
Run Code Online (Sandbox Code Playgroud)

当您刷新页面时,您应该会看到该字符串作为列表项之一。

这类似于 WordPress 小部件系统的工作方式——在页面中您希望小部件出现的位置,您触发一个事件。小部件“注册”到该事件并“绘制”自己,此时将 HTML 输出到页面。

这应该让你开始。几乎所有关于这方面的内容都可以改进。例如,您的小部件可能使用自己的刀片模板将其 HTML 呈现为字符串并返回该字符串。