2017-01-11 3 views
1

в плагине, который я разрабатываю, мне нужно динамически расширять модель другого плагина статическим методом. Я понятия не имею, как это сделать.Динамическое расширение модели со статическим методом

В моем плагине, я курсовой объект сеанса, который наследуется от Иржи/JKShop/Модель/продукта

В таблице 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"]); 
} 

Пожалуйста, как динамически добавить статический метод модели продукта в плагине .php-файл моего плагина?

Я надеюсь, что эта идея соответствует элегантному коду, если у вас есть лучше, я слишком

спасибо заранее & уважения, Патрик

+0

Вы изучили метод '__callStatic()' magic? Он будет вызываться, если вы вызываете статический метод для объекта, который на самом деле не имеет этого метода, установленного по умолчанию. Больше информации здесь: http://php.net/manual/en/language.oop5.overloading.php#object.callstatic –

+0

благодарит Дениса, его приятная функция, но моя цель - не изменять модель продукта напрямую (я хочу сохраняйте его целостность), но динамически в моей функции загрузки plugin.php –

ответ

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"]); 
} 
+0

спасибо OSdev, это хорошо, но в этом случае вам нужно создать объект продукта, чтобы проверить поле is_course. Он работает, но я не считаю его очень изящным, я могу ошибаться. Это означает, что вы сначала создаете объект для проверки поля, затем заново создавайте его или забываете создать хороший. это то, что я сделал первым, но, подумав, я нашел идею добавить динамический статический метод так же, как вы указываете, добавить метод is_course, но статический. Но возможно ли это? :-) –

+0

Вы не можете «я думаю», но как насчет одиночного объекта? Я отредактировал свой ответ – OsDev

+0

честно я не знаю :-) –

Смежные вопросы