megakor
@megakor
Go/PHP developer | ВКонтакте

Как получить ссылку на show модели?

У меня есть модели Post и Page
В данный момент я получаю URL на показ какой-то сущности (show) исходя из названия их роута:
$postUrl = route('posts.show', $post, false);
$pageUrl = route('pages.show', $page, false);


Но это не очень практично и я хочу делать так:
$postUrl = $post->url();
$pageUrl = $page->url();

// или так
$postUrl = $post->url;
$pageUrl = $page->url;


Это можно сделать, добавив в модели такую функцию:
// в модель post
public function url()
{
    return route('posts.show', $this, false);
}

// в модель page
public function url()
{
    return route('pages.show', $this, false);
}


Но если у меня сотни моделей? Можно ли как-то сделать так, чтобы не копипастить это в каждую модель, как-то, возможно, отнаследоваться от AbstractModel (или использовав трейт) и чтобы ларавель сама возвращала правильное название роута?
  • Вопрос задан
  • 164 просмотра
Решения вопроса 1
kimono
@kimono
Web developer
Обращаться к роутеру из метода модели - это такое себе удовольствие.
Создайте сервис, заинжектите туда роутер, и там генерируйте ссылку, используя класс модели.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@maksim_fix
Junior PHP developer
Я не думаю, что вам придется статично выводить сотни ссылок, ну можете добавить в базовый контроллер(от которого наследуются все контроллеры) метод url(), но придется позаморачиться, чтобы названия роутов были динамическими. Как вариант: давать названия роутам в одном стиле, затем в этом самом методе url брать текущее название класса, убирать ненужный постфикс Controller, приводить к нижнему регистру и формировать url
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы