У меня есть модель, которая наследуется от пакета Toddish \ Verify Laravel ( https://github.com/Toddish/Verify-L4/blob/master/src/Toddish/Verify/Models/User.php )
Все, что я хочу сделать, это добавить некоторые атрибуты:
use Toddish\Verify\Models\User as VerifyUser; class User extends VerifyUser { public function __construct (array $attributes = array()) { parent::__construct($attributes); $this->fillable = array_merge ($this->fillable, array( 'salutation', 'title', 'firstname', 'lastname', 'phonenumber', 'mobilenumber' )); } }
Когда я запускаю тест:
class UserTest extends TestCase { public function testUserCreation () { $user = User::create( [ 'username' => 'testusername', 'email' => 'email@test.com', 'password' => 'testpassword', 'salutation' => 'MrTest', 'title' => 'MScTest', 'firstname' => 'Testfirstname', 'lastname' => 'Testlastname', 'phonenumber' => 'testPhoneNumber', 'mobilenumber' => 'testMobileNumber', ] ); $this->assertEquals($user->salutation, 'MrTest'); $this->assertEquals($user->title, 'MScTest'); $this->assertEquals($user->firstname, 'Testfirstname'); $this->assertEquals($user->lastname, 'Testlastname'); $this->assertEquals($user->phonenumber, 'testPhoneNumber'); $this->assertEquals($user->mobilenumber, 'testMobileNumber'); } }
Я получаю следующее:
1) UserTest::testUserCreation Failed asserting that 'MrTest' matches expected null.
Все утверждения возвращают null. Но я проверил и столбцы базы данных существуют. Так почему же этот атрибут null?
РЕДАКТИРОВАТЬ:
Если я поменяю параметры assert:
$this->assertEquals('MrTest', $this->salutation);
Я получаю это:
ErrorException: Undefined property: UserTest::$salutation
Вам нужно будет переместить заполняемое переопределение, чтобы оно было выше вызова parent::__construct($attributes);
Делая это:
public function __construct (array $attributes = array()) { $this->fillable = array_merge ($this->fillable, array( 'salutation', 'title', 'firstname', 'lastname', 'phonenumber', 'mobilenumber' )); parent::__construct($attributes); }
Это связано с тем, что главный конструктор классов Model
использует fillable
массив, поэтому его необходимо установить до вызова конструктора.
[EDIT] Обновленный ответ включает только раздел, который требуется, и добавил некоторое объяснение, почему это так