Laravel,Behat&具有隐藏属性的Faker问题

时间:2016-07-04 20:28:18

标签: php laravel faker

我正在使用Laravel以下库:

在用户模型上我隐藏了密码属性,因此当我执行GET时它按预期工作,显示所有属性最少密码

现在,当我使用从Faker创建的模型进行POST时,我无法发送属性密码。

Faker Factory

<?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 ]);
}

提前致谢!

1 个答案:

答案 0 :(得分:1)

我认为这是由于这一行

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

您将属性发送为json。

正确阅读,这可以提供帮助。

<强> Hiding Attributes From JSON

有时您可能希望限制模型的数组或JSON表示中包含的属性,例如密码。为此,请向模型添加$ hidden属性定义:

  

注意:隐藏关系时,请使用关系的方法名称,   而不是它的动态属性名称。

或者,您可以使用visible属性来定义应包含在模型的数组和JSON表示中的属性的白名单:

protected $visible = ['password']

暂时修改属性可见性

如果您想在给定的模型实例上显示一些通常隐藏的属性,可以使用makeVisible方法。 makeVisible方法返回模型实例以方便方法链接:

return $user->makeVisible('attribute')->toArray();