避免类似的控制器操作

时间:2015-09-11 21:52:47

标签: php symfony controller

我正在为用户之间的私人消息构建一个包。

这是我的控制器的收件箱操作。它的作用是获取当前用户的消息,它将查询传递给KNPpaginator以显示其中的一部分。我还保存了数据库中页面上显示的结果数量。一个表单是一个下拉列表,用于显示每页显示的结果数量。另一种形式由复选框和带动作的下拉列表组成。根据选择的动作,我将消息的id(选中的复选框id)传递给另一个名为markAction的函数(也是一个可以通过转到特定URL来标记单个消息的页面)

 public function inboxAction(Request $request)
    {

        $messages = $this->getDoctrine()->getRepository('PrivateMessageBundle:Message');
        $mymsg = $messages->findMyMessages($this->getUser());

        $message_settings = $this->getDoctrine()->getRepository('PrivateMessageBundle:MessageSettings');

        $perpage = $message_settings->findOneBy(array('user' => $this->getUser()));
        $pagerform = $this->createForm(new MessageSettingsType(), $perpage);


        $pagerform->handleRequest($request);
        if ($pagerform->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $em->persist($perpage);
            $em->flush();
        }

        $paginator = $this->get('knp_paginator');
        $pagination = $paginator->paginate(
            $mymsg,
            $request->query->get('page', 1)/*page number*/,
            $perpage ? $perpage->getResPerPage() : 10/*limit per page*/,
            array('defaultSortFieldName' => 'a.sentAt', 'defaultSortDirection' => 'desc')
        );

        $form = $this
            ->createForm(
                new ActionsType(),
                $mymsg->execute()
            );


        $form->handleRequest($request);
        if ($form->isValid()) {
            $data = $form->getData();
            $ids = array();

            foreach ($data['checkboxes'] as $checkbox) {
                $ids[] = $checkbox->getId();
            }

            $action = $data['inboxactions'];


            $this->markAction($action, $ids);

            return $this->redirectToRoute('private_message_inbox');

        }

        return $this->render(
            '@PrivateMessage/inbox.html.twig',
            array(
                'messageList' => $pagination,
                'form' => $form->createView(),
                'pagerform' => $pagerform->createView(),
            )
        );
    }

我的收件箱控制器中的标记操作用户。基于一个参数,我将相应的操作应用于第二个参数,如果页面是通过路由调用的,则是一条消息,如果通过我的inboxAction调用,则可以是一个消息数组。我做了一些一致性检查,然后标记我的消息。

public function markAction($action, $msgs)
    {


        if (!$msgs) {
            $this->addFlash(
                'error',
                'Select at least one message!'
            );

            return;
        } else {
            if (!$action) {
                $this->addFlash(
                    'error',
                    'Select one action to apply to your items!'
                );

                return;
            } else {

                $messages = $this->getDoctrine()->getRepository('PrivateMessageBundle:Message');
                $em = $this->getDoctrine()->getManager();

                $msg = $messages->findBy(array('receiver' => $this->getUser(), 'id' => $msgs));

                $good = 0;


                foreach ($msg as $isforme) {

                    $good++;
                    switch ($action) {
                        case 'spam': {
                            if ($isforme->getIsSpam() == false) {
                                $isforme->setIsSpam(true);
                                if (!$isforme->getSeenAt()) {
                                    $isforme->setSeenAt(new \DateTime('now'));
                                }
                                $em->persist($isforme);

                            }
                            break;
                        }
                        case 'unspam': {
                            if ($isforme->getIsSpam() == true) {
                                $isforme->setIsSpam(false);
                                $em->persist($isforme);

                            }
                            break;
                        }
                        case 'viewed': {
                            if ($isforme->getSeenAt() == false) {
                                $isforme->setSeenAt(new \DateTime('now'));
                                $em->persist($isforme);

                            }
                            break;
                        }
                        case 'unviewed': {
                            if ($isforme->getSeenAt() != false) {
                                $isforme->setSeenAt(null);
                                $em->persist($isforme);

                            }
                            break;
                        }
                        default: {
                            $this->addFlash(
                                'error',
                                'There was an error!'
                            );

                            return;
                        }
                    }
                    $em->flush();

                }
                $this->addFlash(
                    'notice',
                    $good.' message'.($good == 1 ? '' : 's').' changed!'
                );


            }
        }

        if ($action == 'unspam') {
            return $this->redirectToRoute('private_message_spam');
        } else {
            return $this->redirectToRoute('private_message_inbox');
        }

    }

作为symfony的新手,我不确定我的markAction功能有多好。我觉得它可以更简单,但我不确定如何制作它。

现在,我的实际问题。如何呈现我的捆绑包的其他页面,例如已发送或垃圾邮件?我必须更改的inboxAction中唯一的行是

 $mymsg = $messages->findMyMessages($this->getUser());
例如,

让它返回垃圾邮件或用户发送邮件。 和

return $this->render(
            '@PrivateMessage/inbox.html.twig',...

所以我实际上返回了相应页面的视图。我已经制作了其他页面并在其他操作中复制了代码,但我想我可以这样做,所以我一次编写这段代码,但不知道如何。

其他一切都完全相同。如何在所有其他操作中复制并粘贴此代码并使其更具可重用性?

1 个答案:

答案 0 :(得分:1)

你可以改变你的路线更加动态:

# app/config/routing.yml
mailclient:
    path:      /mailclient/{page}
    defaults:  { _controller: AppBundle:Mailclient:index, page: "inbox" }

结果是这条路线:

/mailclient
/mailclient/inbox
/mailclient/sent
/mailclient/trash

将全部调用相同的动作。

现在您的方法(Action)将获得一个额外的参数:

public function indexAction($page, Request $request)
{
    // ...
}

通过此参数,您可以了解用户希望看到的内容。现在您可以开始编写更具动态性的代码了。您可以考虑在控制器类中添加一些可以从indexAction调用的私有函数 你也可以简单地创建自己的类。