1

私はSymfonyに少し慣れていませんが、簡単に説明できる状況があります:

公開ホームページと非公開ホームページがあります。URL「/」でこれらの両方にアクセスできるようにしたいと思います

認証されていない人がアドレス www.example.com/ にアクセスした場合、それらを PublicController::indexAction() にルーティングしたいと思います

認証されたユーザーがアドレス www.example.com/ にアクセスすると、Privatecontroller::indexAction() にルーティングされるようにしたいと思います。

これは可能ですか?

(symfony 2.7 ところで)

4

2 に答える 2

1

詳細は各コントローラー アクションで何をしているかによって異なりますが、もちろん可能です。最も簡単な方法は次のとおりです。

class PublicController extends \Symfony\Bundle\FrameworkBundle\Controller\Controller
{
    public function indexAction()
    {
        if ($this->getUser() !== null) {
            return $this->forward('BundleName:PrivateController:index');
        }

        // do public controller details
    }
}

したがって、デフォルトでは全員が に送信され、( Symfony の Controller クラスのメソッドPublicController:indexActionを使用して) ログインしているユーザーがいるかどうかをチェックし、存在する場合は、リクエストをに転送します。そうでない場合は、期待どおりに公開アクションを示しているだけです。(Symfony がサブリクエストを作成してディスパッチするため) 転送のパフォーマンスが低下するため、ログアウトしたユーザーよりも多くのログインしているユーザーが予想される場合は、これを逆にすることができます。getUserPrivateController:indexAction

より長い答えは、それらを分離する必要がある各コントローラーで何をしているかを理解し、機能をサービスに結合するか、そうでなければそれらを再構築できるかどうかを理解することです。特定の問題ドメインについて詳しく知らなくても、上記が最善の方法のように思えます。

于 2015-08-15T19:23:52.913 に答える
0

Symfony (常に最新バージョンを使用) で実行されているソーシャル ネットワークのスタートアップを手に入れたので、当然のことながら、最初にログインしているかどうかに応じてホームページに異なるコンテンツを表示するというこの課題に遭遇しました。ユーザーID。上記の答えは機能しますが、render_esi タグを使用してリバース プロキシ キャッシュを使用し、データベース ルックアップだけでなく、テンプレート生成と Symfony にヒットするリクエスト全体を回避できるため、どのコンテンツを表示するために twig を使用する方がはるかに優れていてパフォーマンスが高いことがわかりました。

例えば

{# src/MyApp/AppBundle/Resources/views/Page/index.html.twig #}
{% extends 'MyAppAppBundle::layout.html.twig' %}
.....
    {% block body %}
        {% if not app.user %}
Code for non-logged in user
e.g. {{ render_esi(controller('MyAppAppBundle:Home:non_logged_in_user')) }}
        {% else %}
Code for logged in user
e.g {{ render_esi(controller('controller('MyAppAppBundle:Home:logged_in_user', { 'user': app.user.id })) }}
        {% endif %}
....
    {% endblock %}
于 2015-08-17T18:00:44.697 に答える