Сохранение полиморфных отношений в Laravel

В настоящее время у меня полиморфные отношения между телефонными номерами и контактами или организациями. Я использую 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!');
}

Я знаю, что должен быть лучший способ сделать это, так как при каждом создании или сохранении метода я дублирую этот код. Я просто не знаю, как сделать это лучше.

0

Решение

$type = ucfirst($request->parent_type);
if (in_array($type, $allowedTypes) {
$parent_record = $type::find($request->parent_id);
}

Вы можете использовать оператор разрешения области видимости для вызова статического метода из класса, когда последний представлен строкой.

Уловов здесь два:

  1. Пользователь может ввести имя класса, вы можете не захотеть выполнять find(), Может быть, нужен белый список
  2. Класс не является частью этого пространства имен — вам нужно использовать полное имя класса
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]