Dynami c подсказка типа в Laravel для запроса формы - PullRequest
0 голосов
/ 20 февраля 2020

Я создал базовый контроллер и хочу динамически напечатать подсказку для метода store, чтобы использовать соответствующий класс Form Request. Как я могу это сделать?

Вот мой базовый контроллер (упрощенно):

class BaseController extends Controller
{
  protected $baseClass;
  protected $baseResourceClass;
  protected $baseStoreRequestClass;

  public function index()
  {
     $items = $baseClass::paginate(10);
     return $baseResourceClass::collection($items);
  }

  // the $baseStoreRequestClass doesn't work, and that's what I'm trying to figure it out
  public function store(**$baseStoreRequestClass** $request)
  {
     $validatedFields = $request->validated();
     $newItem = $baseClass::create($validatedFields);
     return new $baseResourceClass($newItem);
  }
}

Затем из расширяющегося контроллера мне нужно будет просто объявить 3 переменные. Пример:

class UserController extends BaseController
{
  protected $baseClass = '\App\User';
  protected $baseResourceClass = '\App\Http\Resources\UserResource';
  protected $baseStoreRequestClass = '\App\Http\Requests\StoreUser';
}

class ProductController extends BaseController
{
  protected $baseClass = '\App\Product';
  protected $baseResourceClass = '\App\Http\Resources\roductResource';
  protected $baseStoreRequestClass = '\App\Http\Requests\StoreProduct';
}

Как я могу заставить работать $ baseStoreRequestClass ?

1 Ответ

2 голосов
/ 21 февраля 2020

Нельзя указать тип Dynami c в качестве параметра функции. Это просто неверный синтаксис PHP. Вот что я предлагаю. Вашим базовым классом будет шаблон:

class BaseController extends Controller
{
  protected $baseClass;
  protected $baseResourceClass;

  public function index()
  {
     $items = $baseClass::paginate(10);
     return $baseResourceClass::collection($items);
  }

  public function store(FormRequest $request) // Or other base request object you might create
  {
     $validatedFields = $request->validated();
     $newItem = $baseClass::create($validatedFields);
     return new $baseResourceClass($newItem);
  }
}

Тогда каждому контроллеру подкласса потребуется явный тип запроса:

class UserController extends BaseController
{
  protected $baseClass = '\App\User';
  protected $baseResourceClass = '\App\Http\Resources\UserResource';
  public function store(StoreUser $request) {
      return parent::store($request);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...