2016-08-24 2 views
2

Извините, если это уже было задано. Я сделал несколько поисков и не нашел простого решения.Функция вызова с параметрами от Twig

У меня есть проект symfony/doctrine. Каким образом можно вызвать функцию из ветки, учитывая, что бизнес-логику не следует размещать в представлении.

У меня есть массив объектов, и я хотел бы проверить, является ли зарегистрированный пользователь владельцем каждого объекта в сообщении.

Например это уместно

//in twig template 
    {% for post in posts %} 
     {% if post.isOwner(user_id) %} 
      //do stuff 
     {% endif %} 
    {% endfor %} 

и в пост лица имеют этот

//in entity  
    public function isOwner(user_id){ 
     if (post.getId() == user_id) 
      return true; 
     return false 
    } 

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

+0

Полагая логику в сущности (которые соответствуют сущности), очень хорошая практика, на мой взгляд. Если у вас все еще есть какая-то логика, которая не подходит для вашей сущности, и вам нужно это сделать в Twig, вы должны создать расширение Twig. Но это хорошее решение, только если эта логика относится к уровню просмотра. Http://symfony.com/doc/current/templating/twig_extension.html –

ответ

1

не знает, что u're пытается сделать, но если вы хотите перебрать конкретные сообщения пользователей, вы хотели бы построить би-directionnal отношения и петля на столбах с помощью

{% for post in app.user.posts %} 

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

По семантическим причинам/читаемости, я хотел бы изменить

//in twig template 
{% for post in posts %} 
    {% if post.isOwner(user_id) %} 
     //do stuff 
    {% endif %} 
{% endfor %} 

в

//in twig template 
{% for post in posts %} 
    {% if app.user.isOwner(post) %} 
     //do stuff 
    {% endif %} 
{% endfor %} 

или

{% for post in posts %} 
    {% if post.isOwnedBy(app.user) %} 
     //do stuff 
    {% endif %} 
{% endfor %} 

И я бы исправить метод логического :

//in entity AcmeBundle\User  
public function isOwner(AcmeBundle\Post $post){ 
    if ($this == $post->getUser()) { 
     return true; 
    } 

    return false; 
} 
+0

Большое спасибо ... это то, что я пытался сделать. Спасибо за исправление, а также –

+0

- вы зацикливаетесь на сообщениях конкретного пользователя или просматриваете целую коллекцию сообщений и выполняете какую-то пользовательскую логику для пользователя с аутированием? – VaN

+0

Я зацикливаюсь на коллекции сообщений. Сообщения передаются от контроллера. Ваш ответ - именно то, что я хотел сделать. Я не был уверен, что лучше всего передать параметр с ветки на объект –

0

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

{% for post in posts if post.isOwner(user_id)%} 
    .... 
{% endfor %}