Return 渲染模板中的一个数组

Return an array during rendering template

我想显示活跃用户列表。我在我的项目中使用 FOSUserBundle。我在我的用户 table 上创建了一个字段,它将包含最后一个用户 activity 的日期和时间,并且我创建了一个侦听器:

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')) }}

但是当我尝试登录到一个简单的用户时,我得到了这个错误: 在呈现模板("The controller must return a "Symfony\Component\HttpFoundation\Response" 对象但它返回一个数组 ([users => ...]).").

您需要为要在主模板中呈现的代码段创建一个分支模板。例如,我们称它为 _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')) }}

它将呈现该片段。