У меня есть модель, определяемая следующим образом:
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; }