エラーの重複が起こった。
自分で作成したエラーを出力するコードと、コンポーネントが自動で用意してくれているエラーが被ったのだ。
重複を消すには自分で用意したエラー出力を削除するか、コンポーネント側を削除する必要がある。
コンポーネント使っていない箇所でもエラー文は使っているので、コンポーネント側の出力を抑えれば統一感出るから良いんじゃない?という話になった。
vendor
の中身をいじっていたのだが、それはあまりよろしくないとのこと。
その時に出てきたのがオーバーライドだ。
オーバーライド(Override)とは
オーバーライド(Override) は親クラスや既存のクラスが持つ処理を、子クラス側で再定義(上書き)すること。
再定義することで既存クラスの機能や処理を部分的に変更したり追加できるようになる。
なぜ「ベンダー(vendor)を直接いじる」ことはよくないのか
Laravel をインストールするとvendor
フォルダの中に公式や他のパッケージ開発者が提供するコードが格納される。
下記の理由からvendor
直下を直接いじることは推奨されない。
-
バージョンアップで上書きされる
-
composer update
などでライブラリを更新すると、vendor
フォルダ内のコードがアップデートされ、変更を加えた部分が上書きされて消えてしまう
-
-
想定外の不具合が起きる
- ライブラリの動作を直接変更すると依存している他のコードやパッケージにも影響を与えバージョンアップ時に不整合が起きる可能性が高まる
そのため複製(継承)してオーバーライドするという方法が使われる。
Laravel でのオーバーライドの考え方
Laravel に限らず、PHP のクラスをオーバーライドする典型的な方法
既存クラスを継承したクラスを作る
<?php
namespace App\Overrides;
use Vendor\Package\OriginalClass;
class MyCustomClass extends OriginalClass
{
// 上書きしたいメソッドを同名で定義する
public function someMethod($param)
{
// 親クラスのメソッドを呼び出すこともできる
// parent::someMethod($param);
// ここで独自のロジックを追加する
// ...
}
}
Vendor\Package\OriginalClass
(オリジナルクラス)を 継承 (extends) したMyCustomClass
を新規作成。
- 上書き(再定義)したいメソッドを、同じメソッド名で書き直す
- 必要であれば、
parent::メソッド名()
を呼び出すことで親クラスの処理も利用できる
どう使う
例: Laravel の Blade コンポーネントをオーバーライドする場合
resources/views/vendor
にパッケージから提供されているコンポーネントの Blade ファイルがある場合はそのフォルダ構成を別名で複製。自分のカスタムコンポーネントを作成する。
-
resources/views/vendor/XXX-package/components/button.blade.php
というコンポーネントがあると仮定 -
resources/views/components/my-button.blade.php
という形で複製する - 修正したい箇所を編集し、テンプレートとロジックを変更
- 実際には
x-my-button
などのタグとして呼び出す
⸻
まとめ
- オーバーライド (Override) とは、元となるクラスやメソッドの処理を 再定義 (上書き) すること
- ベンダーフォルダ (vendor) を直接編集するのは厳禁。更新で消される危険があるため、必ず複製または継承によるオーバーライドを行う
オーバーライドの実装手順
- 既存クラスを継承したクラスを新規作成
- 親クラスのメソッドを同名で再定義(必要なら
parent::
で親の処理も利用)
- Blade コンポーネントなら別名で複製して、カスタム版として利用
明日はこれらを念頭に対応を進める所存。