Twig / PHP Отображение данных автора - 2 таблицы (Symfony2)

0

Я относительно новичок в Symfony, и у меня проблема, которую я просто не могу исправить.

В представлении twig для объекта "запрос", пытаясь передать автора из объекта "post" через контроллер запроса в представление. Надеюсь, это имеет смысл.

контроллер:

public function viewEnquireAction($id )
{
    $em = $this->getDoctrine()->getManager();
    $enquire = $em->getRepository('Bundle:Enquire')->find($id);

    $project = new Post();
    $author = $project->getAuthor(); //mutator from Post entity

    return $this->render('Bundle:Page:staff.html.twig', ['enquire' => $enquire, 'author' => $author]);
}

Twig:

{% for project in enquire %}
    {% if app.user == author.username %} //issue here.
        //return data will go here
    {% endif %}
{% endfor %}

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

Благодарю.

Теги:
doctrine
twig

3 ответа

0
Лучший ответ

Более общая попытка, которая позволит вам повторно использовать код "Автор, которого можно увидеть" во всем приложении, использует избирателей: http://symfony.com/doc/current/cookbook/security/voters_data_permission.html

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

{% if is_granted("LIST", project) %}
  <a href="{{ path('project_edit', { 'id': project.id }) }}">show project</a>
{% endif %}

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

public function editAction(Project $project)
{
    if (!$this->get('security.context')->isGranted('LIST', $project)) {
        // Throw access denied exception
    }
    // ...
}

И вы можете добавить дополнительные правила, кроме проверки "Пользователь является автором". Возможно, вы хотите, чтобы пользователи с ROLE_SUPER_ADMIN всегда видели все. Просто добавьте это в свой класс избирателей.

1

Код @davidvelilla, зацикливающий над запрошенными проектами, делает более ощутимым, а затем проверяет, совпадает ли автор проекта с зарегистрированным пользователем, который будет показывать только проекты подключенного пользователя, а другая вещь, которую вы можете сделать, - использовать репозиторий или отношение между проектами и пользователем или пользователем и автором, которые создают ощущение. затем используйте функцию в репозитории для получения проектов с помощью user_id, и вам не придется перебирать все проекты, что является плохой практикой и требует загрузки ресурсов.

Например, у вас 1000 проектов в базе данных, у вас есть пользователь с 1 проектом. Зачем загружать из проектов базы данных 1000 и зацикливать их, чтобы проверить, может ли пользователь == author $repository->getProjectsById($user->getId()); // которые загружают только требуемые $ -проекты (1), и нет необходимости проверять веточку. только отображение данных.

0

Ваш переменный $ project только что был инстанцирован и не будет содержать никакой информации об $ author за исключением того, что вы определили в Post.php

Если ваш объект $ request запрашивает правильную информацию о сопоставлении, ТОЛЬКО передайте эту переменную шаблону, и я полагаю, вы пытаетесь получить автора всех проектов этого запроса. Что-то вроде этого может дать вам ключ:

public function viewEnquireAction($id )
{
    $em = $this->getDoctrine()->getManager();
    $enquire = $em->getRepository('Bundle:Enquire')->find($id);

    return $this->render('Bundle:Page:staff.html.twig', ['enquire' => $enquire]);
}

{% for project in enquire.projects %}
    {% if app.user == project.author.username %} //issue here.
        //return data will go here
    {% endif %}
{% endfor %}
  • 0
    Я не отобразил его, поскольку автор сопоставлен с другим полем в другом объекте. Можно ли сопоставить несколько объектов? Спасибо за ответ.
  • 0
    Я не знаю структуру информации, которую вам нужно использовать. Но для того, что я видел в вашем коде, вы делаете $ project = new Post (); а затем $ author = $ project-> getAuthor (); которая заставит переменную "author" содержать информацию по умолчанию о сущности Post. Конечно, это не то, что вы пытаетесь получить, не так ли?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню