【问题标题】:How to extend Laravel's Auth Guard class?如何扩展 Laravel 的 Auth Guard 类?
【发布时间】:2014-01-09 04:19:10
【问题描述】:

我正在尝试通过另一种方法扩展 Laravel 的 Auth Guard 类,因此我可以在最后调用 Auth::myCustomMethod()

按照文档部分Extending The Framework,我不知道如何准确地做到这一点,因为 Guard 类本身没有我可以覆盖的 IoC binding

这里有一些代码展示了我正在尝试做的事情:

namespace Foobar\Extensions\Auth;

class Guard extends \Illuminate\Auth\Guard {

    public function myCustomMethod()
    {
        // ...
    }

}

现在我应该如何注册要使用的扩展类 Foobar\Extensions\Auth\Guard 而不是原来的 Illuminate\Auth\Guard,这样我就可以像调用 Auth::myCustomMethod() 一样使用例如Auth::check()?

一种方法是替换 app/config/app.php 中的 Auth 别名,但我不确定这是否真的是解决此问题的最佳方法。

顺便说一句:我使用的是 Laravel 4.1。

【问题讨论】:

    标签: php authentication laravel extending


    【解决方案1】:

    我会创建自己的 UserProvider 服务,其中包含我想要的方法,然后扩展 Auth。

    我建议创建您自己的服务提供者,或者直接在其中一个启动文件中扩展 Auth 类(例如,start/global.php)。

    Auth::extend('nonDescriptAuth', function()
    {
        return new Guard(
            new NonDescriptUserProvider(),
            App::make('session.store')
        );
    });
    

    这是一个很好的tutorial you can follow to get a better understanding

    您可以使用另一种方法。这将涉及扩展当前的提供者之一,例如 Eloquent。

    class MyProvider extends Illuminate\Auth\EloquentUserProvider {
    
        public function myCustomMethod()
        {
            // Does something 'Authy'
        }
    }
    

    然后您可以像上面一样扩展身份验证,但使用您的自定义提供程序。

    \Auth::extend('nonDescriptAuth', function()
    {
        return new \Illuminate\Auth\Guard(
            new MyProvider(
                new \Illuminate\Hashing\BcryptHasher,
                \Config::get('auth.model')
            ),
            \App::make('session.store')
        );
    });
    

    一旦您实现了代码,您将更改auth.php 配置文件中的驱动程序以使用“nonDescriptAuth”。

    【讨论】:

    • 感谢您的回答大卫!我希望有一种比创建自己的 UserProvider 来扩展 Guard 类更简单的方法。我会等一段时间看看有没有其他建议。
    • @HolgerWeis 我已经添加了一个简单的方法来扩展 Auth 与当前 Eloquent 驱动程序的扩展。 Auth::extend 代码应该按原样工作。
    【解决方案2】:

    添加(以及替换现有函数)的唯一方法是在您的项目中创建 Guard.php 文件的副本并在 app/start/global.php 添加:

    require app_path().'/models/Guard.php';
    

    当然这是丑陋的方法,但我花了一个多小时来测试所有可能性[如何通过 Auth 更改存储在 Session 中的东西],它总是以错误结束: ... HSGuard 类的 _contruct 要求第一个参数为“UserProviderInterface”并获取“EloquentUserProvider”...

    【讨论】:

      猜你喜欢
      • 2016-09-07
      • 2016-07-30
      • 2017-09-06
      • 1970-01-01
      • 2020-04-22
      • 2016-03-11
      • 1970-01-01
      • 2013-01-15
      • 2021-10-24
      相关资源
      最近更新 更多