16

ログアウト確認メッセージを表示するフラッシュメッセージを設定したいログアウトリスナーがあります。

namespace Acme\MyBundle\Security\Listeners;

use Symfony\Component\Security\Http\Logout\LogoutSuccessHandlerInterface;
use Symfony\Component\Security\Core\SecurityContext;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RedirectResponse;

class LogoutListener implements LogoutSuccessHandlerInterface
{
  private $security;  

  public function __construct(SecurityContext $security)
  {
    $this->security = $security;
  }

  public function onLogoutSuccess(Request $request)
  {
    $request->get('session')->getFlashBag()->add('notice', 'You have been successfully been logged out.');

    $response = new RedirectResponse('login');
    return $response;
  }
}

これが私のservices.ymlです(これに関連しています):

logout_listener:
   class:  ACME\MyBundle\Security\Listeners\LogoutListener
   arguments: [@security.context]

これはエラーを生成しています:

Fatal error: Call to a member function getFlashBag() on a non-object

このコンテキストでflashBagメッセージを設定するにはどうすればよいですか?

また、ハードコードされたURLを渡す代わりに、($ this-> router-> generate('login')を介して)URLを生成できるように、ルーターにアクセスするにはどうすればよいですか?

解決策に関する注意

フラッシュを機能させるには、security.ymlconfigがログアウト時にセッションを無効にしないように指示する必要があります。そうしないと、セッションが破棄され、フラッシュが表示されなくなります。

logout:
    path: /logout
        success_handler: logout_listener
        invalidate_session: false
4

2 に答える 2

29

セッションとルーターのサービスをLogoutListenerに挿入し、それらを使用してこれらのタスクを実行する必要があります。これはymlでそれを行う方法です:

logout_listener: 
class: ACME\MyBundle\Security\Listeners\LogoutListener 
arguments: [@security.context, @router, @session]

次に、クラスで次のように記述します。

class LogoutListener implements LogoutSuccessHandlerInterface
{
    private $security;
    private $router;
    private $session;

    public function __construct(SecurityContext $security, Router $router, Session $session)
    {
        $this->security = $security;
        $this->router = $router;
        $this->session = $session;
    }
    [...]

今すぐセッションを使用したい場合は、次のように言うことができます。

$this->session->getFlashBag()->add('notice', 'You have been successfully been logged out.');

同様に、ルーターサービスを使用してルートを生成できます。

于 2012-11-12T17:35:32.657 に答える
1

セッションオブジェクト(およびその他のサービス)は、サービスコンテナを介して取得できます。

$session = $ServiceContainer->get('session');
$session->setFlash('notice', 'Message');

さまざまな方法でサービスコンテナにアクセスする方法:

  • コントローラまたはコンテナ対応クラスから:$ this-> get('session');を使用するだけです。
  • サービスから:AldoSaidとしてサービスコンテナオブジェクトを注入する必要があります
于 2012-11-12T18:00:45.327 に答える