Pomm Twig и родственники

Для проекта, который я использую pommbundle, он идеально подходит для создания сущностей с существующей базой данных.

В моем контроллере:

$catalogues = $this->get('pomm')['my_db1']
    ->getModel('\AppBundle\Entity\MyDb1\PublicSchema\CatalogueModel')
    ->findAll();

return this->render(
    'SiteBundle:Default:homePage.html.twig',
    array('catalogues'=>$catalogues));

Но как я могу получить доступ к переменной внутри моего представления (Twig)

{% for catalogue in catalogues %} 
    {{dump(catalogue)}} --> value inside 
{% endfor %}

Дамп результата

Catalogue {#1132 ▼ 
    #container: array:13 [▼ 
        "ID" => 8 
        "Code" => "MATIÈRE PREMIÈRE" 
        "Actif" => true 
        "DateAjout" => DateTime {#1212 ▶} 
        "Index" => 0 
        "PriseCommande" => false 
        "Description" => "" 
        "Couleur" => "Green" 
        "CouleurText" => "#000000" 
        "Tarif" => null 
        "WebActif" => false 
        "WebTitre" => null 
        "WebDescription" => null ] 
    -status: 1 }

catalogue.ID (не работает) catalogue.container.ID (не работает) с catalogue.get('ID') работает, но это лучший способ?

Другой вопрос

Если моя сущность имеет отношение, например, WebActif -> relation with another tableКак получить доступ к Webactif, потому что дамп возвращает только идентификатор. Я должен создать свой собственный метод?

Можно ли показать базовый пример?

1 ответ

Решение

Model::findAll Метод возвращает итератор результатов базы данных. Когда этот итератор пройден, он возвращает сущности, заполненные преобразованными значениями.

Примечание: вам лучше не использовать заглавные буквы в именах столбцов, так как это приведет к путанице и не будет работать должным образом с гибкими объектами Pomm. (то же самое относится и к именам таблиц).

<dl>
{% if catalogues.isEmpty() %}
  <dt>No results found.</dt>
{% else %}
  <dt>There are {{ catalogues.count() }} results:</dt>
  {% for catalogue in catalogues %}
  <dd>{{ catalogue.code }} (added the {{ catalogue.date_ajout.format('d-m-Y') }}){% if catalogue.actif %} OK {% endif %}</dd>
  {% endfor %}
{% endif %}
</dl>

Изменить: так как ваш комментарий говорит, что ваша база данных содержит имена столбцов с заглавными буквами, здесь дополнительное объяснение того, как работают гибкие объекты.

(Официальная документация о гибких юридических лицах здесь)

Когда гибкий объект гидратируется значениями итератора, они преобразуются и затем помещаются со своим именем в объекте. Вот почему вы можете использовать универсальный аксессор $entity->get('MyColumn') потому что ключи сохранились.

Но гибкие существа - странные звери, потому что они могут меняться в зависимости от SELECT который решает данные, отправленные им. Когда такая сущность создается, геттеры и сеттеры создаются практически с использованием PHP __get а также __set а также __call функции.

Это может показаться странным, но посмотрите на этот пример:

<?php
$entity = new MyEntity(['first_name' = 'John', 'last_name' => 'Doe']);
$entity['first_name']; // calls $entity->getFirstName() which defaults to $this->get('first_name');

Затем можно переопределить средства доступа по умолчанию:

<?php
class MyEntity extends FlexibleEntity
{
    /*
    * Triggered by $entity['first_name'] 
    * or $entity->first_name
    */
    public function getFirstName(): string
    {
        return uc_words($this->get('first_name'));
    }

    public function getLastName(): string
    {
        return strtoupper($this->get('last_name'));
    }

    public function getName(): string
    {
        return sprintf("%s %s", $this->getFirstName(), $this->getLastName());
    }
}

Тогда в веточку можно просто сделать {{ entity.name }} вызвать getName функция.

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

Другие вопросы по тегам