0

我想在我的项目中使用 Sentry 进行用户身份验证,并且我已经将它设置为工作。

我的想法是提供一种适配器来稍后更改实现。因为我们可能计划稍后更改为 LDAP,所以我想在我自己的类上调用所有函数。

我设置了一个新的 Facade 和一个名为的类UMS,简称User Management System我然后想调用UMS::check()而不是Sentry::check()

我该如何正确地做到这一点?我只想做:

<?php namespace Vendor\Dashboard;

class UMS extends \Sentry {

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

}

?>

到目前为止什么不起作用,因为我得到了一个Cannot call constructor例外。我有点困惑,因为我觉得 Laravel 有点滥用 Facade 模式来启用后期绑定。通常一个门面只指一个类。我只是想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',
),

将 Facade 添加到 app/config/app.php 中的别名列表中:

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

更新自动加载的类:

composer du --optimze

并使用它:

var_dump( UMS::check() );
var_dump( UMS::getUser() );
于 2013-09-17T20:23:36.477 回答
3

这是我目前的解决方案,不知道是否有更好的解决方案,但它有效,只需通过我自己的类调用 Sentry 上的函数

<?php namespace Vendor\Dashboard;

use Cartalyst\Sentry\Facades\Laravel\Sentry as Sentry;

class UMS {

    public function __construct() {

    }

    public static function check() {
        return Sentry::check();
    }

    public static function authenticate($credentials, $rememberme) {
        return Sentry::authenticate($credentials, $rememberme);
    }

    public static function logout () {
        return Sentry::logout();
    }

    public static function getUser() {
        return Sentry::getUser();
    }

    public static function getUserProvider() {
        return Sentry::getUserProvider();
    }

}

?>
于 2013-07-23T13:27:50.487 回答
0

您还可以将应用程序的 Sentry 实例注入到您的类中。下面是服务提供者(在注册函数中),但它是相似的:

$this->app['myPackage.user'] = $this->app->share(function($app)
    {
        return new myClass($app['sentry']);
    });

$this->app['myAlias'] = $this->app->share(function($app)
    {

        return new myPackage($app['myPackage.user']);
    });

然后,在 myClass 中:

class myClass {

    protected $sentry;

    function __construct($sentry){
        $this->sentry = $sentry;
    }

    public function getUser() {
        return $this->sentry->getUser();
    }

}

并根据需要添加您的功能。

于 2013-09-17T19:40:35.217 回答