Я относительно новичок в 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 %}
По сути, я пытаюсь отображать данные из базы данных только в том случае, если пользователь, который зарегистрирован в авторе.
Благодарю.
Более общая попытка, которая позволит вам повторно использовать код "Автор, которого можно увидеть" во всем приложении, использует избирателей: 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 всегда видели все. Просто добавьте это в свой класс избирателей.
Код @davidvelilla, зацикливающий над запрошенными проектами, делает более ощутимым, а затем проверяет, совпадает ли автор проекта с зарегистрированным пользователем, который будет показывать только проекты подключенного пользователя, а другая вещь, которую вы можете сделать, - использовать репозиторий или отношение между проектами и пользователем или пользователем и автором, которые создают ощущение. затем используйте функцию в репозитории для получения проектов с помощью user_id, и вам не придется перебирать все проекты, что является плохой практикой и требует загрузки ресурсов.
Например, у вас 1000 проектов в базе данных, у вас есть пользователь с 1 проектом. Зачем загружать из проектов базы данных 1000 и зацикливать их, чтобы проверить, может ли пользователь == author $repository->getProjectsById($user->getId());
// которые загружают только требуемые $ -проекты (1), и нет необходимости проверять веточку. только отображение данных.
Ваш переменный $ 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 %}