So erstellen Sie benutzerdefinierte Hilfsfunktionen in Laravel

Lesezeit: 3 Minuten

So erstellen Sie benutzerdefinierte Hilfsfunktionen in Laravel
Kalebe Oliveira

Ich möchte Hilfsfunktionen erstellen, um zu vermeiden, dass Code zwischen Ansichten in Laravel wiederholt wird. Zum Beispiel:

view.blade.php

<p>Foo Formated text: {{ fooFormatText($text) }}</p>

Sie sind im Grunde Funktionen zur Textformatierung. Wie soll ich global verfügbare Hilfsfunktionen wie definieren fooFormatText()?

So erstellen Sie benutzerdefinierte Hilfsfunktionen in Laravel
Josef Silber

Ein … kreieren helpers.php Datei in Ihrem App-Ordner und laden Sie sie mit Composer hoch:

"autoload": {
    "classmap": [
        ...
    ],
    "psr-4": {
        "App\\": "app/"
    },
    "files": [
        "app/helpers.php" // <---- ADD THIS
    ]
},

Nachdem Sie das zu Ihrer hinzugefügt haben composer.json Datei, führen Sie den folgenden Befehl aus:

composer dump-autoload

Wenn Sie Ihre nicht behalten möchten helpers.php Datei in Ihrer app Verzeichnis (da es sich nicht um eine PSR-4-Namespace-Klassendatei handelt), können Sie Folgendes tun laravel.com Website tut: speichert die helpers.php im Bootstrap-Verzeichnis. Denken Sie daran, es in Ihrem einzustellen composer.json Datei:

"files": [
    "bootstrap/helpers.php"
]

  • Tipp für Noobs: Verwenden Sie diesen Befehl, nachdem Sie die composer.json geändert haben. Composer Dump-Autoload

    – Allfarid Morales García

    2. Juni 2015 um 22:44 Uhr

  • @AllfaridMoralesGarcía Oder vielleicht nur “Ein nützlicher Tipp, da die Antwort nicht klar macht, dass Sie dies danach tun müssen”.

    – Matt McDonald

    9. Juni 2015 um 15:52 Uhr

  • Ich befürworte Hilfsfunktionen, um das Schreiben von Ansichten zu erleichtern, aber ich hasse es, wie sehr auf diese Antwort in anderen Antworten verwiesen wird. Verstehen Sie mich nicht falsch, es ist eine gute Antwort und richtig, ich befürchte nur, dass die Leute sie missbrauchen und wieder Tonnen von schlecht geschriebenem, schlecht organisiertem funktionalem PHP schreiben werden.

    – andrewtweber

    18. Oktober 2015 um 21:02 Uhr

  • Ich verstehe diesen Ansatz nicht. Composer soll ein Werkzeug zum Einbinden von Bibliotheken sein: Laravel würde ohne es perfekt funktionieren und Composer ohne Laravel. Dieser Vorschlag weist uns an, eine Datei in unserer App zu erstellen, unsere App zu verlassen, zu Composer zu gehen, Composer anzuweisen, zu unserer App zurückzukehren und eine Datei einzufügen. Laravel kümmert sich eindeutig um das Einbinden von Dateien, oder? Warum sollten wir auf die native Implementierung von Laravel verzichten und dieses externe Tool verwenden, um eine Datei für uns einzubinden und so unsere Anwendung stärker an Composer zu koppeln? Ist es Faulheit oder übersehe ich etwas?

    – dKen

    18. November 2015 um 8:30 Uhr

  • Laravel verwendet den Autoloader von Composer, um zu wissen, wo alle Bibliotheken und Dateien, auf die es sich stützt, einzufügen sind. Darauf wird in bootstrap/autoload.php verwiesen. Lesen Sie den Kommentar in dieser Datei. Der Ansatz besteht darin, den Verweis auf die Datei in die composer.json einzufügen, dann „dump autoload“, wodurch der Autoloader des Komponisten neu generiert wird, damit Laravel ihn finden kann. Die Verwendung der “Dateien”-Sammlung von Composer ist eine gute Möglichkeit, Bibliotheken oder einmalige Funktionsdateien hinzuzufügen, die nicht ordentlich in Composer-Pakete verpackt sind. Es ist schön, einen Platz für all die “übrigens muss ich diese eine komische Datei einschließen”-Situationen zu haben.

    – Philipp Harrington

    18. November 2015 um 16:55 Uhr


