Проблемы Laravel, Behat и Faker со скрытыми атрибутами

Я использую Laravel со следующими библиотеками:

В модели пользователя у меня скрыт атрибут пароля, поэтому, когда я выполняю GET, он работает должным образом, покажите все атрибуты с наименьшим паролем

Теперь, когда я делаю POST с моделью, созданной из Faker, я не могу отправить пароль атрибута.

Фабрика мошенников

<?php

$factory->define(App\User::class, function (Faker\Generator $faker) {
    $role = App\Role::all()->random(1);
    return [ 
        'role_id' => $role->id,
        'username' => $faker->userName,
        'first_name' => $faker->firstName,
        'last_name' => $faker->lastName,
        'email' => $faker->safeEmail,
        'password' => str_random(10),
    ];
});

Модель пользователя

<?php

namespace App;

use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{

protected $hidden = [ 'password' ];

/* rest of the code */
/* I have a validation rule for password to be required */

Функция пользовательского контекста

<?php
/**
 * @When I try to save a valid user   
*/
public function iTryToSaveAValidUser()
{
    $modelFake = factory('App\User')->make();
    $client = new GuzzleHttp\Client();
    $data['data'] = $modelFake;
    $res = $client->request('POST', url($this->apiURL . '/user'),[ 'json' => $data ]);
}

Я получаю сообщение об ошибке: требуется пароль, есть способ установить скрытый ТОЛЬКО при GET?

Я «исправил» эту проблему с помощью следующего кода, но мне это не нравится

<?php
/**
 * @When I try to save a valid user   
*/
public function iTryToSaveAValidUser()
{
    $modelFake = factory('App\User')->make();
    $client = new GuzzleHttp\Client();
    $modelArray = $modelFake->toArray();
    $modelArray['password'] = str_random(10);
    $data['data'] = $modelArray;
    $res = $client->request('POST', url($this->apiURL . '/user'),[ 'json' => $data ]);
}

Заранее спасибо!


person AgeValed    schedule 04.07.2016    source источник


Ответы (1)


Я думаю, что это из-за этой строки

$res = $client->request('POST', url($this->apiURL . '/user'),[ 'json' => $data ]);

где вы отправляете атрибут как json.

Прочитайте это правильно, это может помочь.

Скрытие атрибутов из JSON

Иногда вам может понадобиться ограничить атрибуты, такие как пароли, которые включены в массив вашей модели или представление JSON. Для этого добавьте в модель определение свойства $hidden:

Примечание. При скрытии отношений используйте имя метода отношения, а не имя его динамического свойства.

Кроме того, вы можете использовать свойство visible для определения белого списка атрибутов, которые должны быть включены в массив вашей модели и представление JSON:

protected $visible = ['password']

Временное изменение видимости ресурса

Если вы хотите сделать некоторые обычно скрытые атрибуты видимыми в данном экземпляре модели, вы можете использовать метод makeVisible. Метод makeVisible возвращает экземпляр модели для удобной цепочки методов:

return $user->makeVisible('attribute')->toArray();
person Vanya Avchyan    schedule 04.07.2016
comment
Спасибо!! Я добавил $modelFake->makeVisible('password'); в функцию контекста и отлично работает! - person AgeValed; 05.07.2016