如何在某些路线中隐藏模型中的某些属性,例如:
我使用protected $ hidden隐藏元素,但这隐藏在我的所有功能或宁静路线中(索引,显示)
$hidden = [
'coachVisibility', 'thumbnail', 'studentVisibility',
'isHTML', 'studentIndex', 'coachIndex',
'isURL', 'source', 'path',
'status', 'updateTime', 'isfolder',
'parentResource', 'idModifierUser', 'idResourceType',
'idCreatorUser', 'idCreationCountry', 'user',
'country', 'resource'
];
我想只隐藏在索引功能中但在show功能中我不想隐藏任何东西。
答案 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);
}
这有几个好处: