使用静态方法动态扩展模型

时间:2017-01-11 18:55:05

标签: php laravel octobercms

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

在我的插件中,我有一个继承自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文件中动态地向产品模型添加静态方法?

我希望这个想法与优雅的代码相对应,如果你有更好的,我也会采取

提前谢谢你&问候, 帕特里克

1 个答案:

答案 0 :(得分:0)

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

你可以利用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"]);
}