【问题标题】:Dynamically Extending a Model with a static method使用静态方法动态扩展模型
【发布时间】:2017-01-11 18:55:05
【问题描述】:

在我开发的插件中,我需要用静态方法动态扩展另一个插件的模型。我不知道该怎么做。

在我的插件中,我有一个从 Jiri/JKShop/Models/product 继承的课程会话对象

在 jiri_jkshop_products 表中,我添加了一个 is_course 字段。

在创建产品对象之前,我想通过以下方式知道它是否是课程产品:

if (\Jiri\JKShop\Models\Product::isCourse($productJson["product_id"])) {
    $product = \PluginAuthor\PluginName\Models\Session::find($productJson["product_id"]);
} else {
    $product = \Jiri\JKShop\Models\Product::find($productJson["product_id"]);
}

请问,如何在我的插件的plugin.php文件中动态添加静态方法到产品模型?

我希望这个想法对应优雅的代码,如果你有更好的,我也接受

在此先感谢您和问候, 帕特里克

【问题讨论】:

  • 你看过__callStatic()魔术方法吗?如果您在实际上没有以编程方式设置该方法的对象上调用静态方法,它将被调用。更多信息:php.net/manual/en/…
  • 感谢 Denis,这是一个不错的功能,但我的目的不是直接修改产品模型(我希望它保持其完整性),而是在我的 plugin.php 引导函数中动态修改

标签: php laravel octobercms


【解决方案1】:

我认为你可以通过插件的 boot 方法中的可扩展特性来实现这一点,就像这样。

您可以利用 laravel 容器注册一个单例以始终获取相同的实例,我认为这是一个不错的方法

<?php
class YourPlugin extends PluginBase
{
   public function register()
   {
    $this->app->singleton('my.product', function () {
        return new \Jiri\JKShop\Models\Product;
    });
   }

   public function boot()
   {
    \Jiri\JKShop\Models\Product:::extend(function ($product) {
        $product->addDynamicMethod('isCourse', function ($course) use ($product) {
            return $product->find($course)->is_course;
        });
    });
   }
}

现在,您可以在插件中的任何位置使用新的动态添加方法

<?php
if(app()->make('my.product')->isCourse($productJson["product_id"])){
    $product = \PluginAuthor\PluginName\Models\Session::find($productJson["product_id"]);
}else{
    $product = \Jiri\JKShop\Models\Product::find($productJson["product_id"]);
}

【讨论】:

  • 感谢 OSdev,这很好,但是这样,您需要创建一个产品对象来测试 is_course 字段。它有效,但我觉得它不是很优雅,我可能错了。这意味着您首先创建一个对象来测试该字段,然后第二次重新创建它,或者忘记它以创建好的字段。这是我首先做的,但经过思考,我发现动态添加静态方法的想法与您指示添加 is_course 方法但静态的方式相同但是这可能吗? :-)
  • 你不能“我认为”,但是单例对象呢?我编辑了我的答案
  • 老实说我不知道​​ :-)
  • 您的解决方案很巧妙,但我正在寻找更轻的东西,所以我用我的 poduct_id 在 course_id 字段上提出了一个简单的 sql 请求。无论如何,非常感谢,问候
猜你喜欢
  • 1970-01-01
  • 2012-11-22
  • 1970-01-01
  • 2010-10-26
  • 1970-01-01
  • 2011-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多