質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

1339閲覧

Laravel ヘルパ関数をオーバーライドしたい

miyacorata

総合スコア20

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2020/05/04 13:29

編集2020/05/04 13:50

前提・実現したいこと

Laravelで多言語化をするにあたり、翻訳が空文字列だった場合は fallback_locale にフォールバックするようにヘルパ関数 __() をオーバーライドしたいです

(翻訳ファイルに空文字列が含まれるのはCrowdinと連携して翻訳作業を行っており未翻訳の文字列は""で処理されてしまうことによるものです)

現状

PHP

1// vendor/laravel/framework/src/Illuminate/Foundation/helpers.php 2 3if (! function_exists('__')) { 4 /** 5 * Translate the given message. 6 * 7 * @param string|null $key 8 * @param array $replace 9 * @param string|null $locale 10 * @return string|array|null 11 */ 12 function __($key = null, $replace = [], $locale = null) 13 { 14 if (is_null($key)) { 15 return $key; 16 } 17 18 return trans($key, $replace, $locale); 19 } 20}

こうしたい

PHP

1if(!function_exists('__')){ 2 /** 3 * Translate the given message. 4 * 5 * @param string|null $key 6 * @param array $replace 7 * @param string|null $locale 8 * @return string|array|null 9 */ 10 function __($key = null, $replace = [], $locale = null) 11 { 12 if (is_null($key)) { 13 return $key; 14 } 15 16 $get = trans($key, $replace, $locale); 17 // ひとまず現在のロケールで取得を試みる 18 19 return $get ?: trans($key, $replace, config('app.fallback_locale')); 20 // 空文字列だったなら、fallback_localeで取得 21 } 22}

※ 現状、これと同じコードを__fb()という自作ヘルパで実装し意図した動作は得られています。が、IDEの補完機能の恩恵を得たいというのとオーバーライドができるのであればそれに越したことはないと思い質問をさせていただいた次第です。

お尋ねしたいこと

この場合、Laravelのヘルパ関数をオーバーライドする作法としてはどうするのが良いのでしょうか?

サービスコンテナについても調べてみましたがよく理解できませんでした... 私はあくまでヘルパ関数にちょっと追記するだけで用が足りるため、大本のクラスを変えるまでのことではないと思っていますが、この姿勢が正しいのかどうかもわかりません

補足情報(FW/ツールのバージョンなど)

FWのバージョン

  • Laravel 6.18.10

読んでみた記事

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/05/04 13:32

直接書きかえるのでは問題が出ますか?
miyacorata

2020/05/04 13:37

質問に記載したファイルパスが不十分でした、当該のコードはComposerで導入したコード(laravel/framework)で vendor/ の中にあるため直接編集するべきではないコードです
m.ts10806

2020/05/04 13:39 編集

いえ、それは承知の上です。 「PHPデフォルトの関数をオーバーライドしたい」という要望はまれに見ますが(一応機能もある)、フレームワークの一般の関数をオーバーライドするって余程のことなのかなと思って。余程のことでしたら、直接書き換えるか、別で関数を作って全て作った関数を参照するように変更していくくらいしかないのではと。
miyacorata

2020/05/04 13:43

実は今はそのように実装した `__fb()` という名前の自作ヘルパを入れて一応意図した動作はしています。 しかしながら調べたところLaravelのサービスコンテナを云々するとオーバーライドができるらしいという記事( https://qiita.com/kd9951/items/46ef3559009ee575ea7d )を読んでいまいち理解が及ばなかったため助けを求めるべく質問した次第でした
m.ts10806

2020/05/04 13:44

なるほど。参照した記事があるならそれも質問本文に記載いただいたほうが良いです(あと、「実はそのように実装したことがある」という経緯や背景も)
miyacorata

2020/05/04 13:51

ご指摘いただいたとおり追記しました、ありがとうございます
mikkame

2020/05/04 16:10

ちなみにその解説に乗ってるパターンは app('config')で登録されている中身を書き換えるであってそのヘルパ関数を置き換えるわけではないです
guest

回答2

0

ベストアンサー

vendor/autoload.php で自作したヘルパファイルを先に読み込ませるようにしないと実現できないかもです????

もしかしたらこちらの記事がお役に立てるかもです。
Laravel 標準のヘルパ関数を自作ヘルパ関数でオーバーライドする

投稿2020/05/04 16:30

ucan-lab

総合スコア888

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mikkame

2020/05/04 17:26

普段から自作ヘルパを読み込ませてるんですがそれはいつも後から読み込まれてしまうんですよね・・・。 post-autoload-dumpで必ず改変を割り込ませるというのは目から鱗でした!
ucan-lab

2020/05/04 18:00

他の方法だと読み込み順が遅くてできなかったり、複雑になっちゃうのでこれが一番シンプルかなと思いました!
miyacorata

2020/05/08 02:00

サービスプロバイダを用いたヘルパ読み込みは存じていましたがオートローダを活用する手段は思いつきませんでした! うまく行きそうです。ありがとうございました!
guest

0

artisanとindex.phpのautoloadを読み込むより先に関数定義しておいてあげれば上書きできるはずです
(動作保証はしかねる)

投稿2020/05/04 15:50

mikkame

総合スコア5036

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問