在渲染模板期间返回一个数组

时间:2019-06-16 01:36:55

标签: php symfony twig fosuserbundle symfony4

我想显示活动用户列表。我在项目上使用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 个答案:

答案 0 :(得分:1)

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

它将呈现该代码段。