---
title: "Genera URLs usando eloquent en laravel de forma sencilla"
excerpt: "Hace unos días, en laravel news apareció un tutorial de Jordan Dalton donde explica como generar urls usando eloquent y en base a ese tutorial voy a mostrarles como lo adapté a mi proyecto."
date: "2021-05-03T03:17:44.000Z"
category: "Laravel"
seo_title: "Generar URLs dinámicas en Laravel Eloquent con UrlPresenter"
seo_description: "Genera URLs en Laravel Eloquent con una clase UrlPresenter reutilizable que acepta el nombre del modelo como parámetro, evitando crear una clase separada por cada recurso."
author:
  name: "angel cruz"
  picture: "https://angelcruzdevcdn.nyc3.cdn.digitaloceanspaces.com/images/me/angel-cruz.png"
ogImage:
  url: "/images/open-graph/laravel-opengraph-image.png"
---

Antes de seguir leyendo les recomiendo que vayan al artículo de Laravel News para que entiendan lo que voy hablar. Para eso hagan clic aquí [en este link](https://laravel-news.com/leverage-eloquent-to-prepare-your-urls).

Ok, ahora les contaré lo que hice:

Básicamente lo que hice fue modificar la clase `UrlPresenter` para que aceptara un parámetro adicional y quedó de la siguiente forma:

```php
<?php
namespace {{ namespace }};

use Illuminate\Database\Eloquent\Model;

class UrlPresenter
{
    protected Model $model;
	protected string $modelName;

    public function __construct(Model $model, string $modelName)
    {
        $this->model = $model;
        $this->modelName = $modelName;
    }

    public function __get($key)
    {
        if(method_exists($this, $key)) {
            return $this->$key();
        }

        return $this->$key;
    }

    public function show(): string
    {
        return route("{$this->modelName}.show", $this->model);
    }
}
```

Y en el modelo usuarios coloqué esto:

```php
	public function getUrlAttribute()
	{
		return new UrlPresenter($this, 'users');
	}
```

Las razón? Pues simplemente porque no quería crear una clase por cada modelo en el que estoy trabajando y al pasarle el nombre del modelo (en este ejemplo "users") puedo generar todas las url que necesito sin ningun tipo de problema.

La forma de usarlo sería la misma como lo explicó Jordan:

```html
<a href="{{ $user->url->show }}">{{ $user->name }}</a>
```

Probablemente existe una mejor forma de hacerlo, si la conoces puedes decirme? 

Espero les sirva este post!!

---

## Sitemap

Índice completo del sitio: [/sitemap.md](https://angelcruz.dev/sitemap.md)

Canónico HTML: [https://angelcruz.dev/post/genera-urls-usando-eloquent-en-laravel-de-forma-sencilla](https://angelcruz.dev/post/genera-urls-usando-eloquent-en-laravel-de-forma-sencilla)
