Laravel:仅在某些路线中隐藏模型中的属性

时间:2016-04-14 01:12:13

标签: php laravel model hide

如何在某些路线中隐藏模型中的某些属性,例如:

我使用protected $ hidden隐藏元素,但这隐藏在我的所有功能或宁静路线中(索引,显示)

 $hidden = [
  'coachVisibility', 'thumbnail', 'studentVisibility',
  'isHTML', 'studentIndex', 'coachIndex',
  'isURL', 'source', 'path',
  'status', 'updateTime', 'isfolder',
  'parentResource', 'idModifierUser', 'idResourceType',
  'idCreatorUser', 'idCreationCountry', 'user',
  'country', 'resource'
];

我想只隐藏在索引功能中但在show功能中我不想隐藏任何东西。

2 个答案:

答案 0 :(得分:4)

您可以在模型上使用addHidden方法:

class UsersController
{
    public function index ()
    {
        return User::all()->each(function ($user) {
            $user->addHidden([.........]);
        });
    }
}

合并this PR后,您就可以直接在集合上调用它:

class UsersController
{
    public function index ()
    {
        return User::all()->makeHidden([.........]);
    }
}

根据您的评论,您可以将所有这些字段保留在模型的$hidden属性中,而只是在show方法中显示它们:

public function show($id)
{
    return CTL_Resource::where('idResource', $id)
        ->with('tags', 'quickTags', 'relatedTo')
        ->firstOrFail()->makeVisible([
            'coachVisibility', 'thumbnail', 'studentVisibility'
        ]);
}

答案 1 :(得分:2)

考虑使用Transformers按照您的意愿转换返回数据。

例如:

创建一个抽象的Transformer:

namespace App\Transformers;

abstract class Transformer
{

    public function transformCollection(array $items)
    {
        return array_map([$this, 'transform'], $items);
    }

    public abstract function transform($item);
}

如果您愿意,可为每种方法创建自定义变换器:

namespace App\Transformers;

use App\User;

class UserTransformer extends Transformer {

    public function transform($user) {

         return [
             'custom_field' => $user['foo'],
             'another_custom_field' => $user['bar']
             ...
        ];

    }
}

然后在你的控制器中:

...

public function index(Request $request, UserTransformer $transformer)
{
    $users = User::all();

    return response()->json([
        'users' => $transformer->transformCollection($users->toArray())
     ], 200);
}

这有几个好处:

  1. 您可以根据需要使用特定变换器显示/隐藏数据
  2. 如果您决定更改表格中的列名称,您的变换器将确保获取数据的客户不会中断。