FuelPHP 1.7.2から1.8へバージョンアップ(PHP7.2で出るエラーにも対応)
- 公開日:2020/5/17
- 最終更新日:2020/5/21
fuelphp 1.7.2 のバージョンアップをすることがあったのでその方法をメモ。
以下のページを参考にすすめることにしました。
インストール – アップグレード – FuelPHP ドキュメント
準備としてFuelPHPドキュメントのダウンロードページから最新のzipファイルをダウンロードします。
Fuel のダウンロード – インストール – FuelPHP ドキュメント
composer.jsonを先ほどダウンロードしたファイルに置き換えて、FuelPHPを設置しているディレクトリに移動してから以下を実行します。
$ php composer.phar self-update $ php composer.phar update
成功したら、以下のファイルを差分を確認しつつ手動で更新します。
fuel/app/bootstrap.php
public/.htaccess
public/index.php
単純に置き換えてしまうと危険です。例えば、fuel/app/bootstrap.phpであれば以下に追記している場合など、記述が消えてしまうと動かなくなる可能性があります。
\Autoloader::add_classes(array( // ここの記述を消してしまわないように!! ));
これで無事にアップデートできたと思いきや、サーバーのPHPが7.2以上の場合にはエラーが出ます。
Warning - get_class() expects parameter 1 to be object, null given in ***\fuel\core\classes\security.php on line 241
FuelPHP 1.8 が PHP 7.2 で変更された修正に対応されていないために出るエラーのようです。FuelPHP 1.9/develop だと対応されているらしいですが、今回は1.8なので別途対応が必要です。
以下を参考にさせていただきました。
PHP7.2でFuelPHPがエラーになるのを何とかする – Qiita
fuel/app/classes/extend/security.phpを以下の内容で作成します。
<?php class Security extends Fuel\Core\Security { public static function htmlentities($value, $flags = null, $encoding = null, $double_encode = null) { static $already_cleaned = array(); is_null($flags) and $flags = \Config::get('security.htmlentities_flags', ENT_QUOTES); is_null($encoding) and $encoding = \Fuel::$encoding; is_null($double_encode) and $double_encode = \Config::get('security.htmlentities_double_encode', false); // Nothing to escape for non-string scalars, or for already processed values if (is_null($value) or is_bool($value) or is_int($value) or is_float($value) or in_array($value, $already_cleaned, true)) { return $value; } if (is_string($value)) { $value = htmlentities($value, $flags, $encoding, $double_encode); } elseif (is_object($value) and $value instanceOf \Sanitization) { $value->sanitize(); return $value; } elseif (is_array($value) or ($value instanceof \Iterator and $value instanceof \ArrayAccess)) { // Add to $already_cleaned variable when object is_object($value) and $already_cleaned[] = $value; foreach ($value as $k => $v) { $value[$k] = static::htmlentities($v, $flags, $encoding, $double_encode); } } elseif ($value instanceof \Iterator or get_class($value) == 'stdClass') { // Add to $already_cleaned variable $already_cleaned[] = $value; foreach ($value as $k => $v) { $value->{$k} = static::htmlentities($v, $flags, $encoding, $double_encode); } } elseif (is_object($value)) { // Check if the object is whitelisted and return when that's the case foreach (\Config::get('security.whitelisted_classes', array()) as $class) { if (is_a($value, $class)) { // Add to $already_cleaned variable $already_cleaned[] = $value; return $value; } } // Throw exception when it wasn't whitelisted and can't be converted to String if ( ! method_exists($value, '__toString')) { throw new \RuntimeException('Object class "'.get_class($value).'" could not be converted to string or '. 'sanitized as ArrayAccess. Whitelist it in security.whitelisted_classes in app/config/config.php '. 'to allow it to be passed unchecked.'); } $value = static::htmlentities((string) $value, $flags, $encoding, $double_encode); } return $value; } }
fuel/app/bootstrap.phpに以下を追記して拡張したクラスを有効化します。
\Autoloader::add_classes(array( 'Security' => APPPATH.'classes/extend/security.php', ));
これでエラーも出なくなり、無事にアップデート出来ました。