如何在Laravel 4中扩展类Confide?

时间:2013-12-11 11:00:01

标签: php laravel laravel-4

我想扩展/覆盖类logAttemptConfide on GitHub)中的方法Confide,以便在有人成功登录时执行一些额外的代码。这比将相同的代码复制到调用logAttempt的所有控制器更简洁。

我在阅读了关于stackoverflow的Laravel文档和几个答案,但我无法让它工作。

我使用名为app/extensions的文件

创建了一个新文件夹Confide.php
<?php

namespace Extensions;

class Confide extends \Zizaco\Confide\Confide {

    public function __construct(ConfideRepository $repo) {
        die('no way!');
        $this->repo = $repo;
        $this->app = app();
    }

    public function logAttempt($credentials, $confirmed_only = false, $identity_columns = array()) {
        die('yeah man!');
    }
}

我将目录添加到app/start/global.php

ClassLoader::addDirectories(array(
    // ...
    app_path().'/extensions',
));

我还将其添加到composer.json并运行composer dump-autoload

"autoload": {
    "classmap": [
        ...,
        "app/extensions"
    ]
},

我自己的Confide类似乎根本没有被加载,因为Confide正常工作 - 没有die() - 。

如果我在包含命名空间的控制器中使用\Extensions\Confide::logAttempt($input, true);,我会收到此ErrorException:

  

非静态方法Extensions \ Confide :: logAttempt()不应该静态调用,假设来自不兼容的上下文的$ this

我是否真的需要自己的ConfideServiceProvider课程?我也试过了,但我不确定在那里放什么让Confide使用我的扩展课程。

有没有简单的方法来扩展一小部分类?必须有,我只是在这里遗漏了一些东西。

3 个答案:

答案 0 :(得分:1)

如果您希望在用户登录时执行某些代码,则应该只监听该事件。在这种情况下,我相信Confide使用Auth类登录,因此您应该能够监听该事件。

Event::listen('auth.login', function($user)
{
    $user->last_login = new DateTime;
    $user->save();
});

我发现这比担心扩展课程更容易,更清洁。

答案 1 :(得分:0)

编辑:犯了错误

我认为你需要调用这样的方法:

\Extensions\Confide->logAttempt($input, true);

因为您正在使用:

\Extensions\Confide::logAttempt($input, true);

您调用静态方法的方法如何。

答案 2 :(得分:0)

我想我终于明白了。

我必须像ConfideServiceProvider一样扩展<?php namespace Extensions; class ConfideServiceProvider extends \Zizaco\Confide\ConfideServiceProvider { /** * Bootstrap the service provider. * * @return void */ public function boot() { $this->package('extensions/confide'); } /** * Register the application bindings. * * @return void */ protected function registerConfide() { $this->app->bind('confide', function($app) { return new Confide($app->make('confide.repository')); }); } }

app/extensions/ConfideServiceProvider.php

上面的代码进入boot()。注意:在registerConfide()中,我将“zizaco”替换为“extensions”,而在app/config/app.php中我根本没有做任何更改,但如果扩展类中不存在此方法,则将使用原始类。我不知道为什么。

然后在Zizaco\Confide\ConfideServiceProvider中,我将Extensions\ConfideServiceProvider替换为Confide

我自己的扩展<?php namespace Extensions; class Confide extends \Zizaco\Confide\Confide { public function logAttempt($credentials, $confirmed_only = false, $identity_columns = array()) { $result = parent::logAttempt($credentials, $confirmed_only, $identity_columns); if ($result) { // Login successful. Do some additional stuff. \Log::info('User ' . \Auth::user()->username . ' logged in.'); } return $result; } } 类现在看起来像这样:

Log

注意:如果您想使用任何其他标准Laravel类,例如Sessionuse等,请在前面添加一个反斜杠,如上例所示,或添加use \Log;您使用的每个类的运算符(例如{{1}})。