Я только начал работать с годичным проектом 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] запомнить_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/
[edit 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();
}
'remember_token'
это просто varchar
поле и должно быть создано как любой другой в миграции:
$table->string('remember_token', 100)->nullable();
Обновить
В ответ на ваш комментарий вы правы, документация по построителю схемы позволяет rememberToken
метод, интересно, что руководство по обновлению не упоминает об этом. Он доступен только в 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
функция для определения столбца, на случай, если определение функции выше изменится в любых будущих версиях.
Что касается вашей попытки входа в систему «завис», пожалуйста, обновите ваш вопрос с помощью соответствующего метода контроллера, и я, возможно, могу помочь вам в дальнейшем.
Может быть, это просто небольшая ошибка, RememberToken — это метод, который следует вызывать так:
$table->rememberToken();