• Hey,


    ich habe mir zum Glück recht früh angeeignet mir kleine URL-Helper zu erstellen, die in erster Linie z.B. in Templates sauberer aussehen und einfach zu warten sind. Doch fangen wir klein an:

    Was sind helper?
    Helper sind Funktionen, welche regelmäßig verwendet werden und einem das Leben etwas erleichtern. Zusätzlich sind sie global verfügbar - egal ob im Template oder im Backend.


    Wo finde ich die helper?

    Laravel bringt von Haus aus eine Helper Datei mit, welche sich unter App\Helpers\general.php befindet. Zu einer besseren Übersicht empfehle ich jedoch lieber mehrere Dateien zu pflegen, statt alles in die general.php zu packen.


    Wie füge ich helper hinzu?

    1. Füge eine weitere Datei unter App\Helpers\ hinzu. In meinem Beispiel nenne ich sie urlHelper.php
    2. Füge die urlHelper.php im Autoloader hinzu, damit sie global verfügbar ist:
      1. Offne dazu die composer.json im Rootverzeichnis
      2. Suche darauf das autload-Object und erweitere dort den Files-Array um den Eintrag App\Helpers\urlHelper.php (orientiere dich an der general.php)
    3. Gehe in die Konsole und führe folgendes Kommando aus: composer dump-autoload - dadurch wird der autoloader neu generiert und ab nun kannst du auf alle vorhanden Funktionen innerhalb der Datei zugreifen.


    Nehmen wir nun als Beispiel ein Benutzerprofil. In der Web-Route haben wir folgendes angegeben um ein Profil aufzurufen:

    Code: web.php
    Route::get('user/{id}-{name?}', '\App\Http\Controllers\User\IndexController@getIndex');


    Die URL sähe live dann folgendermaßen aus:
    https://example.com/user/1-florian-lauterbach

    Wie sieht der Helper aus?
    Natürlich kommt es darauf an wie Euer Design und die aktuelle Situation aussieht. In diesem Falle gehe ich davon aus, dass ein UserObject vorhanden ist:


    PHP: urlHelper.php
    if (! function_exists('getUserProfileByObject')) {
    function getUserProfileByObject($object)
    {
    return url('user/'.$object->id.'-'.str_slug($object->name));
    }
    }


    Innerhalb der Funktion entnehmen wir die id des UserObjects und "sluggen" den Namen URL-freundlich um die komplette URL am Ende formatiert herauszugeben.


    In einem Template (z.B. einer Benutzerliste) könnten wir dies nun so handhaben:


    HTML
    <ul class="list-group">
    @foreach($users as $user)
    <li class="list-group-item">
    <a href="{{getUserProfileByObject($user)}}">{{$user->name}}</a>
    </li>
    @endforach
    </ul>

    Damit erhalten wir eine Auflistung aller Nutzer, inklusive deren Namen und Profil-Url. Wenn ihr zukünftig also Eure URLs anpassen wollt, müsst ihr dies auf diese Art und Weise nur innerhalb der Routen-Dateien und innerhalb der Helper-Datei machen. Kein ätzendes Suchen und Ersetzen mehr! ;)



    Wie handhabt ihr die URL Generierung? Konnte ich Euch sogar vielleicht helfen - dann lasst es mich gerne wissen. :)

  • als weitere Möglichkeit in Presenter einpacken.

    HTML
    <a href="{{ $presenter->url() }}">{{ $presenter->fullName() }}</a>
  • Hi,


    grundsätzlich bin ich voll und ganz bei Dir und selbst großer Fan der Helper-Funktionen von Laravel - und denen, die ich selbstständig ergänzt habe.


    Ich hoffe Du erlaubst ein paar Anmerkungen zu Deiner Idee. :)


    Laravel bringt von Haus aus eine Helper Datei mit, welche sich unter App\Helpers\general.php befindet

    Das ist mir neu, dass es einen `App\Helpers`-Ordner bzw. eine `general.php`-Datei darin gibt. Hast Du dazu vll. einen Link, unter dem ich das nachlesen kann?


    Suche darauf das autload-Object und erweitere dort den Files-Array um den Eintrag

    Eine super Anleitung dazu gibt es auch hier nochmal: https://laravel-news.com/creating-helpers :)


    return url('user/'.$object->id.'-'.str_slug($object->name));

    Ich würde hier eher auf den `route`-Helper von Laravel zurückgreifen, siehe: https://laravel.com/docs/5.8/helpers#method-route und im Zuge dessen der Route einen Namen (siehe: https://laravel.com/docs/5.8/routing#named-routes) geben, damit gehst Du sicher(er). Außerdem/andernfalls würde ich das ganze mit einem Test abdecken. Du arbeitest hier mit "losen Strings", das kann schnell nach hinten losgehen. 8|


    Route::get('user/{id}-{name?}'

    Diese Routen-Definition würde mit Deinem Beispiel nicht hinhauen, da der Delimiter `-` nicht eindeutig wäre.


    "sluggen" den Namen URL-freundlich um die komplette URL am Ende formatiert herauszugeben

    Diesen Slug würde ich (erfahrungsgemäß) mit in der User-Tabelle speichern.


    --


    Toller Tipp, Helper sind klasse! :):thumbup:

    Wobei zu erwähnen ist, dass ab Laravel 5.8 die `helper`-Funktionen deprecated sind (siehe: https://laravel-news.com/larav…-string-and-array-helpers), was aber nicht berücksichtigt werden *muss*, klar.