2013-12-11 58 views
2

我想要扩展/为了每当有人成功登录到执行一些额外的代码覆盖在Confide类(Confide on GitHub)的方法logAttempt。这会比将相同的代码复制到调用logAttempt的所有控制器更清洁。如何扩展Laravel 4中的类Confide?

我通过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() -ing。

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

非静态方法扩展\倾诉:: logAttempt()不应该被静态调用,假设$这个从不兼容背景

我真的需要我自己的ConfideServiceProvider类吗?我也尝试过,但我不确定要在那里放置Confide使用我的扩展类。

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

回答

1

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

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

我觉得这比放心上课更容易,更清洁。

+0

我其实正在寻找一个可以进入的事件,但没有找到任何东西我稍后再尝试一下,如果它起作用,那将确实更清洁。 – Nick

+1

这是我接受的答案,因为它以一种更简单的方式解决了我的实际问题,尽管我要求一种不同的解决方案,因为我不知道更好。它的工作原理和我正在使用它,只需要一个自己的类作为监听器(如下所述:http://four.laravel.com/docs/events#using-classes-as-listeners) – Nick

0

编辑:犯了错误

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

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

因为你使用:

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

这就是你怎么骂静态方法。

+0

谢谢,但这不幸的是不起作用。我的控制器中没有'Confide'实例。这确实有点混乱。原始代码(工作)是'if(Confide :: logAttempt($ input,true)){...}',而原始方法'logAttempt'实际上并不是静态的(https://github.com/Zizaco /confide/blob/master/src/Zizaco/Confide/Confide.php)。 – Nick

+0

好吧,看起来好像laravel 4在引擎盖下使用了一些魔法,使得它看起来好像你实际上没有使用静态方法。我唯一需要做的其他事情就是将其添加到app/config/app.php中的别名列表中,如果您使用其中一个用于确认,那么已经将它作为扩展目录中的名称空间点。 – mic

+0

然后只需使用别名 – mic

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()中,我用“extensions”代替了“zizaco”,在registerConfide()中我根本没有做任何更改,但是如果这种方法在扩展类中不存在,则将使用原始类。我不知道为什么。

然后在app/config/app.php我用Extensions\ConfideServiceProvider代替Zizaco\Confide\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; 
    } 
} 

注意:如果你想使用任何其他标准Laravel类像LogSession等前缀它与一个反斜杠如图所示的例子以上,或者为您使用的每个课程添加use运算符(例如use \Log;)。