0

私の英語を許してください。

アクション側からではなく、他の機能からリダイレクトしたい。

コントローラ

public function editAction(Request $request, $id)
{
    $em = $this->getDoctrine()->getEntityManager();
    $article = $em->getRepository('MySampleBundle:Article')->find($id);

    // TODO:
    // Since other actions have the same processing,
    // I would like to do check work in other function. 
    // And when inaccurate,
    // I want to make it move from that function to other page. 
    $this->is_edit_granted($article);

    $form = $this->createForm(new ArticleType(), $article);

    if ($request->getMethod() == 'POST') {
        $form->bindRequest($request);
        if ($form->isValid()) {
            // ...
        }
    }

    return $this->render('MySampleBundle:Article:edit.html.twig', array(
        'form' => $form->createView(),
        'article' => $article,
    ));
}

public function is_edit_granted($article)
{
    // TODO:
    // I check not at the action side but at this place,
    // and want to make it move from this function to other page. 

    if (!$article) {
        throw $this->createNotFoundException('No article found.');
    } else if ( $article->getAuthor() != $this->getUser()->getId() ) {
        return $this->redirect( // doesn't work here
            $this->generateUrl('home', array(
                "id" => $article->getId()
            ))
        );
    }
}

私も同様のコードを試しました:

use Symfony\Component\HttpFoundation\RedirectResponse;

class SampleController extends Controller
{
    // ...

    public function editAction(Request $request, $id)
    {
        // ...

        $this->is_edit_granted($article);

        // ...
    }

    public function is_edit_granted($article)
    {
        if (!$article) {
            throw $this->createNotFoundException('No article found.');
        } else if ( $article->getAuthor() != $this->getUser()->getId() ) {
            return new RedirectResponse(
                $this->generateUrl('home', array(
                    "id" => $article->getId()
                ))
            );
        }
    }
}

しかし、それは機能しません。

Symfony2.1.2の環境で実行しています。どうすればそれを達成できますか?または、より良い方法はありますか?

4

2 に答える 2

3

次のようなことをします:

public function editAction(Request $request, $id)
{
    // ...

    $response = $this->is_edit_granted($article);
    if ($response) return $response;

    // ...
}

public function is_review_granted($article)
{
    if (!$article) {
        throw $this->createNotFoundException('No article found.');
    } else if ( $article->getAuthor() != $this->getUser()->getId() ) {
        return new RedirectResponse(
            $this->generateUrl('home', array(
                "id" => $article->getId()
            ))
        );
    }
    return null;
}
于 2012-10-17T09:27:32.227 に答える
1

フォームis_review_grantedを返さずにからリダイレクトすることはできません。したがって、カルロスグラナドスの答えは正しいです。RedirectResponseeditAction

別のオプションは、is_review_grantedメソッドでAccessDeniedExceptionをスローすることです。

public function is_review_granted($article)
{
    if (!$article) {
        throw $this->createNotFoundException('No article found.');
    } else if ( $article->getAuthor() != $this->getUser()->getId() ) {
        throw new Symfony\Component\Security\Core\Exception\AccessDeniedException('no acces');
    }
}

ACLSecurityVotersなどのより詳細なソリューションを探すこともできます。

于 2012-10-17T10:57:25.383 に答える