【Laravel】ヘルパ関数とは?自作方法とメリットデメリット
この記事からわかること
- Laravelのヘルパ関数とは?
- phpの関数との違い
- 独自で関数を定義して自作する方法
- メリットデメリット
- composerのオートロードの仕組み
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
Laravelのヘルパ関数とはどのようなものなのかまとめていきたいと思います。
参照記事:公式リファレンス:ヘルパ関数
ヘルパ関数とは?
「 ヘルパ(helper)関数」とはLaravelに搭載されている独自の関数のことです。phpにも trim
やhtmlspecialchars
、echo
などたくさんの関数が元々用意されているようにLaravelでもasset
やview
、redirect
などたくさんの関数が用意されています。
例えばメソッド名の長いhtmlspecialchars
関数はe
ヘルパ関数に置き換えると同等の処理を行うことができます。使い方は通常の関数と同じでメソッド名を呼び出して使用します。
echo htmlspecialchars('<h2>HTML要素</h2>'); // for php
// 結果:<h2>HTML要素</h2>(エスケープされている)
echo e('<h2>HTML要素</h2>'); // for helper
// 結果:<h2>HTML要素</h2>(エスケープされている)
同等の処理が行える理由はヘルパ関数が内部的にphpの関数を実行してくれているからです。e
ヘルパ関数も内部的にphpのhtmlspecialchars
関数を実行しています。
名前の「helper(助手)」の意味通りプロジェクトを開発する際に便利な関数も多くLaravelを使う上ではヘルパ関数を扱えるか扱えないかで開発工数も大きく変わってくると思います。
しかしもちろんですがLaravelを組み込んでいる環境でしか使えない関数なのでphpのみでの開発の時には使用できなくなってしまうことには注意してください。
またヘルパ関数は自作することも可能です。使い回したい処理をヘルパ関数として独自に定義することで自分の好きなメソッド名で好きな処理を実行させることができるようになります。
ヘルパ関数とは〜まとめ〜
- Laravel独自の関数のこと
- 内部的にphpの関数を実行しているものもある
- 開発を助けてくれる便利な機能
- 使用は通常通りメソッド名を呼び出す
- use文不要で使えるものもある
- 自作することも可能
自作することのメリット・デメリット
ヘルパ関数は自作することも可能ですが、そこにはメリットやデメリットが混在しています。
ヘルパ関数を自作出来ることにより汎用性の高いロジック部分や数値やデータの整形処理などを切り出して管理することができるようになります。同じような処理を何度も記述する必要性が無くなるので効率良く開発に望めるようになります。
しかし大きなデメリットととしてメソッド名を自由につけられてしまうことが挙げられます。Laravelを熟知している人なら良いですが初心者などからすると自作されたヘルパ関数がデフォルトであるのものなのか、自作されたものなのかはたまたphpのものなのかすら識別が出来なくなってしまいます。
メリット
- 処理を使い回せる
- 拡張性が高い
- 記述量がグッと減る
- 簡潔なメソッド名に変更できる
デメリット
- メソッド名の重複や識別が困難
- phpの関数かLaravelの独自ヘルパ関数かわからなくなる
- 自作したヘルパ関数の管理が重要
自作する際の注意
- メソッド名にルールを持たせる
- チームで使う場合は常に共有
- 管理する場所を明確にする
- メソッド名が重複しないようにする
よく使うヘルパ関数の意味と使い方
Laravelのヘルパ関数には2パターンのヘルパ関数があります。
- use文がヘルパ関数
- use文がヘルパ関数
ヘルパ関数は基本的にuse文を使って読み込む処理をしなくても使えるものが多いですが、「配列」(Arr)と「文字列」(Str)を操作するメソッドを使用する場合はuse文が必要になってきます。
これらはクラスの静的メソッドとして各ヘルパ関数が定義されているためクラスを有効化してからでないと使用できないためです。
use文が必要なヘルパ関数(Arr/Str)
Arr関係の関数
Laravel内で配列やオブジェクトを操作できるのがArr::メソッド
形式で書かれたヘルパ関数です。このメソッドを使うには最初に以下のようにクラスの読み込みを行います。
use Illuminate\Support\Arr;
使い方はファサードに似ていますが名前空間は Support
に属しているので別物のようです。
// ファサードの名前空間
use Illuminate\Support\Facades\Route;
例えばArr::where
メソッドは配列の中から指定した条件にマッチする値のみを抽出することができます。
use Illuminate\Support\Arr;
$array = [1,2,3,4,5,6,7];
$filtered = Arr::where($array, function ($value, $key) {
return $value > 4;
});
var_dump($filtered);
// 結果:array(3) { [4]=> int(5) [5]=> int(6) [6]=> int(7) }
Str関係の関数
文字列を操作する際はStr::メソッド
形式で記述します。例えば文字列を置換できるphpのstr_replace
関数と同等のものがヘルパ関数ではStr::replace
として使用できます。
use Illuminate\Support\Str;
$string = 'phpのフレームワークはVue.jsです';
$replaced = Str::replace('Vue.js', 'Laravel', $string);
// phpのフレームワークはLaravelです
use文が不要なヘルパ関数
上記の2つ以外のヘルパ関数はクラスの読み込みをしなくてもLaravelさえ導入していれば使用可能になっています。
public_path関数
プロジェクト内の「public」ディレクトリへのパスを返すメソッド
$path = public_path('css/style.css');
// ローカルホストの場合
// /Users/ユーザ名/Desktop/プロジェクト名/public/css/style.css
asset関数
使用中のプロトコル(HTTP/HTTPS)メソッドを使用してURL形式でパスを返すメソッド
$path = public_path('css/style.css');
// ローカルホストの場合
// http://localhost/css/style.css
環境設定をしている「.env」ファイルにASSET_URL
変数を用意し指定のURLをここに記述することでasset関数が返す値を変更することも可能です。
ASSET_URL =
https://appdev-room.com/
// for .env $path = public_path('css/style.css'); // ローカルホストの場合 // https://appdev-room.com/css/style.css
__関数
__
関数は引数に指定されている文字列が翻訳対象なら該当文字列に置換、翻訳未対象ならそのまま表示してくれる関数です。
echo __('translation.login');
翻訳対象の文字列は別ファイルに連想配列形式で定義しておき、__
関数の引数はファイル名.キー値
の形式で指定すれば自動で置換してくれます。
この関数は認証機能であるAuthなどを日本語化する際に多用します。詳しい使い方は以下の記事を参考にしてください。
dd関数
dd
関数は引数に指定した変数の内容を表示してくれる関数です。出力するタイミングでそれ以降のスクリプトの実行は停止させるので後続の処理は行われないことに注意してください。
$array = ['user_id' => 1, 'name' => 'ame', 'language' => 'php', 'framework' => 'laravel'];
dd($array);
echo "hoge"; // 行われない
実際に実行すると下記画像のようにページ上に変数の中身を表示させることができます。
old関数
old
関数はinput要素などに直前に入力された情報をセッションから取得してくれる関数です。
<label>メールアドレス</label>
<input name="email" value="{{ old('email') }}" type="text">
input
要素のvalue
属性に指定しておけばページに戻ったときなどに入力値を保持することができたりします。
redirect関数
redirect
関数はページをリダイレクトさせるHTTPレスポンスを返しページ変移してくれる関数です。引数にリダイレクトさせたい先にパスを渡します。
return redirect('/welcome');
引数を指定しないで呼び出すとRedirectorインスタンスが返されます。そこからメソッドチェーンでRedirectorインスタンスのメソッドでルートを指定できるroute
メソッドやアプリ外にリダイレクトできるaway
メソッドが使えるようになります。
return redirect()->route('information');
return redirect()->away('https://www.qa-mikata.com/');
collect関数
collect
関数は配列をコレクションインスタンスに変換してくれる関数です。
$collection = collect(['user_id' => 1, 'name' => 'ame', 'language' => 'php', 'framework' => 'laravel']);
コレクションとはLaravel独自の形式で配列操作に長けたオブジェクトです。
view関数
view
関数はviewインスタンスを返す関数です。コントローラでよく使うこの関数もヘルパ関数の1つです。
return view('index', ['records' => $data, 'middle' => $middle]);
ヘルパ関数を自作する方法
自作する流れ
- ヘルパ関数用のファイルを作成する
- composerのオートロードに組み込む
- composerのオートロードを更新
- ファイル内で使用
Laravelで自作ヘルパ関数を作成するのは意外に簡単です。作成に欠かせないcomposer
のオートロードの仕組みもみながら作成方法を見ていきます。
1.ヘルパ関数用のファイルを作成する
ますはヘルパ関数を定義するファイルをコマンドではなく手動で作成します。管理する場所はに決まりはありませんが「app」内の中に管理するのがセオリーです。今回は「app」内に「helpers」ディレクトリを作りその中にファイルを作っていきます。
「app」>「helpers」>「testHelper.php」
<?php
if (!function_exists('test')) {
function test(): string
{
return 'これはテストです';
}
// function ヘルパ関数名(): 型
// {
// 処理;
// }
}
最初にphpのfunction_exists
関数を使って重複する関数があるかを調べます。存在していればtrue
を返すので!
で真偽値を逆転させます。
その中に自作の関数を定義します。ここはその都度オリジナルのものを作成すればOKです。
2.composerのオートロードに組み込む
続いて作成したヘルパ関数をLaravel内でファイル読み込みなしで使えるようにcomposerのオートロード機能を使って組み込みます。オートロード機能に組み込むには「composer.json」の中に以下のように作成したファイルパスを記述するだけです。
composer.json
"autoload": { "psr-4": { "XXXX": "XXXX", "XXXX\\XXXXXXXX\\": "XXXXXXXX/XXXXXXXX/", "XXXX\\XXXXXXXX\\": "XXXXXXXX/XXXXXXXX/", },
"helpers": [ "app/helpers/testHelper.php" ]
},
オートロード機能をもう少し深掘りするとphpのファイル読み込み関数であるrequire_once
で本来読み込む必要のあるところをオート(自動)ロード(読み込み)してくれます。
require_once "app/helpers/testHelper.php";
psr-4
というのはオートロードの仕様ルールでpsr-0
というのもあるが名前空間を指定する仕様?ぽいので今回は分かりやすくhelpers
にしてみました。
3.composerのオートロードを更新
「composer.json」を変更したら更新処理を施します。変更部分が"autoload"
部分のみなのでターミナルから以下のコマンドを実行。
$ composer dump-autoload
もし他にも変更点があれば以下のコマンドで全体を更新しておきます。
$ composer update
この際以下のようなエラーがでましたが作成したヘルパ関数のパスが間違っていただけでした。
Script Illuminate\Foundation\ComposerScripts::postAutoloadDump handling the post-autoload-dump event terminated with an exception
4.ファイル内で使用
これで作成〜初期設定までが完了したのでLaravelのファイル内のどこでも指定したヘルパ関数が使用できるようになっていると思います。
echo test();
// これはテストです
またLaravelの対話型シェルを起動するコマンドtinker
を使えば簡単に動作を確認できます。
$ php artisan tinker
実行すると以下のようになるので、>>>
に続いてメソッドなどを記入すると結果を確認することができます。
Psy Shell v0.11.2 (PHP 8.0.12 — cli) by Justin Hileman
>>> test()
=> "これはテストです"
終了する時はCtrl + C
で停止できます。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。