() translation by (you can also view the original English article)
Zunächst möchte ich die offizielle Website von Laravel über Helfer sprechen lassen.
Laravel enthält eine Vielzahl von globalen "Helfer" PHP-Funktionen. Viele dieser Funktionen werden vom Framework selbst verwendet. Sie können diese jedoch in Ihren eigenen Anwendungen verwenden, wenn Sie sie für praktisch halten.
Im Grunde sind Helfer in Laravel eingebaute Dienstprogrammfunktionen, die Sie von überall in Ihrer Anwendung aufrufen können. Wenn sie nicht vom Kernframework bereitgestellt worden wären, hätten Sie möglicherweise eigene Hilfsklassen entwickelt.
Obwohl der Kern bereits eine Vielzahl von Helfern zur Verfügung stellt, gibt es immer die Möglichkeit, dass Sie Ihre eigenen benötigen und eine entwickeln möchten, so dass Sie nicht den gleichen Code hier und da wiederholen müssen, um eine bessere Wartbarkeit zu erreichen. In diesem Tutorial erfahren Sie, wie Sie einen benutzerdefinierten Laravel-Helfer erstellen.
Helfer in Laravel
Wie bereits erwähnt, gibt es im Kern des Laravel-Frameworks viele Helfer. Sie werden basierend auf der Funktionalität gruppiert, die sie bereitstellen. Hier ist eine Liste von Hilfsgruppen.
Arrays
Helfer in dieser Gruppe bieten Funktionen zum Bearbeiten von Array-Elementen. In den meisten Fällen möchten Sie verschiedene Operationen für Array-Elemente ausführen. Dies ist der Ort, an dem Sie zuerst nachsehen sollten, ob das, wonach Sie suchen, bereits existiert.
Pfade
Ich finde Helfer in dieser Kategorie am nützlichsten. Sie geben den vollständig qualifizierten Pfad verschiedener Verzeichnisse wie App, Storage, Config und dergleichen zurück. Ich wette, Sie verwenden die meisten dieser Helfer bereits in Ihrer Laravel-Anwendung.
Saiten
String-Manipulation ist in Ihrer täglichen Anwendungsentwicklung unvermeidlich. Obwohl es viele String-Manipulationsfunktionen gibt, die von PHP selbst bereitgestellt werden, finden Sie in diesem Abschnitt einige nützliche Funktionen.
URLs
Sie finden nur sehr wenige in dieser Kategorie, aber sie werden in der gesamten Anwendung verwendet. Sie werden zum Generieren von URLs für Route, Asset und Formular verwendet.
Sonstiges
Diese Kategorie enthält Helfer, die eine Vielzahl von Funktionalitäten bieten, von der Protokollierung bis zur Fehlersuche und vielem mehr.
Für eine vollständige Referenz von Laravel-Helfern gibt es keinen besseren Ort als die offizielle Dokumentation.
Erstellen Sie Ihren ersten benutzerdefinierten Helper
Jetzt haben Sie ein grundlegendes Verständnis von Laravel Helfern und wofür sie verwendet werden. In diesem Abschnitt zeige ich Ihnen, wie Sie Ihren eigenen benutzerdefinierten Helper erstellen können, der global in Ihrer Laravel-Anwendung verwendet werden kann.
Um die Dinge einfach und leicht verständlich zu halten, ist es ein ziemlich einfacher Helfer, der eine Benutzer-ID akzeptiert und einen Benutzernamen als Antwort zurückgibt. Das hört sich natürlich nicht schick an, aber ich glaube, es genügt, das Konzept zu demonstrieren, und Sie können es immer erweitern, um Ihre komplexen Anforderungen zu erfüllen.
Ich nehme an, dass Sie eine Benutzertabelle in Ihrer Datenbank haben und es mindestens zwei Felder-userid und username hat.
Das Skelett eines Laravel Helfers
Bevor wir fortfahren und die Dateien tatsächlich erstellen, werfen wir einen kurzen Blick auf die Dateien, die wir im Rest des Artikels erstellen werden.
-
app/Helpers/Envato/User.php
: Es ist unsere Hilfsdatei, die die Logik unseres Helfers enthält. -
app/Providers/EnvatoServiceProvider.php
: Es ist eine benutzerdefinierte Service-Provider-Datei, die unsere benutzerdefinierte Hilfsdatei lädt. -
config / app.php
: In dieser Datei deklarieren wir unseren benutzerdefinierten Service-Provider und helfen uns auch, einen Alias für unseren Helfer zu definieren, so dass wir nicht den vollständig qualifizierten Klassennamen unseres Helfers verwenden müssen. -
routes / web.php
: Eine hübsche Standard-Laravel-Routendatei, in der wir unseren Helfer testen werden.
Erstellen Sie Hilfsdateien
Obwohl Sie Ihre Hilfsdateien überall in Ihrer Anwendung platzieren können, schlägt die intuitivere und standardmäßige Methode vor, dass sie in Ihrem app
-Verzeichnis angezeigt wird.
Also mach weiter und erstelle ein Helpers/Envato
-Verzeichnis unter app
und erstelle eine User.php
-Datei mit folgendem Inhalt. Natürlich könntest du es direkt unter dem app
oder app/Helper
-Verzeichnis platzieren, aber wenn du dieses zusätzliche Level zur Verfügung stellst, können wir unsere Helfer in guter Form organisieren, speziell wenn du viele davon haben willst.
1 |
<?php
|
2 |
//app/Helpers/Envato/User.php
|
3 |
namespace App\Helpers\Envato; |
4 |
|
5 |
use Illuminate\Support\Facades\DB; |
6 |
|
7 |
class User { |
8 |
/**
|
9 |
* @param int $user_id User-id
|
10 |
*
|
11 |
* @return string
|
12 |
*/
|
13 |
public static function get_username($user_id) { |
14 |
$user = DB::table('users')->where('userid', $user_id)->first(); |
15 |
|
16 |
return (isset($user->username) ? $user->username : ''); |
17 |
}
|
18 |
}
|
Die Datei beginnt mit einer hübschen Standard-Namespace-Deklaration:
1 |
namespace App\Helpers\Envato; |
Der Zweck unseres benutzerdefinierten Helpers ist es, einen Benutzernamen basierend auf einer Benutzer-ID abzurufen. Daher müssen wir mit der Datenbank interagieren, und das zwingt uns, DB Facade einzubeziehen.
1 |
use Illuminate\Support\Facades\DB; |
Für diejenigen, die mit Laravel Facades nicht vertraut sind, ist es nur eine weitere bequeme Möglichkeit, auf die Objekte in Service-Containern zuzugreifen. Alternativ hätten Sie die Abhängigkeitsinjektion verwenden können.
Weiter geht es mit der konkreten Umsetzung unseres Helfers. Wie Sie sehen können, gibt es eine statische Methode, die die Logik zum Abrufen eines Benutzernamens basierend auf einer Benutzer-ID definiert.
1 |
$user = DB::table('users')->where('userid', $user_id)->first(); |
Das $user
-Objekt enthält den Datenbankdatensatz mit der übereinstimmenden Benutzer-ID. Abschließend gibt die Methode den Benutzernamen als Antwort in der folgenden Anweisung zurück.
1 |
return (isset($user->username) ? $user->username : ''); |
Soweit unsere Hilfsdatei betroffen ist.
Jetzt haben wir unsere Hilfsdatei erstellt, aber die Frage ist, wie willst du sie benutzen? Zwei schnelle Lösungen kommen mir in den Sinn:
- Sie können unseren Helper-Dateinamen in die Datei
composer.json
aufnehmen, damit er automatisch geladen wird. Dann könnten Sie sofort die statische Methode unserer Helferklasse aufrufen. - Sie können einen Laravel-Dienstanbieter erstellen, mit dem Sie Ihre benutzerdefinierte Hilfsdatei so registrieren können, dass das Laravel-Framework sie zusammen mit anderen Abhängigkeiten lädt. Registrieren Sie diesen Dienstanbieter in der Laravel-Konfiguration und erstellen Sie einen Alias, um Ihren Helper zu verwenden.
Natürlich ist die erste ziemlich schnell und einfach zu implementieren, und Sie könnten versucht sein, dies zu tun, aber ich würde eher die letztere empfehlen, da sie eher handwerklich und wartungsfreundlicher ist.
Wechseln Sie zur Befehlszeile und führen Sie den folgenden Befehl in Ihrem Anwendungsstamm aus, um einen neuen Dienstanbieter zu erstellen.
1 |
$php artisan make:provider EnvatoServiceProvider
|
2 |
Provider created successfully. |
Sie sollten die Nachricht sehen, die bestätigt, dass sie erfolgreich im Verzeichnis app/Providers
erstellt wurde.
Öffnen Sie diese Datei und Sie sollten bereits zwei Methoden sehen. Der wichtigste im Zusammenhang mit diesem Artikel ist die Methode register
. Ja, es ist im Moment leer, also lasst uns ein paar Dinge einspeisen, um es nützlicher zu machen.
1 |
public function register() |
2 |
{
|
3 |
require_once app_path() . '/Helpers/Envato/User.php'; |
4 |
}
|
Die register-Methode wird verwendet, um Ihre Abhängigkeiten zu registrieren, und genau das haben wir getan. Wir haben unsere benutzerdefinierte Hilfsdatei hinzugefügt.
So sollte die Datei app/Providers/EnvatoServiceProvider.php
nach Änderungen aussehen.
1 |
<?php
|
2 |
// app/Providers/EnvatoServiceProvider.php
|
3 |
namespace App\Providers; |
4 |
|
5 |
use Illuminate\Support\ServiceProvider; |
6 |
|
7 |
class EnvatoServiceProvider extends ServiceProvider |
8 |
{
|
9 |
/**
|
10 |
* Bootstrap the application services.
|
11 |
*
|
12 |
* @return void
|
13 |
*/
|
14 |
public function boot() |
15 |
{
|
16 |
//
|
17 |
}
|
18 |
|
19 |
/**
|
20 |
* Register the application services.
|
21 |
*
|
22 |
* @return void
|
23 |
*/
|
24 |
public function register() |
25 |
{
|
26 |
require_once app_path() . '/Helpers/Envato/User.php'; |
27 |
}
|
28 |
}
|
Bis jetzt ist alles ziemlich gut. Wir haben unseren kundenspezifischen Helfer und Dienstleister auf dem Tisch.
Als nächstes müssen wir Laravel über unseren Service Provider informieren, damit dieser beim Bootstrapping geladen werden kann. Öffnen wir die Datei config / app.php
und fügen Sie am Ende den folgenden Eintrag in das provider
-Array ein.
1 |
App\Providers\EnvatoServiceProvider::class, |
Um unseren Helfer auf bequeme Weise zu verwenden, könnten wir auch einen Alias erstellen. Lassen Sie uns das tun, indem Sie den folgenden Eintrag im Array aliases
am Ende in derselben Datei hinzufügen.
1 |
'EnvatoUser' => App\Helpers\Envato\User::class, |
Wenn Sie diesen Eintrag definieren, können Sie unseren Helfer mit dem Schlüsselwort EnvatoUser
aufrufen. Ziemlich praktisch, nicht wahr? Zu Ihrer Information, hier ist die komplette Datei config / app.php
.
1 |
<?php
|
2 |
// config/app.php
|
3 |
return [ |
4 |
|
5 |
/*
|
6 |
|--------------------------------------------------------------------------
|
7 |
| Application Name
|
8 |
|--------------------------------------------------------------------------
|
9 |
|
|
10 |
| This value is the name of your application. This value is used when the
|
11 |
| framework needs to place the application's name in a notification or
|
12 |
| any other location as required by the application or its packages.
|
13 |
*/
|
14 |
|
15 |
'name' => 'Laravel', |
16 |
|
17 |
/*
|
18 |
|--------------------------------------------------------------------------
|
19 |
| Application Environment
|
20 |
|--------------------------------------------------------------------------
|
21 |
|
|
22 |
| This value determines the "environment" your application is currently
|
23 |
| running in. This may determine how you prefer to configure various
|
24 |
| services your application utilizes. Set this in your ".env" file.
|
25 |
|
|
26 |
*/
|
27 |
|
28 |
'env' => env('APP_ENV', 'production'), |
29 |
|
30 |
/*
|
31 |
|--------------------------------------------------------------------------
|
32 |
| Application Debug Mode
|
33 |
|--------------------------------------------------------------------------
|
34 |
|
|
35 |
| When your application is in debug mode, detailed error messages with
|
36 |
| stack traces will be shown on every error that occurs within your
|
37 |
| application. If disabled, a simple generic error page is shown.
|
38 |
|
|
39 |
*/
|
40 |
|
41 |
'debug' => env('APP_DEBUG', false), |
42 |
|
43 |
/*
|
44 |
|--------------------------------------------------------------------------
|
45 |
| Application URL
|
46 |
|--------------------------------------------------------------------------
|
47 |
|
|
48 |
| This URL is used by the console to properly generate URLs when using
|
49 |
| the Artisan command line tool. You should set this to the root of
|
50 |
| your application so that it is used when running Artisan tasks.
|
51 |
|
|
52 |
*/
|
53 |
|
54 |
'url' => env('APP_URL', 'https://localhost'), |
55 |
|
56 |
/*
|
57 |
|--------------------------------------------------------------------------
|
58 |
| Application Timezone
|
59 |
|--------------------------------------------------------------------------
|
60 |
|
|
61 |
| Here you may specify the default timezone for your application, which
|
62 |
| will be used by the PHP date and date-time functions. We have gone
|
63 |
| ahead and set this to a sensible default for you out of the box.
|
64 |
|
|
65 |
*/
|
66 |
|
67 |
'timezone' => 'UTC', |
68 |
|
69 |
/*
|
70 |
|--------------------------------------------------------------------------
|
71 |
| Application Locale Configuration
|
72 |
|--------------------------------------------------------------------------
|
73 |
|
|
74 |
| The application locale determines the default locale that will be used
|
75 |
| by the translation service provider. You are free to set this value
|
76 |
| to any of the locales which will be supported by the application.
|
77 |
|
|
78 |
*/
|
79 |
|
80 |
'locale' => 'en', |
81 |
|
82 |
/*
|
83 |
|--------------------------------------------------------------------------
|
84 |
| Application Fallback Locale
|
85 |
|--------------------------------------------------------------------------
|
86 |
|
|
87 |
| The fallback locale determines the locale to use when the current one
|
88 |
| is not available. You may change the value to correspond to any of
|
89 |
| the language folders that are provided through your application.
|
90 |
|
|
91 |
*/
|
92 |
|
93 |
'fallback_locale' => 'en', |
94 |
|
95 |
/*
|
96 |
|--------------------------------------------------------------------------
|
97 |
| Encryption Key
|
98 |
|--------------------------------------------------------------------------
|
99 |
|
|
100 |
| This key is used by the Illuminate encrypter service and should be set
|
101 |
| to a random, 32 character string, otherwise these encrypted strings
|
102 |
| will not be safe. Please do this before deploying an application!
|
103 |
|
|
104 |
*/
|
105 |
|
106 |
'key' => env('APP_KEY'), |
107 |
|
108 |
'cipher' => 'AES-256-CBC', |
109 |
|
110 |
/*
|
111 |
|--------------------------------------------------------------------------
|
112 |
| Logging Configuration
|
113 |
|--------------------------------------------------------------------------
|
114 |
|
|
115 |
| Here you may configure the log settings for your application. Out of
|
116 |
| the box, Laravel uses the Monolog PHP logging library. This gives
|
117 |
| you a variety of powerful log handlers / formatters to utilize.
|
118 |
|
|
119 |
| Available Settings: "single", "daily", "syslog", "errorlog"
|
120 |
|
|
121 |
*/
|
122 |
|
123 |
'log' => env('APP_LOG', 'single'), |
124 |
|
125 |
'log_level' => env('APP_LOG_LEVEL', 'debug'), |
126 |
|
127 |
/*
|
128 |
|--------------------------------------------------------------------------
|
129 |
| Autoloaded Service Providers
|
130 |
|--------------------------------------------------------------------------
|
131 |
|
|
132 |
| The service providers listed here will be automatically loaded on the
|
133 |
| request to your application. Feel free to add your own services to
|
134 |
| this array to grant expanded functionality to your applications.
|
135 |
|
|
136 |
*/
|
137 |
|
138 |
'providers' => [ |
139 |
|
140 |
/*
|
141 |
* Laravel Framework Service Providers...
|
142 |
*/
|
143 |
Illuminate\Auth\AuthServiceProvider::class, |
144 |
Illuminate\Broadcasting\BroadcastServiceProvider::class, |
145 |
Illuminate\Bus\BusServiceProvider::class, |
146 |
Illuminate\Cache\CacheServiceProvider::class, |
147 |
Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class, |
148 |
Illuminate\Cookie\CookieServiceProvider::class, |
149 |
Illuminate\Database\DatabaseServiceProvider::class, |
150 |
Illuminate\Encryption\EncryptionServiceProvider::class, |
151 |
Illuminate\Filesystem\FilesystemServiceProvider::class, |
152 |
Illuminate\Foundation\Providers\FoundationServiceProvider::class, |
153 |
Illuminate\Hashing\HashServiceProvider::class, |
154 |
Illuminate\Mail\MailServiceProvider::class, |
155 |
Illuminate\Notifications\NotificationServiceProvider::class, |
156 |
Illuminate\Pagination\PaginationServiceProvider::class, |
157 |
Illuminate\Pipeline\PipelineServiceProvider::class, |
158 |
Illuminate\Queue\QueueServiceProvider::class, |
159 |
Illuminate\Redis\RedisServiceProvider::class, |
160 |
Illuminate\Auth\Passwords\PasswordResetServiceProvider::class, |
161 |
Illuminate\Session\SessionServiceProvider::class, |
162 |
Illuminate\Translation\TranslationServiceProvider::class, |
163 |
Illuminate\Validation\ValidationServiceProvider::class, |
164 |
Illuminate\View\ViewServiceProvider::class, |
165 |
|
166 |
/*
|
167 |
* Package Service Providers...
|
168 |
*/
|
169 |
Laravel\Tinker\TinkerServiceProvider::class, |
170 |
|
171 |
/*
|
172 |
* Application Service Providers...
|
173 |
*/
|
174 |
App\Providers\AppServiceProvider::class, |
175 |
App\Providers\AuthServiceProvider::class, |
176 |
// App\Providers\BroadcastServiceProvider::class,
|
177 |
App\Providers\EventServiceProvider::class, |
178 |
App\Providers\RouteServiceProvider::class, |
179 |
App\Providers\EnvatoServiceProvider::class, |
180 |
],
|
181 |
|
182 |
/*
|
183 |
|--------------------------------------------------------------------------
|
184 |
| Class Aliases
|
185 |
|--------------------------------------------------------------------------
|
186 |
|
|
187 |
| This array of class aliases will be registered when this application
|
188 |
| is started. However, feel free to register as many as you wish as
|
189 |
| the aliases are "lazy" loaded so they don't hinder performance.
|
190 |
|
|
191 |
*/
|
192 |
|
193 |
'aliases' => [ |
194 |
|
195 |
'App' => Illuminate\Support\Facades\App::class, |
196 |
'Artisan' => Illuminate\Support\Facades\Artisan::class, |
197 |
'Auth' => Illuminate\Support\Facades\Auth::class, |
198 |
'Blade' => Illuminate\Support\Facades\Blade::class, |
199 |
'Broadcast' => Illuminate\Support\Facades\Broadcast::class, |
200 |
'Bus' => Illuminate\Support\Facades\Bus::class, |
201 |
'Cache' => Illuminate\Support\Facades\Cache::class, |
202 |
'Config' => Illuminate\Support\Facades\Config::class, |
203 |
'Cookie' => Illuminate\Support\Facades\Cookie::class, |
204 |
'Crypt' => Illuminate\Support\Facades\Crypt::class, |
205 |
'DB' => Illuminate\Support\Facades\DB::class, |
206 |
'Eloquent' => Illuminate\Database\Eloquent\Model::class, |
207 |
'Event' => Illuminate\Support\Facades\Event::class, |
208 |
'File' => Illuminate\Support\Facades\File::class, |
209 |
'Gate' => Illuminate\Support\Facades\Gate::class, |
210 |
'Hash' => Illuminate\Support\Facades\Hash::class, |
211 |
'Lang' => Illuminate\Support\Facades\Lang::class, |
212 |
'Log' => Illuminate\Support\Facades\Log::class, |
213 |
'Mail' => Illuminate\Support\Facades\Mail::class, |
214 |
'Notification' => Illuminate\Support\Facades\Notification::class, |
215 |
'Password' => Illuminate\Support\Facades\Password::class, |
216 |
'Queue' => Illuminate\Support\Facades\Queue::class, |
217 |
'Redirect' => Illuminate\Support\Facades\Redirect::class, |
218 |
'Redis' => Illuminate\Support\Facades\Redis::class, |
219 |
'Request' => Illuminate\Support\Facades\Request::class, |
220 |
'Response' => Illuminate\Support\Facades\Response::class, |
221 |
'Route' => Illuminate\Support\Facades\Route::class, |
222 |
'Schema' => Illuminate\Support\Facades\Schema::class, |
223 |
'Session' => Illuminate\Support\Facades\Session::class, |
224 |
'Storage' => Illuminate\Support\Facades\Storage::class, |
225 |
'URL' => Illuminate\Support\Facades\URL::class, |
226 |
'Validator' => Illuminate\Support\Facades\Validator::class, |
227 |
'View' => Illuminate\Support\Facades\View::class, |
228 |
'EnvatoUser' => App\Helpers\Envato\User::class, |
229 |
],
|
230 |
|
231 |
];
|
Wir sind fast da! Wir haben die ganze harte Arbeit geleistet, um hierher zu kommen, und jetzt können wir die Vorteile unseres benutzerdefinierten Helfers nutzen.
Ihre erste benutzerdefinierte Helfer in Aktion
Um die Dinge einfach und unkompliziert zu halten, definieren wir eine einfache Laravel-Route und rufen von dort aus unseren Helfer an!
Gehen Sie voran und erstellen Sie eine routes/web.php
Datei mit folgendem Inhalt.
1 |
<?php
|
2 |
// routes/web.php
|
3 |
/*
|
4 |
|--------------------------------------------------------------------------
|
5 |
| Web Routes
|
6 |
|--------------------------------------------------------------------------
|
7 |
|
|
8 |
| Here is where you can register web routes for your application. These
|
9 |
| routes are loaded by the RouteServiceProvider within a group which
|
10 |
| contains the "web" middleware group. Now create something great!
|
11 |
|
|
12 |
*/
|
13 |
|
14 |
Route::get('/envato-user-helper-demo', function () { |
15 |
return EnvatoUser::get_username(1); |
16 |
});
|
Braucht das überhaupt eine Erklärung? Wir haben gerade den benutzerdefinierten Helfer mit der Kurzschrift EnvatoUser::get_username
aufgerufen, und er sollte den Benutzernamen zurückgeben.
Natürlich können Sie unseren Helfer von überall in der Anwendung anrufen, sei es ein Controller oder eine Ansicht.
Damit endet unsere Geschichte für heute.
Fazit
Helfer in Laravel sind wirklich ein mächtiges Feature, und ich bin mir sicher, dass Sie als Entwickler das gerne erweitern würden. Und das war das Thema von heute - wir gingen durch die Grundlagen der Laravel-Hilfsdatei-Struktur und erstellten einen nützlichen benutzerdefinierten Helfer.
Ich hoffe, Ihnen hat der Artikel gefallen und er hilft Ihnen bei der Erstellung Ihrer eigenen maßgeschneiderten Helfer in der täglichen Laravel-Anwendungsentwicklung.
Zögern Sie nicht, Ihre Kommentare und Fragen im Feed unten zu hinterlassen. Ich fange auch Kommentare auf meinem Twitter und reagiere auf sie, sobald ich kann!