У меня есть следующий обработчик событий в моей модели:
<?php
namespace App\Model;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
//...
public static function boot()
{
parent::boot();
static::saving(function ($user) {
// die('inside');
if (empty($user->username)) {
$base = strtolower($user->first_name . '.' . $user->last_name);
do {
$username = $base . @$suffix;
$duplicate = User::where('username', '=', $username)->first();
} while($duplicate and $suffix = rand(1000, 9999));
// return the original/ generated username
$user->username = $username;
}
});
}
}
В основном, когда имя пользователя не установлено, модель автоматически генерирует уникальное имя пользователя из имени / фамилии. Это отлично работает в браузере. Но не в CLI, когда я запускаю свои тесты — имя пользователя не установлено, поэтому он пытается вставить без имени пользователя, которое не принимает моя таблица mysql.
Ниже описано, как я настраиваю консоль Eloquent:
$capsule = new \Illuminate\Database\Capsule\Manager;
$capsule->addConnection([
'driver' => 'mysql',
'host' => 'localhost',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'database' => 'sso_dev',
'username' => 'root',
'password' => 'vagrant1',
]);
$capsule->setEventDispatcher( new \Illuminate\Events\Dispatcher( new \Illuminate\Container\Container ));
$capsule->bootEloquent();
$capsule->setAsGlobal();
И веб-среда, и тестирование используют один и тот же код. Если я прокомментирую строку setEventDispatcher
затем среда браузера выдает ошибку, поскольку обработчик событий не запускается. Так что я знаю, что диспетчер событий выполняет свою работу там. Просто не тестирование среды CLI. Любая причина, почему это может быть?
Кстати, я использую Eloquent 5.3.
Задача ещё не решена.
Других решений пока нет …