2017-01-31 10 views
0

Как сохранить модель, которая была возвращена с $bean->box() в RedBean?Не удается сохранить коробку в RedBean?

Например, следующий код не работает (он просто вставляет пустую строку):

class Model_Comment extends RedBean_SimpleModel { 
    public $message; 
} 

$bean = R::dispense('comment'); 
$model = $bean->box(); 
$model->message = "Testing"; 
R::store($model); 

Это работает, если я использую $model->unbox()->message = "Testing", но это, вероятно, будет раздражать очень быстро ...

Очевидно, что код, приведенный выше, является просто примером, я мог бы просто установить свойство message на $bean здесь, но я хочу, чтобы иметь возможность боксировать и передавать его другим методам.

Это так, как это должно работать, или я чего-то не хватает?

ответ

0

Это оказалось вызвано «gotcha», когда речь идет о «магических» методах и методах PHP «0», __get() и __set().

Рассматривая исходный код для RedBean_SimpleModel, он фактически использует метод магии __set() для обновления своего компонента при настройке свойства.

Вот приходит Гоча, прямо из PHP documentation:

__set() запускается при записи данных в недоступных свойств.

__get() используется для чтения данных из недоступных свойств.

__isset() инициируется вызовом isset() или empty() для недоступных свойств.

__unset() вызывается, когда функция unset() используется для недоступных свойств.

Так получается, что __set() никогда не вызывается для существующего (доступного) члена класса, т.е. public $message. Поэтому я мог бы просто удалить все общедоступные поля из класса, и это решило бы проблему, но тогда я потеряю все функции автозаполнения и проверку флиса в моей среде IDE.

Так я пришел с этим решением, вместо:

class MyBaseModel extends RedBeanPHP\SimpleModel { 


    public function __construct(){ 
     foreach(get_object_vars($this) as $property => $value){ 
      if($property != 'bean') 
       unset($this->$property); 
     } 
    } 


} 


class Model_Comment extends MyBaseModel { 
    public $message; 
} 

Это эффективно удаляет все переменные член из класса MyBaseModel, когда он конкретизируется, кроме$bean, что, конечно, является жизненно важной частью RedBeanPHP_SimpleModel ,

Теперь я могу легко подкласса MyBaseModel и иметь все публичные поля, которые мне нужны в моих моделях подкласса, и код в исходном вопросе будет работать.