Php 我应该把代码放在哪里来简化控制器?

Php 我应该把代码放在哪里来简化控制器?,php,symfony,Php,Symfony,我的例子很简单。我有用户。他们可以提交想法。其他人都可以用积分支持这些想法。当一个用户想要支持一个想法时,我需要检查他是否有足够的信用,等等。我应该把这个代码放在哪里 /** * @Route("/support/{ideaSlug}", name="support_new") */ public function newAction(Request $request, $ideaSlug) { $support = new Support(); $form = $this-&g

我的例子很简单。我有用户。他们可以提交想法。其他人都可以用积分支持这些想法。当一个用户想要支持一个想法时,我需要检查他是否有足够的信用,等等。我应该把这个代码放在哪里

/**
* @Route("/support/{ideaSlug}", name="support_new")
*/
public function newAction(Request $request, $ideaSlug)
{
    $support = new Support();
    $form = $this->createForm(SupportType::class, $support);

    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        $user = $this->getUser();
        if($user->getCredit() > 0) {
            $idea = $this->getDoctrine()->getRepository('AppBundle:Idea')->findOneBy(['slug' => $ideaSlug]);
            $em = $this->getDoctrine()->getManager();
            $em->persist($support);
            $em->flush();
        }

        return $this->redirect($this->generateUrl('support_index'));
    }

    return $this->render('support/new.html.twig', [
        'form' => $form->createView()
    ]);
}
我是否需要用户服务如:

namespace AppBundle\Utils;

use Doctrine\ORM\EntityManager;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage;
use AppBundle\Entity\Idea;

class User
{
    protected $em;
    protected $user;

    public function __construct(EntityManager $em, TokenStorage $tokenStorage)
    {
        $this->em = $em;
        $this->$user = $tokenStorage->getToken()->getUser();
    }

    public support(Idea $idea)
    {
        ....
    }
}

或者我是否将其放在实体类中?

无法真正将其放在实体中,因为该实体无权访问实体管理器。您的用户支持服务可能是您最好的选择。您可以考虑一个自定义验证器(您需要的是验证)。当然,您可以在服务中解耦登录,并在自定义应用程序中使用它constraint@Matteo这是一个很好的论点。除非信用检查通过,否则该表格不应视为有效。在这一点上,它将成为一个简单的持久化。我将尝试使用自定义验证器。可能只是使用voter…无法真正将其放入实体中,因为实体无法访问实体管理器。您的用户支持服务可能是您最好的选择。您可以考虑一个自定义验证器(您需要的是验证)。当然,您可以在服务中解耦登录,并在自定义应用程序中使用它constraint@Matteo这是一个很好的论点。除非信用检查通过,否则该表格不应视为有效。在这一点上,它将成为一个简单的持久化。我将尝试使用一个自定义验证器。也许只是使用投票者。。。