使用Remember Token进行Laravel登录/用户问题

时间:2014-09-16 00:53:53

标签: php laravel login laravel-4 illuminate-container

我刚刚开始使用一年的Laravel项目为我的团契而且阻碍进步的主要障碍就在于此。任何帮助将不胜感激。下面的故事。

Laravel启动并运行后我尝试登录,我收到此错误:

Class User contains 3 abstract methods and must therefore be declared abstract or
implement the remaining methods 
(Illuminate\Auth\UserInterface::getRememberToken, 
Illuminate\Auth\UserInterface::setRememberToken,
Illuminate\Auth\UserInterface::getRememberTokenName)

我相信这可以通过http://laravel.com/docs/upgrade#upgrade-4.1.26修复,因此我按照建议将以下几行添加到用户:

public function getRememberToken(){ return $this->remember_token; }
public function setRememberToken($value){ $this->remember_token = $value; }
public function getRememberTokenName(){ return 'remember_token'; }

这消除了错误,但我仍然无法登录。我将使用正确的信息,但它似乎将我重定向回登录页面。经过进一步的研究,我发现我可能需要在我的数据库中有一个[b] remember_token [/ b]字段。我试图通过添加:

来添加和重新添加
$table->rememberToken(); 
[edit 2014-09-16, 07:05: added parens. they were in my code but forgotten in the post]

但是这产生了这个堆栈跟踪:

PHP Fatal error:  Call to undefined method Illuminate\Database\Schema\Blueprint::rememberToken() in /vagrant/www/vfamatching.dev/app/database/migrations/2013_11_01_033240_create_users_table.php on line 24
PHP Stack trace:
PHP   1. {main}() /vagrant/www/vfamatching.dev/artisan:0
PHP   2. Symfony\Component\Console\Application->run() /vagrant/www/vfamatching.dev/artisan:59
PHP   3. Symfony\Component\Console\Application->doRun() /vagrant/www/vfamatching.dev/vendor/symfony/console/Symfony/Component/Console/Application.php:121
PHP   4. Symfony\Component\Console\Application->doRunCommand() /vagrant/www/vfamatching.dev/vendor/symfony/console/Symfony/Component/Console/Application.php:191
PHP   5. Illuminate\Console\Command->run() /vagrant/www/vfamatching.dev/vendor/symfony/console/Symfony/Component/Console/Application.php:893
PHP   6. Symfony\Component\Console\Command\Command->run() /vagrant/www/vfamatching.dev/vendor/laravel/framework/src/Illuminate/Console/Command.php:96
PHP   7. Illuminate\Console\Command->execute() /vagrant/www/vfamatching.dev/vendor/symfony/console/Symfony/Component/Console/Command/Command.php:244
PHP   8. Illuminate\Database\Console\Migrations\MigrateCommand->fire() /vagrant/www/vfamatching.dev/vendor/laravel/framework/src/Illuminate/Console/Command.php:108
PHP   9. Illuminate\Database\Migrations\Migrator->run() /vagrant/www/vfamatching.dev/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php:67
PHP  10. Illuminate\Database\Migrations\Migrator->runMigrationList() /vagrant/www/vfamatching.dev/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php:84
PHP  11. Illuminate\Database\Migrations\Migrator->runUp() /vagrant/www/vfamatching.dev/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php:113
PHP  12. CreateUsersTable->up() /vagrant/www/vfamatching.dev/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php:137
PHP  13. Illuminate\Support\Facades\Schema::create() /vagrant/www/vfamatching.dev/app/database/migrations/2013_11_01_033240_create_users_table.php:25
PHP  14. Illuminate\Support\Facades\Facade::__callStatic() /vagrant/www/vfamatching.dev/app/database/migrations/2013_11_01_033240_create_users_table.php:25
PHP  15. Illuminate\Database\Schema\Builder->create() /vagrant/www/vfamatching.dev/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php:209
PHP  16. CreateUsersTable->{closure:/vagrant/www/vfamatching.dev/app/database/migrations/2013_11_01_033240_create_users_table.php:15-25}() /vagrant/www/vfamatching.dev/vendor/laravel/framework/src/Illuminate/Database/Schema/Builder.php:91
{"error":{"type":"Symfony\\Component\\Debug\\Exception\\FatalErrorException","message":"Call to undefined method Illuminate\\Database\\Schema\\Blueprint::rememberToken()","file":"\/vagrant\/www\/vfamatching.dev\/app\/database\/migrations\/2013_11_01_033240_create_users_table.php","line":24}}vagrant@devbox:/vagrant/www/

[编辑2014-09-16,07:05:试过观察者的回答] 在昨晚观察者的回答之后,我尝试通过替换

来使用他们的解决方案
$table->rememberToken(); with
$table->string('remember_token', 100);

迁移不再引发错误,但登录仍然挂起。另外,我应该指出Laravel建议使用rememberToken语法

我的登录路线

Route::get('login', array('as' => 'login', function () { return View::make('login'); }))->before('guest');
Route::post('login', 'UsersController@login');

和控制器方法

public function login() 
{ 
    $user = array(
        'email' => Input::get('email'),
        'password' => Input::get('password')
    );   
    if (Auth::attempt($user)) {
        Auth::user()->login();
        Auth::user()->lastLogin = Carbon::now();
        Auth::user()->save();
        if (Session::has('returnUrl'))
        {
            $intendedDestination = Session::get('returnUrl');
            Session::forget('returnUrl');
            return Redirect::to($intendedDestination)
            ->with('flash_success', 'You are successfully logged in.');
        }
        return Redirect::to('/')
            ->with('flash_success', 'You are successfully logged in.');
    }
    // authentication failure! lets go back to the login page
    return Redirect::route('login')
        ->with('flash_error', 'Your username/password combination was incorrect.')
        ->withInput();
}

2 个答案:

答案 0 :(得分:2)

'remember_token'只是一个varchar字段,应该像迁移中的任何其他字段一样创建:

$table->string('remember_token', 100)->nullable();

<强>更新

在回复您的评论时,您是正确的,架构构建器文档确实允许rememberToken方法,有趣的是upgrade guide没有提及它。它仅适用于Laravel v4.2及更高版本,截至本文撰写时,它只不过是上述代码的别名:

// File: /vendor/laravel/framework/src/Illuminate/Database/Schema/Blueprint.php
/**
 * Adds the `remember_token` column to the table.
 *
 * @return \Illuminate\Support\Fluent
 */
public function rememberToken()
{
    return $this->string('remember_token', 100)->nullable();
}

如果您使用4.2或更高版本,我将使用rememberToken函数而不是string函数来定义列,以防上述函数定义在以后的任何版本中发生更改。

至于您的登录尝试“挂起”,请使用相关的控制器方法更新您的问题,我可以帮助您。

答案 1 :(得分:0)

也许这只是一个小错误,rememberToken是一种方法,应该像这样调用:

$table->rememberToken();
相关问题