我想扩展/覆盖类logAttempt
(Confide 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使用我的扩展课程。
有没有简单的方法来扩展一小部分类?必须有,我只是在这里遗漏了一些东西。
答案 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类,例如Session
,use
等,请在前面添加一个反斜杠,如上例所示,或添加use \Log;
您使用的每个类的运算符(例如{{1}})。