Вернуть массив во время рендеринга шаблона - PullRequest
0 голосов
/ 16 июня 2019

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

class ActivityListener
{
    protected $tokenStorage;
    protected $userManager;

    public function __construct(TokenStorage $tokenStorage, UserManagerInterface $userManager)
    {
        $this->tokenStorage = $tokenStorage;
        $this->userManager = $userManager;
    }

    /**
    * Update the user "lastActivity" on each request
    * @param FilterControllerEvent $event
    */
    public function onCoreController(FilterControllerEvent $event)
    {
        // Check that the current request is a "MASTER_REQUEST"
        // Ignore any sub-request
        if ($event->getRequestType() !== HttpKernel::MASTER_REQUEST) {
            return;
        }

        // Check token authentication availability
        if ($this->tokenStorage->getToken()) {
            $user = $this->tokenStorage->getToken()->getUser();

            if ( ($user instanceof UserInterface) && !($user->isActiveNow()) ) {
                $user->setLastActivityAt(new \DateTime());
                $this->userManager->updateUser($user);
            }
        }
    }
}

На моем контроллере:

class UserController extends Controller
{

    /*
     * @Template()
     */
    public function whoIsOnlineAction()
    {
        $users = $this->getDoctrine()->getManager()->getRepository('App:User')->getActive();
        return array('users' => $users);
    }
}

На моем шаблонеЯ добавил эту строку:

{{ render(controller('App\\Controller\\UserController:whoIsOnlineAction')) }}

Но когда я пытаюсь войти в систему как простой пользователь, я получаю эту ошибку: Возникла исключительная ситуация во время рендеринга шаблона («Контроллер должен вернутьобъект "Symfony \ Component \ HttpFoundation \ Response", но он возвратил массив ([users => ...]). ").

1 Ответ

1 голос
/ 16 июня 2019

Вам необходимо создать шаблон ветки фрагмента, который вы хотите отобразить в вашем основном шаблоне. Для примера давайте назовем это _users.html.twig: и поместим в него:

<ul>
    {% for user in users %}
    <li>{{ user.username}}</li>
    {% endfor %}
</ul>

Затем вы визуализируете это в вашем контроллере метода:

class UserController extends Controller
{
    /*
     * @Template()
     */
    public function whoIsOnlineAction()
    {
        $users = $this->getDoctrine()->getManager()->getRepository('App:User')->getActive();
        return $this-render('_users.html.twig', array('users' => $users));
    }
}

Позже, когда вы хотите сделать это из шаблона:

{{ render(controller('App\\Controller\\UserController:whoIsOnlineAction')) }}

Это сделает этот фрагмент.

...