PHP ActiveRecord не использует мой пользовательский атрибут

У меня есть модель, определяемая следующим образом:

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

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

Благодарю, Гарет

Вот мое простое решение. Я переопределяю метод атрибутов и добавляю любые методы, начинающиеся с «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 (или что-то еще, что мне нужно) и показать его в сериализованных значениях.

Метод attributes () действительно вернет только значения для столбцов таблицы вашей модели (не псевдонимы).

Но имя $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(); } 

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

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

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


РЕДАКТИРОВАТЬ

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

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

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

Создайте класс, который происходит из 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 ).

На самом деле, это легко реализовать, как это @ добавить это 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; }