Какой из них лучше подходит для того, чтобы иметь различную базу ответов в зависимости от роли пользователя: использовать 1 ресурс или несколько ресурсов? - PullRequest
0 голосов
/ 05 декабря 2018

Я хочу отправить различную базу ответов в зависимости от роли пользователя в моем контроллере, в 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;

после того, как я это сделаю, мне интересно, какой из нихлучше

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...