LoginSignup
13
19

More than 3 years have passed since last update.

Laravelでvendor内の処理をオーバーライドする方法

Last updated at Posted at 2019-07-20

実際にぶち当たった問題

https://github.com/yajra/laravel-oci8
yajra/laravel-oci8 に依存した実装でORACLE上の予約語カラムが含まれるクエリーを実行しようとすると失敗する。

エラーログ例

[2019-07-20 15:06:06] local.ERROR: Error Code    : 904
Error Message : ORA-00904: "PASSWORD": 無効な識別子です。
Position      : 21
Statement     : update "M_USER" set "PASSWORD" = :p0, "UPDATED_AT" = :p1 where "NAME" = :p2
Bindings      : [*****************************,2019-07-20 15:06:06,hogeuser]

原因

原因はver5.4まではクエリーを組み立てるときに予約語でないことを判別してカラム名を大文字に変換していたけど、ver5.5以降は問答無用で変換するようになってしまったためのようでした。
※エラーログに出ている大文字の『PASSWORD』が予約語でした。実際のカラム名は小文字で『password』

比較

190711_OracleGrammar.php比較.png

ver git
5.4 https://github.com/yajra/laravel-oci8/blob/5.4/src/Oci8/Query/Grammars/OracleGrammar.php
5.5 https://github.com/yajra/laravel-oci8/blob/5.5/src/Oci8/Query/Grammars/OracleGrammar.php

対策

(1) パッケージのオーバーライド版を用意

任意のディレクトリにパッケージ(yajra/laravel-oci8)を丸ごとコピーし配置

※任意のディレクトリ
[プロジェクトフォルダ]/app/VendorOverrides/
問題の[比較]箇所の処理だけ書き換える
※5.4の処理に置き換える

(2) composer.jsonを以下のように追記する

composer.json
"autoload": {
    "classmap": [
        "database/seeds",
        "database/factories"
    ],
    "psr-4": {
        "App\\": "app/"
    },
    "exclude-from-classmap": [
        "vendor\\yajra\\laravel-oci8\\src\\Oci8\\Query\\Grammars\\OracleGrammar.php"
    ],
    "files":[
        "app\\VendorOverrides\\yajra\\laravel-oci8\\src\\Oci8\\Query\\Grammars\\OracleGrammar.php"
    ]
},

(3) コマンドを実行

実行コマンド
composer dump-autoload

参考

Laravel How to override vendor class file?
http://shyammakwana.me/php/laravel-override-vendor-classes.html

13
19
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
13
19