0

プロジェクトでユーザー認証に Sentry を使用したいのですが、既に動作するように設定しています。

私の考えは、後で実装を変更するための一種のアダプターを提供することです。後で LDAP に変更する予定があるため、すべての関数を自分のクラスで呼び出したいと考えています。

新しいFacadeと という名前のクラスをセットアップしましUMSた。User Management SystemUMS::check()Sentry::check()

どうすればこれを適切に行うことができますか? 私はただやることを考えました:

<?php namespace Vendor\Dashboard;

class UMS extends \Sentry {

    public function __construct() {
       parent::__construct();
    }

}

?>

Cannot call constructor例外が発生するため、これまでのところ機能しません。LaravelがFacadeパターンを悪用して遅延バインディングを有効にしているように感じるので、少し混乱しています。通常、1 つのファサードは 1 つのクラスのみを参照します。後で実装を変更したいだけなので、コードUMSを呼び出しません。Sentryしかし、私はいつものようにすべてのメソッドを呼び出すことができるはずSentryです. たぶん解決策は明らかです

4

3 に答える 3

4

Laravel 4 では、クラスを適切に拡張して新しい Facade を作成するには、次のことを行う必要があります。

別のクラスに基づいて新しいクラスを作成します。

<?php namespace AntonioRibeiro\UserManagementSystem;

class UMS extends \Cartalyst\Sentry\Sentry {

    // For now your UMS class is identical to Sentry, so you must have nothing here, right?

}

クラスをインスタンス化する ServiceProvider を作成します。

<?php namespace AntonioRibeiro\UserManagementSystem;

use Illuminate\Support\ServiceProvider;

class UMSServiceProvider extends ServiceProvider {

    protected $defer = true;

    public function register()
    {
        $this->app['ums'] = $this->app->share(function($app)
        {
            // Once the authentication service has actually been requested by the developer
            // we will set a variable in the application indicating such. This helps us
            // know that we need to set any queued cookies in the after event later.
            $app['sentry.loaded'] = true;

            return new UMS(
                $app['sentry.user'],
                $app['sentry.group'],
                $app['sentry.throttle'],
                $app['sentry.session'],
                $app['sentry.cookie'],
                $app['request']->getClientIp()
            );
        });
    }

    public function provides()
    {
        return array('ums');
    }

}

ファサードを作成する:

<?php namespace AntonioRibeiro\UserManagementSystem;

use Illuminate\Support\Facades\Facade as IlluminateFacade;

class UMSFacade extends IlluminateFacade {

    protected static function getFacadeAccessor() { return 'ums'; }

}

サービス プロバイダーを app/config/app.php のリストに追加します。

'providers' => array(
    ...
    'AntonioRibeiro\UserManagementSystem\UMSServiceProvider',
),

app/config/app.php のエイリアスのリストに Facade を追加します。

'aliases' => array(
    ...
    'UMS'             => 'AntonioRibeiro\UserManagementSystem\UMSFacade',
),

自動ロードされたクラスを更新します。

composer du --optimze

そしてそれを使用します:

var_dump( UMS::check() );
var_dump( UMS::getUser() );
于 2013-09-17T20:23:36.477 に答える