0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

君の性格は変えられない。だから僕はオーバーライドする

Last updated at Posted at 2025-04-06

エラーの重複が起こった。

自分で作成したエラーを出力するコードと、コンポーネントが自動で用意してくれているエラーが被ったのだ。

重複を消すには自分で用意したエラー出力を削除するか、コンポーネント側を削除する必要がある。

コンポーネント使っていない箇所でもエラー文は使っているので、コンポーネント側の出力を抑えれば統一感出るから良いんじゃない?という話になった。

vendorの中身をいじっていたのだが、それはあまりよろしくないとのこと。

その時に出てきたのがオーバーライドだ。

オーバーライド(Override)とは

オーバーライド(Override) は親クラスや既存のクラスが持つ処理を、子クラス側で再定義(上書き)すること。
再定義することで既存クラスの機能や処理を部分的に変更したり追加できるようになる。


なぜ「ベンダー(vendor)を直接いじる」ことはよくないのか

Laravel をインストールするとvendor フォルダの中に公式や他のパッケージ開発者が提供するコードが格納される。
下記の理由からvendor直下を直接いじることは推奨されない。

  1. バージョンアップで上書きされる
    • composer update などでライブラリを更新すると、vendor フォルダ内のコードがアップデートされ、変更を加えた部分が上書きされて消えてしまう
  2. 想定外の不具合が起きる
    • ライブラリの動作を直接変更すると依存している他のコードやパッケージにも影響を与えバージョンアップ時に不整合が起きる可能性が高まる

そのため複製(継承)してオーバーライドするという方法が使われる。


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 ファイルがある場合はそのフォルダ構成を別名で複製。自分のカスタムコンポーネントを作成する。

  1. resources/views/vendor/XXX-package/components/button.blade.phpというコンポーネントがあると仮定
  2. resources/views/components/my-button.blade.phpという形で複製する
  3. 修正したい箇所を編集し、テンプレートとロジックを変更
  4. 実際にはx-my-buttonなどのタグとして呼び出す

まとめ

  • オーバーライド (Override) とは、元となるクラスやメソッドの処理を 再定義 (上書き) すること
  • ベンダーフォルダ (vendor) を直接編集するのは厳禁。更新で消される危険があるため、必ず複製または継承によるオーバーライドを行う

オーバーライドの実装手順

  1. 既存クラスを継承したクラスを新規作成
  2. 親クラスのメソッドを同名で再定義(必要ならparent::で親の処理も利用)
  • Blade コンポーネントなら別名で複製して、カスタム版として利用
    明日はこれらを念頭に対応を進める所存。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?