Я создаю форму для создания и редактирования записей.
Поскольку я использую много реляционной информации (таблиц) из нескольких каталогов и показываю в for как поле выбора (Select2), мне нужно получить все данные, которые будут отображаться в этих тегах выбора HTML.
Итак, предположим, что в моем контроллере в методе create() я называю эту информацию следующим образом:
create() метод MyController.php:
public function create(Token $token){
//Tags
$universities = University::orderBy('name')->get();
$countries = Country::orderBy('name')->get();
$programs = Program::orderBy('name')->get();
//... and many more
return view('my.form.create',[
'universities' => $universities,
'countries' => $countries,
'programs' => $programs,
'token' => $token
]);
}
Как мне повторно использовать этот фрагмент кода //Tags
//Tags
$universities = University::orderBy('name')->get();
$countries = Country::orderBy('name')->get();
$programs = Program::orderBy('name')->get();
//... and many more
чтобы повторно использовать его, скажем, для метода edit() или других ??






Если вы будете повторно использовать код в большей части контроллера, я бы сказал использовать конструктор контроллера.
function __construct()
{
$this->universities = University::orderBy('name')->get();
$this->countries = Country::orderBy('name')->get();
$this->programs = Program::orderBy('name')->get();
}
это загрузит все значения, которые вы объявите в каждом методе контроллера.
в противном случае вы можете создать помощник в папке приложения, который будет возвращать нужные вам значения.
Я не рекомендую выполнять запросы к базе данных или другой ввод-вывод в конструкторе контроллера. Если у вас есть действия, которые не используют эти данные, они потратят время на загрузку этих данных без причины.
Вы можете поместить их в отдельный метод в своем классе, который просто возвращает данные в виде массива, а затем вызывать этот метод из ваших методов create и edit:
protected function getFormData()
{
return [
'universities' => University::orderBy('name')->get(),
'countries' => Country::orderBy('name')->get(),
'programs' => Program::orderBy('name')->get(),
];
}
Тогда ваши методы create и edit будут выглядеть примерно так:
public function create(Token $token)
{
$data = $this->getFormData();
return view('my.form.create', $data);
}
public function edit(Token $token)
{
$data = $this->getFormData();
return view('my.form.edit', $data);
}
Если вы не планируете добавлять что-либо в массив данных, вместо этого вы можете просто встроить вызов:
return view('my.form.edit', $this->getFormData());
Благодаря такому подходу я даже смог расширить этот метод getFormData() до Trait !!!
@Pathros Я бы посоветовал превратить его в черту, только если вы собираетесь использовать его и в других контроллерах. Рад, что смог помочь!
Вы можете создать метод для индивидуальной обработки этой части, например:
/**
* Tags from universities.
*
* @return \Illuminate\Database\Eloquent\Collection
*/
protected function getUniversities() {
return University::orderBy('name')->get();
}
Затем вы можете использовать его в других методах класса, просто выполнив $universities = $this->getUniversities().
Метод getUniversities() также может находиться в родительском классе.
Также ознакомьтесь с примером автоматической инъекции из документации laravel.com/docs/5.6/container#resolving