【问题标题】:Return an array during rendering template在渲染模板期间返回一个数组
【发布时间】:2019-06-16 01:36:55
【问题描述】:

我想显示一个活跃用户列表。我在我的项目中使用 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 => ...])。”)。

【问题讨论】:

    标签: php symfony twig fosuserbundle symfony4


    【解决方案1】:

    您需要创建要在主模板中呈现的 sn-p 的 twig 模板。例如,我们称它为 _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')) }}
    

    它将渲染那个 sn-p。

    【讨论】:

    • 是的,但不识别用户。使用return $this-&gt;render('bundles/StaffBundle/header-content.html.twig', array('users' =&gt; $users)); 我得到了这个错误变量“用户”不存在。
    • 我不理解您要渲染的模板。如果它是第 3 方捆绑包,您需要阅读它的文档以了解如何覆盖它的控制器方法。
    • 我的 layout.html.twig 在 templates/bundle/FOSUserBundle 文件夹中,在此布局上我添加了 {% extends 'base.html.twig' %} {% block content %} {{ render(controller('App\\Controller\\UserController:whoIsOnlineAction')) }} &lt;ul&gt; {% for user in users %} &lt;li&gt;{{ user.username}}&lt;/li&gt; {% endfor %} &lt;/ul&gt; {% endblock content %} 但现在我什么也看不到,而且我的服务器关闭 ** 最长执行时间在第 406 行的 C:\wamp64\www\staff-test\vendor\doctrine\orm\lib\Doctrine\ORM\Query.php 中超过 120 秒**
    • 如果例如在操作 whoIsOnlineAction() 呈现 _users.html.twig 时,$users 变量仅在该模板中可用。意味着此代码 {{ render(controller('App\\Controller\\UserController:whoIsOnlineAction')) }} 不会使 {{ users }} 在 layout.html.twig 中可用。你最好按照我给的指示去做。
    猜你喜欢
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多