1646904853 783 So erstellen Sie benutzerdefinierte Hilfsfunktionen in Laravel
heisisch

Benutzerdefinierte Klassen in Laravel 5, der einfache Weg

Diese Antwort gilt für Allgemeines benutzerdefinierte Klassen in Laravel. Eine Blade-spezifischere Antwort finden Sie unter Benutzerdefinierte Blade-Direktiven in Laravel 5.

Schritt 1: Erstellen Sie Ihre Helpers-Datei (oder eine andere benutzerdefinierte Klassendatei) und geben Sie ihr einen passenden Namespace. Schreiben Sie Ihre Klasse und Methode:

<?php // Code within app\Helpers\Helper.php

namespace App\Helpers;

class Helper
{
    public static function shout(string $string)
    {
        return strtoupper($string);
    }
}

Schritt 2: Erstellen Sie einen Alias:

 [
     ...
        'Helper' => App\Helpers\Helper::class,
     ...

Step 3: Run composer dump-autoload in the project root

Step 4: Use it in your Blade template:

<!-- Code within resources/views/template.blade.php -->

{!! Helper::shout('this is how to use autoloading correctly!!') !!}

Extra Credit: Use this class anywhere in your Laravel app:

<?php // Code within app/Http/Controllers/SomeController.php

namespace App\Http\Controllers;

use Helper;

class SomeController extends Controller
{

    public function __construct()
    {
        Helper::shout('now i\'m using my helper class in a controller!!');
    }
    ...

Source: http://www.php-fig.org/psr/psr-4/

Why it works: https://github.com/laravel/framework/blob/master/src/Illuminate/Support/ClassLoader.php

Where autoloading originates from:
http://php.net/manual/en/language.oop5.autoload.php

  • To be clear, this answer doesn’t actually deal with helpers, which are global-namespaced functions. Instead, it encourages converting helpers to class methods. This is generally the best approach, but doesn’t actually answer the question asked here, which is why other answers are so complex by comparison.

    – Dan Hunsaker

    Nov 18, 2015 at 3:50

  • Function helper means it is available in Blade as well.How do you make this function available in blade? You cannot call Helper::prettyJason(parameters) in blade.

    – MaXi32

    Jan 21, 2016 at 16:55

  • @MaXi32 you could add the class under the aliases array in app/config.php: 'Helper' => App\Helpers\Helper::class, Then you would be able to call Helper::prettyJson(); in blade just fine.

    – heisian

    Apr 27, 2016 at 9:56

  • Yeah, I dug through the framework once and found where they pulled the helpers in. And again, I completely agree that methods of namespaced static classes are a much cleaner fit than what’s being requested – or recommended – most of the time. The fact is, helpers aren’t really The Laravel Way in the first place, but rather a holdover from CodeIgniter 2.x that still hasn’t been phased out. So my pedantry about this approach not answering the OP exactly as asked is more an attempt to highlight the fact that you don’t get helpers, but rather something better.

    – Dan Hunsaker

    May 4, 2016 at 19:14

  • For Laravel 8 (I tested on this version), just before the composer dump-autoload, you need to run : php artisan config:cache to clear the cache of the file config/app.php. Then it will work

    – Axel Paris

    Mar 4, 2021 at 16:46


1646904853 520 So erstellen Sie benutzerdefinierte Hilfsfunktionen in Laravel
Andrew Brown

my initial thought was the composer autoload as well, but it didn’t feel very Laravel 5ish to me. L5 makes heavy use of Service Providers, they are what bootstraps your application.

To start off I created a folder in my app directory called Helpers. Then within the Helpers folder I added files for functions I wanted to add. Having a folder with multiple files allows us to avoid one big file that gets too long and unmanageable.

Next I created a HelperServiceProvider.php by running the artisan command:

artisan make:provider HelperServiceProvider

Within the register method I added this snippet

public function register()
{
    foreach (glob(app_path().'/Helpers/*.php') as $filename){
        require_once($filename);
    }
}

lastly register the service provider in your config/app.php in the providers array

'providers' => [
    'App\Providers\HelperServiceProvider',
]

jetzt jede Datei in Ihrer Helpers Verzeichnis geladen und einsatzbereit.

UPDATE 2016-02-22

Hier gibt es viele gute Optionen, aber wenn meine Antwort für Sie funktioniert, habe ich ein Paket für die Einbeziehung von Helfern auf diese Weise erstellt. Sie können das Paket entweder als Inspiration verwenden oder es auch mit Composer herunterladen. Es hat einige eingebaute Helfer, die ich oft verwende (aber die standardmäßig alle inaktiv sind) und ermöglicht es Ihnen, Ihre eigenen benutzerdefinierten Helfer mit einem einfachen Artisan-Generator zu erstellen. Es geht auch auf den Vorschlag eines Antwortenden ein, einen Mapper zu verwenden, und ermöglicht es Ihnen, die zu ladenden benutzerdefinierten Helfer explizit zu definieren oder standardmäßig alle PHP-Dateien in Ihrem Helferverzeichnis automatisch zu laden. Feedback und PRs sind sehr willkommen!

composer require browner12/helpers

Github: browner12/helfer

  • Für Leute, die nur ein paar Funktionen hinzufügen müssen, ist Composer Autoload vollkommen in Ordnung, aber für diejenigen von uns, die viele Hilfsfunktionen haben, ist die Organisation mehrerer Dateien ein Muss. Diese Lösung ist im Wesentlichen das, was ich in L4 getan habe, außer dass ich die Dateien in meiner registriert habe start.php Datei (was nicht toll war, aber für die damalige Zeit seinen Zweck erfüllte). Haben Sie einen anderen Vorschlag zum Laden mehrerer Dateien?

    – Andreas Braun

    10. Februar 2015 um 19:52 Uhr

  • Wenn Sie mehrere Dateien haben, fügen Sie sie alle zu Ihrer composer.json-Datei hinzu. Das Hinzufügen von sogar 5-10 Zeilen macht es Weg mehr Sinn als das, was Sie hier haben.

    – Josef Silber

    10. Februar 2015 um 21:36 Uhr

  • Ich denke, diese Technik hat viele Vorteile. Es ist elegant und effizient, weil Sie nicht daran denken müssen, jedes Mal, wenn Sie eine Hilfsdatei erstellen, mit der Datei composer.json herumzuspielen.

    – Impetus

    22. März 2015 um 16:44 Uhr

  • Wirklich gute Lösung. Das einzige, womit ich nicht einverstanden bin, ist die Art und Weise, wie Sie die Dateien hinzufügen. Ich denke, es sollte stattdessen ein Mapper sein, bei dem wir den Namen der Datei hinzufügen, die wir laden möchten. Denken Sie an Fehler! Wenn nur ein Helfer in einer der Dateien fehlschlägt, sollten Sie alle entfernen oder die Site beschädigen, bis Sie das Problem gelöst haben.

    – Pablo Ezequiel Leone

    17. April 2015 um 13:20 Uhr

  • Verwenden Sie den App\Providers-Namespace? Wie ich diesen Helfer aus Controller und Ansicht nenne. Entschuldigung, Noob-Frage.

    – Cengkaruk

    10. Juni 2015 um 11:01 Uhr

1646904854 517 So erstellen Sie benutzerdefinierte Hilfsfunktionen in Laravel
esazzad

Dies wird vorgeschlagen von JeffreyWay in diesem Laracasts-Diskussion.

  1. In deinem app/Http Verzeichnis, erstellen Sie eine helpers.php Datei und fügen Sie Ihre Funktionen hinzu.
  2. Innerhalb composer.jsonin dem autoload blockieren, hinzufügen "files": ["app/Http/helpers.php"].
  3. Laufen composer dump-autoload.

1644036129 209 Textausrichtungsklasse fur innerhalb einer Tabelle
dKen

Nachdem ich eine Vielzahl von Antworten auf SO und Google durchgesehen hatte, konnte ich immer noch keinen optimalen Ansatz finden. Die meisten Antworten deuten darauf hin, dass wir die Anwendung verlassen und uns auf das Drittanbieter-Tool Composer verlassen, um die Arbeit zu erledigen, aber ich bin nicht davon überzeugt, dass die Kopplung mit einem Tool nur zum Einfügen einer Datei sinnvoll ist.

Die Antwort von Andrew Brown kam meiner Meinung nach am nächsten, aber (zumindest in 5.1) ist der Schritt des Dienstanbieters unnötig. Heisians Antwort hebt die Verwendung von hervor PSR-4 was uns einen Schritt näher bringt. Hier ist meine endgültige Implementierung für Helfer in Ansichten:

Erstellen Sie zunächst irgendwo in Ihrem Apps-Verzeichnis eine Hilfsdatei mit einem Namespace:

namespace App\Helpers;

class BobFinder
{
    static function bob()
    {
        return '<strong>Bob?! Is that you?!</strong>';
    }
}

Geben Sie als Nächstes einen Alias ​​für Ihre Klasse ein config\app.phpin dem aliases Array:

'aliases' => [
    // Other aliases
    'BobFinder' => App\Helpers\BobFinder::class
]

Und das sollte alles sein, was Sie tun müssen. PSR-4 und der Alias ​​sollte den Helfer Ihren Ansichten aussetzen, also in Ihrer Ansicht, wenn Sie Folgendes eingeben:

{!! BobFinder::bob() !!}

Es sollte ausgeben:

<strong>Bob?! Is that you?!</strong>

  • danke, dass du das gepostet hast. Wie @Dan-Hunsaker in meiner Lösung betonte, haben wir immer noch keine Funktion mit globalem Namensraum, dh wir können einfach schreiben {!! bob() !!}. werde mal weitersuchen und schauen ob das möglich ist

    – Heisian

    25. November 2015 um 19:43 Uhr


  • Ich habe mehr darüber nachgedacht und versucht, zu machen bob() wirklich global wäre nicht klug. Namespaces gibt es aus einem bestimmten Grund und wir sollten nicht anrufen bob() neben Basis-PHP-Funktionen. Ich werde Ihr Aliasing-Bit zu meinem Code hinzufügen – danke!

    – Heisian

    25. November 2015 um 19:56 Uhr

  • Das finde ich das Beste von allem

    – Jimmy Obonyo Abor

    9. Dezember 2015 um 23:12 Uhr

  • @AndrewBrown Leider verwendet fast jedes Beispiel in den Laravel-Dokumenten Fassaden, ohne Warnungen oder Vorschläge, wann und wann sie nicht verwendet werden sollten. Es macht es für Neulinge bei Laravel sehr schwierig zu wissen, dass sie eine Option haben, sie nicht zu verwenden, und welche Auswirkungen das hat.

    – dKen

    23. Februar 2016 um 8:25 Uhr

  • @AndrewBrown das ist keine Fassade. Dies ist das automatische Laden von PSR-4. php-fig.org/psr/psr-4

    – Heisian

    27. April 2016 um 9:49 Uhr

1646904854 328 So erstellen Sie benutzerdefinierte Hilfsfunktionen in Laravel
Gemeinschaft

Benutzerdefinierte Blade-Direktiven in Laravel 5

Ja da ist Ein weiterer Weg, dies zu tun!

Schritt 1: Registrieren Sie eine benutzerdefinierte Blade-Direktive:

<?php // code in app/Providers/AppServiceProvider.php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

use Blade; // <-- This is important! Without it you'll get an exception.

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
     public function boot()
     {
         // Make a custom blade directive:
         Blade::directive('shout', function ($string) {
             return trim(strtoupper($string), '(\'\')');
         });

         // And another one for good measure:
         Blade::directive('customLink', function () {
             return '<a href="#">Custom Link</a>';
         });
     }
    ...

Schritt 2: Verwenden Sie Ihre benutzerdefinierte Blade-Anweisung:

<!-- // code in resources/views/view.blade.php -->

@shout('this is my custom blade directive!!')
<br />
@customLink

Ausgänge:

DAS IST MEINE CUSTOM-BLADE-RICHTLINIE!!

Benutzerdefinierten Link


Quelle: https://laravel.com/docs/5.1/blade#extending-blade

Zusätzliche Lektüre: https://mattstauffer.co/blog/custom-conditionals-with-laravels-blade-directives


Wenn Sie lernen möchten, wie Sie am besten benutzerdefinierte Klassen erstellen, die Sie verwenden können irgendwosiehe Benutzerdefinierte Klassen in Laravel 5, der einfache Weg

  • danke, dass du das gepostet hast. Wie @Dan-Hunsaker in meiner Lösung betonte, haben wir immer noch keine Funktion mit globalem Namensraum, dh wir können einfach schreiben {!! bob() !!}. werde mal weitersuchen und schauen ob das möglich ist

    – Heisian

    25. November 2015 um 19:43 Uhr


  • Ich habe mehr darüber nachgedacht und versucht, zu machen bob() wirklich global wäre nicht klug. Namespaces gibt es aus einem bestimmten Grund und wir sollten nicht anrufen bob() neben Basis-PHP-Funktionen. Ich werde Ihr Aliasing-Bit zu meinem Code hinzufügen – danke!

    – Heisian

    25. November 2015 um 19:56 Uhr

  • Das finde ich das Beste von allem

    – Jimmy Obonyo Abor

    9. Dezember 2015 um 23:12 Uhr

  • @AndrewBrown Leider verwendet fast jedes Beispiel in den Laravel-Dokumenten Fassaden, ohne Warnungen oder Vorschläge, wann und wann sie nicht verwendet werden sollten. Es macht es für Neulinge bei Laravel sehr schwierig zu wissen, dass sie eine Option haben, sie nicht zu verwenden, und welche Auswirkungen das hat.

    – dKen

    23. Februar 2016 um 8:25 Uhr

  • @AndrewBrown das ist keine Fassade. Dies ist das automatische Laden von PSR-4. php-fig.org/psr/psr-4

    – Heisian

    27. April 2016 um 9:49 Uhr

Dies ist meine HelpersProvider.php-Datei:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class HelperServiceProvider extends ServiceProvider
{
    protected $helpers = [
        // Add your helpers in here
    ];

    /**
     * Bootstrap the application services.
     */
    public function boot()
    {
        //
    }

    /**
     * Register the application services.
     */
    public function register()
    {
        foreach ($this->helpers as $helper) {
            $helper_path = app_path().'/Helpers/'.$helper.'.php';

            if (\File::isFile($helper_path)) {
                require_once $helper_path;
            }
        }
    }
}

Sie sollten einen Ordner namens erstellen Helpers unter dem app Ordner, erstellen Sie dann eine Datei mit dem Namen whatever.php innen und fügen Sie die Zeichenfolge hinzu whatever innerhalb des $helpers-Arrays.

Getan!

Bearbeiten

Ich verwende diese Option nicht mehr, ich verwende derzeit Composer, um statische Dateien wie Helfer zu laden.

Sie können die Helfer direkt hinzufügen unter:

...
"autoload": {
    "files": [
        "app/helpers/my_helper.php",
        ...
    ]
},
...

  • Gibt es andere Gründe als die Leistung, einen Mapper zu erstellen, anstatt alle Dateien in das Verzeichnis zu laden glob() wie Andrew Brown schrieb? Wenn Sie in der Lage sein möchten, die einzuschließenden Dateien anzugeben, warum geben Sie die Dateien nicht in der composer.json um sie automatisch zu laden, wie Joseph Silber schrieb? Warum bevorzugen Sie diese Lösung? Ich sage nicht, dass dies eine schlechte Lösung ist, ich bin nur neugierig.

    – Pelmered

    30. Oktober 2015 um 21:21 Uhr


  • Mit einem gemappten Ansatz ist es einfacher, Helfer selektiv zu aktivieren/deaktivieren, wenn beispielsweise eine der Helferdateien einen Breaking Error enthält. Das Zuordnen von Dateien bei einem Dienstanbieter unterscheidet sich jedoch nicht sehr von dem in composer.json mit Ausnahme von zwei Punkten – erstens hält es die Karte in der Anwendung selbst und nicht in einer Metadatendatei; Zweitens müssen Sie es nicht erneut ausführen composer dump-autoload jedes Mal, wenn Sie die Liste der zu ladenden Dateien ändern.

    – Dan Hunsaker

    18. November 2015 um 3:56 Uhr

  • Kein Bedarf für include oder requireLaravel hat bereits eingebautes PSR-4 Autoloading: php-fig.org/psr/psr-4

    – Heisian

    27. April 2016 um 9:58 Uhr

  • Mit PSR-4 und Composer können Sie keine Helfer ein- und ausschalten.

    – Pablo Ezequiel Leone

    27. April 2016 um 14:22 Uhr

  • @PabloEzequielLeone und wie würde ich es in einem Controller oder einer Blade-Datei verwenden? Dies scheint die beste Option zu sein, wenn Sie nicht jedes Mal alle Helfer für alle Controller laden möchten, aber es ist nicht gut für Anfänger in Laravel (wie mich).

    – VinGarcia

    28. September 2017 um 15:32 Uhr

987350cookie-checkSo erstellen Sie benutzerdefinierte Hilfsfunktionen in Laravel

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy