如何覆盖PyroCMS中的模型类(Laravel,PHP)?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何覆盖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('AnomalyPagesModuleHttpControllerPagesController', 'meDrippablePagesPagesController'); //https://laravel.com/docs/5.6/container#binding     

我设计了我的自定义PagesController,以便在登录用户尝试过早访问页面时显示特殊视图。这个功能完全正常。

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

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

但是当使用Xdebug时,我看到在this line中的edit()中查看HttpControllerAdminPagesController(通过依赖注入?†)的PageModel仍然没有显示我的新drip_delay字段。

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

†Laravel关于containercontrollers的文档暗示了这一点。

答案

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

<?php namespace RyanExtenderModulePost;

class PostModel extends AnomalyPostsModulePostPostModel
{

}

然后在ServiceProvider里面你需要将它绑定:

<?php namespace RyanExtenderModule;

use AnomalyPostsModulePostPostModel;
use AnomalyStreamsPlatformAddonAddonServiceProvider;

class ExtenderModuleServiceProvider extends AddonServiceProvider
{
    protected $bindings = [
        PostModel::class => RyanExtenderModulePostPostModel::class,
    ];
}

就这样。祝好运 ))

以上是关于如何覆盖PyroCMS中的模型类(Laravel,PHP)?的主要内容,如果未能解决你的问题,请参考以下文章

laravel 如何呈现模型数据

Laravel 5.7 - 覆盖请求验证类中的 all() 方法以验证路由参数?

Laravel 8 基于类的模型工厂

如何使用模型类在 laravel 8 资源控制器中编辑、销毁和获取单个值?

如何使控制器数据覆盖 Laravel 中的视图控制器?

Laravel/Eloquent 建议覆盖 trait 属性?