PHP
Laravel

Laravel5.8から非推奨になるヘルパーメソッドを一括置換したときのメモ


Laravel 5.8 から一部のヘルパーメソッドが非推奨に

https://readouble.com/laravel/5.8/ja/upgrade.html?#string-and-array-helpers

対象は array_* 系や str_* 系とのこと。

世間一般でどうかは知らないけど、個人的にはめっちゃ使っていたのでショック。。

とくに array_get() はむっちゃ使ってたよ。


対応方法

非推奨となったメソッドは使わないように直すか、

別パッケージを使うことで引き続き使えるようにするか、大きく2つの方法が考えられます。


非推奨でも使い続ける方法

https://github.com/laravel/helpers

ヘルパーメソッドを追加するパッケージがあるので composer で追加する。

こうすることで とくにアプリケーション側は変更することなくいけそうです。

僕は使ってないけど。


非推奨になったメソッドを撲滅する方法

Laravelアプリケーションのディレクトリへ移動してから 下記コマンドで調査。

無くなるのが array_* str_* 系のメソッドということなので

対象メソッドがどれだけあるのかgrepしてみる。


$ grep 'function array_' vendor/laravel/framework/src/Illuminate/Support/helpers.php
function array_add($array, $key, $value)
function array_collapse($array)
function array_divide($array)
function array_dot($array, $prepend = '')
function array_except($array, $keys)
function array_first($array, callable $callback = null, $default = null)
function array_flatten($array, $depth = INF)
function array_forget(&$array, $keys)
function array_get($array, $key, $default = null)
function array_has($array, $keys)
function array_last($array, callable $callback = null, $default = null)
function array_only($array, $keys)
function array_pluck($array, $value, $key = null)
function array_prepend($array, $value, $key = null)
function array_pull(&$array, $key, $default = null)
function array_random($array, $num = null)
function array_set(&$array, $key, $value)
function array_sort($array, $callback)
function array_sort_recursive($array)
function array_where($array, callable $callback)
function array_wrap($value)

$ grep 'function str_' vendor/laravel/framework/src/Illuminate/Support/helpers.php
function str_after($subject, $search)
function str_contains($haystack, $needles)
function str_finish($value, $cap)
function str_is($pattern, $value)
function str_limit($value, $limit = 100, $end = '...')
function str_plural($value, $count = 2)
function str_random($length = 16)
function str_replace_array($search, array $replace, $subject)
function str_replace_first($search, $replace, $subject)
function str_replace_last($search, $replace, $subject)
function str_singular($value)
function str_slug($title, $separator = '-')
function str_start($value, $prefix)

