首页 > 解决方案 > 如何覆盖 PyroCMS(Laravel,PHP)中的模型类?

问题描述

我安装了PyroCMS并将其扩展为一个学习管理系统(LMS),只有登录的用户可以查看页面,并且页面也只能在用户注册课程后的可变天数开始查看.

(即,模块 1 的第 1 课可以解锁并立即可见,但第 2 课可以配置为隐藏到 1 天后,第 3 课可能会在 X 天后变得可见,等等)

我是如何通过这个迁移编写一个 Laravel 包来实现这一点的:

Schema::table('pages_pages', function (Blueprint $table) {
    $table->string('drip_delay')->nullable()->after('str_id');
});

然后我在函数中创建了一个DrippablePagesServiceProvider类:boot()

$this->app->bind('Anomaly\PagesModule\Http\Controller\PagesController', 'me\DrippablePages\PagesController'); //https://laravel.com/docs/5.6/container#binding     

我将自定义设计PagesController为在登录用户过早尝试访问页面时显示特殊视图。此功能一切正常。

但是drip_delay,与其像我一直在做的那样直接在数据库中编辑该字段,我更希望能够在 /admin/pages/edit/4 URL 的其他字段旁边进行编辑。

我很确定我需要覆盖 PagesModule 的各个部分例如 PageEntryFormSections ( doc )。我想我有这个工作。

但是当逐步使用 Xdebug 时,我看到在此行中查找的 PageModel (通过依赖注入?†)仍然没有显示我的新edit()字段。Http\Controller\Admin\PagesControllerdrip_delay

如何覆盖 PageModel 或做任何我需要做的事情,以便drip_delay在此管理面板视图中显示该字段?

† 关于容器控制器的 Laravel 文档暗示了这一点。

标签: phplaraveleloquentpyrocms

解决方案


要首先覆盖模型,您需要一个新模型来扩展您要覆盖的模型:

<?php namespace Ryan\ExtenderModule\Post;

class PostModel extends \Anomaly\PostsModule\Post\PostModel
{

}

然后在里面ServiceProvider你需要把它颠倒过来:

<?php namespace Ryan\ExtenderModule;

use Anomaly\PostsModule\Post\PostModel;
use Anomaly\Streams\Platform\Addon\AddonServiceProvider;

class ExtenderModuleServiceProvider extends AddonServiceProvider
{
    protected $bindings = [
        PostModel::class => \Ryan\ExtenderModule\Post\PostModel::class,
    ];
}

就这样。祝你好运 ))


推荐阅读