Как правильно перебрать массив объектов с закрытыми свойствами в Усы? - PullRequest
0 голосов
/ 23 сентября 2018

Пример шаблона усов:

{{#entites}}
  <a href="{{url}}">{{title}}</a>
{{/entities}}

Отображается:

$m = new Mustache_Engine(
  ['loader' => new Mustache_Loader_FilesystemLoader('../views')]
);

echo $m->render('index', $data);

Основной вложенный массив.

$data = [
   'entities' => [
       [
         'title' => 'title value',
         'url' => 'url value',
       ] 
    ]
];

Это правильно отображается в шаблоне.

Массив объектов класса:

class Entity 
{
  private $title;

  private $url;

  //setter & getters

  public function __get($name)
  {
      return $this->$name;
  }
}

Аргумент усы:

$data = [
   'entities' => [
       $instance1
    ]
];

В этом случае не работает - вывод пуст (нет значений из свойств)

Ответы [ 2 ]

0 голосов
/ 23 сентября 2018

Вы можете использовать интерфейс ArrayAccess, чтобы иметь доступ к вашим личным свойствам следующим образом:

class Foo implements ArrayAccess {
    private $x = 'hello';

    public $y = 'world';

    public function offsetExists ($offset) {}

    public function offsetGet ($offset) {
        return $this->$offset;
    }
    public function offsetSet ($offset, $value) {}
    public function offsetUnset ($offset) {}
}

$a = new Foo;

print_r($a); // Print: hello

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

0 голосов
/ 23 сентября 2018

Вместо магических методов, почему бы вам не использовать такую ​​функцию в классе

public function toArray()
{
    $vars = [];
    foreach($this as $varName => $varValue) {
        $vars[$varName] = $varValue;
    }

    return $vars;
}

, а затем вызвать эту функцию, чтобы получить переменные в виде массива

$data = [
   'entities' => $instance1->toArray()
];
...