Laravelには、お気に入りのdd()
関数など、配列、パス、文字列、ルートなどの操作を容易にする多くの優れた機能があります。
Composerを使用してLaravelアプリケーションとPHPパッケージ用の独自の関数を作成し、それらを自動的にインポートできます。
LaravelやPHPを初めて使用する場合は、Laravelに自動的にロードされる独自のPHP関数を作成するプロセス全体を見てみましょう。
Laravelで関数ファイルを作成する
まず、Laravelアプリケーションのコンテキストに関数を含める必要があります。 好みに応じて、必要な機能を使用してファイルのストレージを整理できます。ここにいくつかの推奨場所を示します。
-
app/helpers.php
-
app/Http/helpers.php
app/helpers.php
ようにアプリケーション名前空間のルートに保存することを好みます。
オートロード
関数を使用するには、それらをランタイムにロードする必要があります(アプリケーションライフサイクル)。 私のキャリアの初めに、私はしばしばファイルの最初にこのコードを見ました:
require_once ROOT . '/helpers.php';
PHP関数は自動的にロードできません。 ただし、 require
またはrequire_once
を使用require
よりも、Composerを使用した方が良いソリューションがあります。
新しいLaravelプロジェクトを作成すると、 composer.json
ファイルにautoload
およびautoload-dev
パラメーターが表示されます。
"autoload": { "classmap": [ "database/seeds", "database/factories" ], "psr-4": { "App\\": "app/" } }, "autoload-dev": { "psr-4": { "Tests\\": "tests/" } },
関数を含む独自のファイルを追加する場合、Composerには、 autoload
パラメーター内で定義できるfiles
パラメーター(ファイルパスの配列で構成される)があります。
"autoload": { "files": [ "app/helpers.php" ], "classmap": [ "database/seeds", "database/factories" ], "psr-4": { "App\\": "app/" } },
files
パラメーターに新しいパスを追加したら、以下を実行してオートローダーを更新する必要があります。
composer dump-autoload
LaravelがComposerオートローダーをpublic/index.php
ロードするため、リクエストごとにhelpers.php
ファイルが自動的にロードされます:
require __DIR__.'/../vendor/autoload.php';
関数定義
関数を定義するのは難しい作業ではありませんが、いくつかの注意事項があります。 Laravelのすべての機能は、衝突の可能性を排除する特別なチェックでラップされています。
if (! function_exists('env')) { function env($key, $default = null) { // ... } }
キャッチがあるかもしれませんが、関数を割り当てる前に、定義済みの状況で関数を実行できるためです。
function_exists
を使用してfunction_exists
をテストすることをお勧めしますが 、アプリケーションのコンテキストで関数を割り当てる場合、function_existsのチェックを拒否できます。
チェックをスキップすることにより、関数が別の関数を再定義するときに常に衝突が発生します。これは便利です。
実際には、衝突は考えられるほど頻繁には発生しませんが、関数の名前があまり一般的でないことを確認する必要があります。 さらに、関数の名前にプレフィックスを追加して、衝突の可能性を減らすことができます。
関数の例
リソースパスを定義した場合、RoR(Ruby on Rails)がパスとリンク用の関数を作成する方法が好きでした。 たとえば、関数new_photo_path
、 edit_photo_path
などがphotos
リソースに追加されphotos
。
Laravelでリソースルーティングを使用する場合、テンプレート内のルートを簡単に操作できるようにする関数をいくつか追加します。 私の実装では、Eloquentモデルを渡し、リソースへのルートを返す関数を追加します。次に例を示します。
create_route($model); edit_route($model); show_route($model); destroy_route($model);
これは、 app/helpers.php
でshow_route
関数を定義する方法を示していapp/helpers.php
(他のものも同様に見えます):
if (! function_exists('show_route')) { function show_route($model, $resource = null) { $resource = $resource ?? plural_from_model($model); return route("{$resource}.show", $model); } } if (! function_exists('plural_from_model')) { function plural_from_model($model) { $plural = Str::plural(class_basename($model)); return Str::kebab($plural); } }
plural_from_model()
関数は、命名規則に基づいてリソースの名前を取得するのに役立つ単なるコードです。
たとえば、モデルに基づいてリソースの名前を取得します。
$model = new App\LineItem; plural_from_model($model); => line-items plural_from_model(new App\User); => users
これらの規則を使用して、 routes/web.php
でリソースのルートを定義できroutes/web.php
。
Route::resource('line-items', 'LineItemsController'); Route::resource('users', 'UsersController');
その後、テンプレートで次のような関数を使用できます。
<a href="{{ show_route($lineItem) }}"> {{ $lineItem->name }} </a>
出力では、次のHTMLコードを取得します。
<a href="http://localhost/line-items/1"> Line Item #1 </a>
パッケージ
Composerパッケージでは、ファイルを関数で使用することもできます。使用できるようにする関数の場合、パッケージはプロジェクトで使用されます。
files
パラメータを関数ファイルの配列として定義することにより、 composer.json
ファイルに対して同じアプローチを使用します。
関数のチェックにfunction_exists()
を追加して、名前の衝突によってコードを使用しているプロジェクトがクラッシュしないようにしてください。
一意の関数には正しい名前を使用する必要があります。関数の名前が一般的すぎると思われる場合は、短いプレフィックスを使用することも検討してください。
ソース: https : //laravel-news.com/creating-helpers