В настоящее время у меня полиморфные отношения между телефонными номерами и контактами или организациями. Я использую morphMap, чтобы изменить имя модели пространства имен родительских отношений на контакт или организацию соответственно.
В настоящее время, когда я хочу создать новый номер телефона для организации или контакта, я передаю два параметра URL: parent_id = $ record_id и parent_type = контакт или организация. Тогда в моем контроллере номера телефона есть следующее, что очень уродливо:
if ($request->parent_type == 'organization')
{
$parent_record = Organization::find($request->parent_id);
}
elseif ($request->parent_type == 'contact')
{
$parent_record = Contact::find($request->parent_id);
}
if ($parent_record)
{
$parent_record->phone_numbers()->save($phone_number);
return redirect()->route($request->parent_type . '.show', ['id' => $request->parent_id])->with('notify', 'Phone number added!');
}
Я знаю, что должен быть лучший способ сделать это, так как при каждом создании или сохранении метода я дублирую этот код. Я просто не знаю, как сделать это лучше.
$type = ucfirst($request->parent_type);
if (in_array($type, $allowedTypes) {
$parent_record = $type::find($request->parent_id);
}
Вы можете использовать оператор разрешения области видимости для вызова статического метода из класса, когда последний представлен строкой.
Уловов здесь два:
find()
, Может быть, нужен белый списокДругих решений пока нет …