Как расширить класс auth Guard Laravel?

Я пытаюсь расширить фреймворк Laravel по авт гвардии класс одним дополнительным методом, поэтому я могу вызвать Auth::myCustomMethod() в конце.

после раздела документации Расширение Рамок я застрял на том, как именно это сделать, потому что у самого класса Guard нет собственного привязка МОК что я мог бы переопределить.

вот код, демонстрирующий, что я пытаюсь сделать:

namespace FoobarExtensionsAuth;

class Guard extends IlluminateAuthGuard {

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

}

теперь, как я должен зарегистрируйте расширенный класс FoobarExtensionsAuthGuard для использования вместо оригинала IlluminateAuthGuard Так что я могу называть Auth::myCustomMethod() так же, как, например,Auth::check()?

одним из способов было бы заменить Auth псевдоним в app/config/app.php но я не уверен, если это действительно лучший способ решить эту.

кстати: я использую Laravel 4.1.

2 ответов


Я бы создал свой собственный сервис UserProvider, который содержит методы, которые я хочу, а затем расширить Auth.

я рекомендую создать свой собственный поставщик услуг или прямо расширить класс Auth в одном из файлов запуска (например. start/global.php).

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

это хорошо руководство вы можете следовать, чтобы получить лучшее понимание

есть еще один метод, который вы можете использовать. Это будет включать в себя расширение одного из нынешних поставщиков, таких как Красноречивый.

class MyProvider extends Illuminate\Auth\EloquentUserProvider {

    public function myCustomMethod()
    {
        // Does something 'Authy'
    }
}

тогда вы можете просто расширить auth, как указано выше, но с вашим настраиваемым поставщиком.

\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'.


единственный способ добавить (а также заменить существующие функции) - создать копию гвардии.в PHP файл в вашем проекте и в app / start / global.в PHP добавить:

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

конечно, это уродливый метод, но я потратил более часа, чтобы проверить все возможности [как изменить вещи, хранящиеся в сеансе Auth], и это всегда заканчивается ошибкой: ... _contruct класса HSGuard требует, чтобы первый параметр был "UserProviderInterface" и получал "EloquentUserProvider"...