2013-12-11 96 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;)。