我正在尝试使用symfony设置订阅网站。我希望能够通过ROLE_USER向用户免费提供3篇文章,但如果他们想查看更多文章,则可以将他们引导至订阅选项。我在确定如何使用安全系统实现这一点时遇到了麻烦。
我怀疑我需要一个自定义选民。这是我应该看的路线吗?然后也许是自定义access.denied.handler。
我大多不确定如何使用选民来实现这一点。这是要走的路吗?
答案 0 :(得分:2)
如果他们需要登录(当你谈论角色然后他们可能会需要的话)那么你可以使用请求listener
来执行此操作并在每个文章页面加载时减少免费文章的数量(或者如果你想要允许刷新文章页面而不再触及限制,那么你需要为用户阅读文章实现一些存储,并在用户打开3篇不同的文章后禁用免费阅读)。
您需要实现请求事件监听器(在此处阅读有关事件的更多信息:http://symfony.com/doc/current/components/http_kernel/introduction.html#the-kernel-request-event):
<?php
namespace App\AppBundle\EventListener;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\HttpKernelInterface;
class FreeReadingListener
{
/**
* @param GetResponseEvent $event
*/
public function onKernelRequest(GetResponseEvent $event)
{
if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
// don't do anything if it's not the master request
return;
}
// check if loaded route is article route
// check if user can read articles for free (can be as some kind flag) - if can't then redirect to subscriptions page
// log user article read
// if user used limit - switch free reading flag on user
}
}
services.yml
services:
app_bundle.listener.free_reading:
class: App\AppBundle\EventListener\FreeReadingListener
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
听众文档:http://symfony.com/doc/current/cookbook/event_dispatcher/event_listener.html