2012-06-20 1 views
2

У меня есть модель определяется следующим образом:PHP ActiveRecord, кажется, не использовать мой настраиваемый атрибут

class User extends ActiveRecord\Model { 
    function get_name() { 
    return $this->first_name . " " . $this->surname; 
    } 
} 

однако, когда я показываю $item->attributes(); то имя не появляется. Я здесь идиот? Если да, то как мне получить свои пользовательские атрибуты в модели?

Спасибо, Gareth

ответ

1

Вот мое простое решение. Я переопределение метода атрибутов и добавления каких-либо методов, которые начинаются с «get_attribute_», так что я могу использовать их во время сериализации:

class BaseModel extends ActiveRecord\Model 
{ 
    public function attributes() 
    { 
     $attrs = parent::attributes(); 
     $modelReflector = new ReflectionClass(get_class($this)); 
     $methods = $modelReflector->getMethods(~ReflectionMethod::IS_STATIC & ReflectionMethod::IS_PUBLIC); 
     foreach ($methods as $method) 
     { 
      if (preg_match("/^get_attribute_/", $method->getName())) 
      { 
       $attrs[str_replace('get_attribute_', '', $method->getName())] = $method->invoke($this); 
      } 
     } 
     return $attrs; 
    } 
} 

Полученные модели, которые используют это будет выглядеть следующим образом:

class User extends BaseModel 
{ 
    public $loginSessionId; 

    function get_attribute_loginSessionId(){ 
     return $this->loginSessionId; 
    } 
} 

Таким образом, я могу вручную привязать к loginSessionId (или что-то еще, что мне нужно) и показать его в сериализованных значениях.

0

Вы должны проверить, что функция делает атрибуты. Возможно, вам придется переопределить его, чтобы учесть ваши пользовательские атрибуты, или вам, возможно, придется добавить свои пользовательские атрибуты к некоторому свойству _properties в предке

0

Можете ли вы показать нам, как вы создали $ item? PHPActiveRecord вам нужно установить атрибуты в вызове конструктора (new User($attributes)) или непосредственно по свойствам ($user->first_name = 'Gareth').


EDIT

Я не уверен, что метод атрибутов() будет подобрать пользовательский добытчик. Кажется, что он просто возвращает свойство атрибутов модели. Метод

https://github.com/kla/php-activerecord/blob/master/lib/Model.php#L566

+0

Эта модель найдена из базы данных, '$ user-> first_name' и' $ user-> surname' соответствуют полям таблицы. – ridecar2

+0

См. Изменение в моем ответе. attributes(), похоже, не забирает геттеры. – michaelhagedon

1

Атрибутов() действительно будет возвращать только значения для столбцов таблицы Вашей модели (не дискретные).

Но $item->name должен дать ожидаемый результат. Вы также можете добавить установщик.

Чтобы получить массив всех атрибутов, вы можете добавить этот метод к вашей модели:

public function all_attributes() { 
    $custom_attr = []; 
    foreach (static::$getters as $getter) { 
     $key = substr($getter, 4); 
     $custom_attr[$key] = $this->$key; 
    } 
    return $custom_attr + $this->attributes(); 
} 

(не забудьте добавить свои добытчик в массив $ геттеров, модель ActiveRecord будет использовать)

+0

Мне очень хотелось перебирать все атрибуты. – ridecar2

+0

Функция, добавленная в последнее редактирование, позволяет –

0

Я решил это следующим образом:

Создать класс, производный от ActiveRecord\Model и включить эту функцию:

public function properties() 
{ 
    $attrs = $this->attributes(); 
    $modelReflector = new ReflectionClass(get_class($this)); 
    $methods = $modelReflector->getMethods(~ReflectionMethod::IS_STATIC & ReflectionMethod::IS_PUBLIC); 
    foreach ($methods as $method) 
    { 
    if (preg_match("/^get_/", $method->getName())) 
    { 
     $attrs[str_replace('get_', '', $method->getName())] = $method->invoke($this); 
    } 
    } 
    return $attrs; 
} 

Это возвращает все атрибуты, пользовательские или иные, если я получаю свои модели из нужного класса (не ActiveRecord\Model).

0

На самом деле, это легко реализуется, как это @ добавить это https://github.com/kla/php-activerecord/blob/master/lib/Model.php#L520:

// check for attribute as getter 
if (method_exists($this, "get_{$name}")){ 
    $method = "get_{$name}"; 
    $var = $this->$method(); 
    return $var; 
} 

Но я предпочитаю делать это так (уборщик/оптимизированный код):

SomeModel.php:

/** 
    * gets templatefile of outputplugin, wrapper function for template comfortability 
    * 
    * NOTE 2: never implement functions in model, try redirecting 
    * to manager class (=lowmemory footprint, imagine xxxxx models with xxxx similar functions) 
    * 
    * @param string $varname variable description 
    * @return string 
    */ 
    public function get($varname) 
    { 
    switch($varname){ 
     case "foo" : return SomeModel::getManager()->getFoo(); break; 
     default: return ""; 
    } 
    } 

добавить это https://github.com/kla/php-activerecord/blob/master/lib/Model.php#L520:

// check for attribute as getter 
if (method_exists($this, "get") && $this->get($name)){ 
    $var = $this->get($name); 
    return $var; 
}