Я хочу отправить различную базу ответов в зависимости от роли пользователя в моем контроллере, в 2-м проекте я придумаю способ приблизиться к этому.
1 - мой первый подход заключается в наличии ресурса для каждого ответа.
мой контроллерпримерно так:
$user = $request->user;
$role = $user->role;
$firstPost = Post::where('user_id',$user->getKey())->first();
$postResourceBuilder = new PostResourceBuilder($firstPost,$role);
return $postResourceBuilder->getResource();
затем в моем PostResourceBuilder:
class PostResourceBuilder {
private $post;
private $role;
public function __construct($post,$role){
$this->post = $post;
$this->role = $role;
}
public function getResource(){
switch($this->role){
case 'Client':
return new ClientPostResource($this->post);
default :
return new DefaultPostResource($this->post);
}
}
}
но в другом проекте я пришел с другим подходом:
2 - я делаю новый класс ресурсов и всемои ресурсы расширяют его:
class BaseResource extends JsonResource
{
protected $mode = 'Default';
public function setMode($mode)
{
$this->mode = $mode;
}
public function toArray($request)
{
return call_user_func([$this,$this->getMethodName()],$request);
}
public function getDefaultResource($request)
{
return parent::toArray($request);
}
protected function getMethodName(){
$methodName = 'get'.$this->mode.'Resource';
return method_exists($this,$methodName) ? $methodName : 'getDefaultResource';
}
}
затем в моем PostResource:
class PostResource extends BaseResource
{
public function getClientResource($request)
{
//...
}
}
и в моем контроллере:
$user = $request->user;
$role = $user->role;
$firstPost = Post::where('user_id',$user->getKey())->first();
$postResource = new PostResource($firstPost,$role);
$postResource->setMode($role);
// if it's collection
// $postResource->collection->each->setMode($role)
return $postResource;
после того, как я это сделаю, мне интересно, какой из нихлучше