使う場所は app/* または resouces/* 配下になるので さっきの結果を利用して調べてみる。


$ grep -r -e 'array_add' -e 'array_collapse' -e 'array_divide' -e 'array_dot' -e 'array_except' -e 'array_first' -e 'array_flatten' -e 'array_forget' -e 'array_get' -e 'array_has' -e 'array_last' -e 'array_only' -e 'array_pluck' -e 'array_prepend' -e 'array_pull' -e 'array_random' -e 'array_set' -e 'array_sort' -e 'array_sort_recursive' -e 'array_where' -e 'array_wrap' app/*
$ grep -r -e 'array_add' -e 'array_collapse' -e 'array_divide' -e 'array_dot' -e 'array_except' -e 'array_first' -e 'array_flatten' -e 'array_forget' -e 'array_get' -e 'array_has' -e 'array_last' -e 'array_only' -e 'array_pluck' -e 'array_prepend' -e 'array_pull' -e 'array_random' -e 'array_set' -e 'array_sort' -e 'array_sort_recursive' -e 'array_where' -e 'array_wrap' resources/*

$ grep -r -e 'str_after' -e 'str_contains' -e 'str_finish' -e 'str_is' -e 'str_limit' -e 'str_plural' -e 'str_random' -e 'str_replace_array' -e 'str_replace_first' -e 'str_replace_last' -e 'str_singular' -e 'str_slug' -e 'str_start' app/*
$ grep -r -e 'str_after' -e 'str_contains' -e 'str_finish' -e 'str_is' -e 'str_limit' -e 'str_plural' -e 'str_random' -e 'str_replace_array' -e 'str_replace_first' -e 'str_replace_last' -e 'str_singular' -e 'str_slug' -e 'str_start' resources/*

修正した後で対応漏れがないか確認する時にもこのコマンドを使って確認する。


awk コマンドが便利だった

これ使うことでコマンドごとにカウントできた。


$ grep -r -e 'array_add' -e 'array_collapse' -e 'array_divide' -e 'array_dot' -e 'array_except' -e 'array_first' -e 'array_flatten' -e 'array_forget' -e 'array_get' -e 'array_has' -e 'array_last' -e 'array_only' -e 'array_pluck' -e 'array_prepend' -e 'array_pull' -e 'array_random' -e 'array_set' -e 'array_sort' -e 'array_sort_recursive' -e 'array_where' -e 'array_wrap' app/* | awk 'match($0, /(array_[a-z]+)/, a) { print a[1] }' | sort | uniq -c
$ grep -r -e 'array_add' -e 'array_collapse' -e 'array_divide' -e 'array_dot' -e 'array_except' -e 'array_first' -e 'array_flatten' -e 'array_forget' -e 'array_get' -e 'array_has' -e 'array_last' -e 'array_only' -e 'array_pluck' -e 'array_prepend' -e 'array_pull' -e 'array_random' -e 'array_set' -e 'array_sort' -e 'array_sort_recursive' -e 'array_where' -e 'array_wrap' resources/* | awk 'match($0, /(array_[a-z]+)/, a) { print a[1] }' | sort | uniq -c
$ grep -r -e 'str_after' -e 'str_contains' -e 'str_finish' -e 'str_is' -e 'str_limit' -e 'str_plural' -e 'str_random' -e 'str_replace_array' -e 'str_replace_first' -e 'str_replace_last' -e 'str_singular' -e 'str_slug' -e 'str_start' app/* | awk 'match($0, /(str_[a-z]+)/, a) { print a[1] }' | sort | uniq -c
$ grep -r -e 'str_after' -e 'str_contains' -e 'str_finish' -e 'str_is' -e 'str_limit' -e 'str_plural' -e 'str_random' -e 'str_replace_array' -e 'str_replace_first' -e 'str_replace_last' -e 'str_singular' -e 'str_slug' -e 'str_start' resources/* | awk 'match($0, /(str_[a-z]+)/, a) { print a[1] }' | sort | uniq -c

$ #こんな感じで結果が出るよ
$ grep -r -e 'array_add' -e 'array_collapse' -e 'array_divide' -e 'array_dot' -e 'array_except' -e 'array_first' -e 'array_flatten' -e 'array_forget' -e 'array_get' -e 'array_has' -e 'array_last' -e 'array_only' -e 'array_pluck' -e 'array_prepend' -e 'array_pull' -e 'array_random' -e 'array_set' -e 'array_sort' -e 'array_sort_recursive' -e 'array_where' -e 'array_wrap' app/* | awk 'match($0, /(array_[a-z]+)/, a) { print a[1] }' | sort | uniq -c
403 array_get
33 array_has
22 array_set


さぁ置換してみよう

使っているエディタとかによって色々方法はあるんだろうけど、僕はこんな感じでやってみました。


$ # array_getの置換
$ find ./app -type f -name "*.php" -print0 | xargs -0 sed -i.bak 's/array_get/\\Illuminate\\Support\\Arr::get/g'
$ find . -type f -name "*.bak" -print0 | xargs -0 rm -f

$ # array_hasの置換
$ find ./app -type f -name "*.php" -print0 | xargs -0 sed -i.bak 's/array_has/\\Illuminate\\Support\\Arr::has/g'
$ find . -type f -name "*.bak" -print0 | xargs -0 rm -f

$ # array_setの置換
$ find ./app -type f -name "*.php" -print0 | xargs -0 sed -i.bak 's/array_set/\\Illuminate\\Support\\Arr::set/g'
$ find . -type f -name "*.bak" -print0 | xargs -0 rm -f

実際に新規で書いていく場合は しっかり名前空間を書くのはダルいので useとかして

Arr::get() みたいに書きたいと思います。

https://github.com/laravel/laravel/blob/v5.8.0/config/app.php

5.8からヘルパーメソッドで array_系とstr_系が無くなるかわりに ファサードとして「Arr」や「Str」があるので useしなくてもいけるっぽい