【大阪 / 横浜】インフラ / サーバーサイドエンジニア募集中!

【大阪 / 横浜】インフラ / サーバーサイドエンジニア募集中!

【25卒向け】AI×バーチャル面接の募集を開始いたしました!

【25卒向け】AI×バーチャル面接の募集を開始いたしました!

【導入実績 500社以上】AWS 構築・運用保守・監視サービス

【導入実績 500社以上】AWS 構築・運用保守・監視サービス

【CentOS 後継】AlmaLinux OS サーバー構築・移行サービス

【CentOS 後継】AlmaLinux OS サーバー構築・移行サービス

【WordPress 専用】クラウドサーバー『ウェブスピード』

【WordPress 専用】クラウドサーバー『ウェブスピード』

【格安】Webサイト セキュリティ自動診断「クイックスキャナー」

【格安】Webサイト セキュリティ自動診断「クイックスキャナー」

【低コスト】Wasabi オブジェクトストレージ 構築・運用サービス

【低コスト】Wasabi オブジェクトストレージ 構築・運用サービス

【予約システム開発】EDISONE カスタマイズ開発サービス

【予約システム開発】EDISONE カスタマイズ開発サービス

【100URLの登録が0円】Webサイト監視サービス『Appmill』

【100URLの登録が0円】Webサイト監視サービス『Appmill』

【中国現地企業に対応】中国クラウド / サーバー構築・運用保守

【中国現地企業に対応】中国クラウド / サーバー構築・運用保守

【YouTube】ビヨンド公式チャンネル「びよまるチャンネル」

【YouTube】ビヨンド公式チャンネル「びよまるチャンネル」

[FuelPHP 1.7] Autoloaderクラスを拡張する

PHP

WEBチームの日下部です。

FuelPHP 1.7 で Autoloader クラスを拡張する方法で悩んだので書き記します!

 

やりたいこと

\Fuel\Core\Autoloaderクラスを拡張し、Autoloaderクラスとして定義する

 

FuelPHPのコアクラスを拡張するやり方は

http://fuelphp.jp/docs/1.7/general/extending_core.html (FuelPHP 1.7)

ここに書かれている通りです。

拡張するのが Autoloader ではなく、例えば Response クラスなら簡単です。

class Response extends FuelCoreResponse { }

を app/classes/response.php として保存し、app/bootstrap.php のadd_classesにクラス名とファイルパスの対応を書き込めばokですね。

Autoloader::add_classes(array(
    'Response' => APPPATH.'classes/response.php',
));

ところがこれと同じ手順でAutoloaderを拡張しようとしてもうまくいきません。
なぜですか? Autoloaderだけは例外だからだ!

 

悩んだところ

さっきのドキュメントの一番下にこう書かれています。

Autoloader

The Autoloader class is a special case, you can only extend it once as [Autoloader] and have it used. After extending it you have to require it manually in the [app/bootstrap.php] file after the original [FuelCoreAutoloader], don't forget to remove the line that aliases the core class to global.

すなわちこういうことです。

 

  1. FuelCoreAutoloader を拡張した Autoloader クラスファイルを app/bootstrap.php 内で手動で require する
  2. remove the line that aliases the core class to global (???)

 

1つめはわかる! こうすればいい。

app/classes/autoloader.php を作成して、

class Autoloader extends FuelCoreAutoloader { }

app/bootatrap.php の冒頭に

require APPPATH.'classes'.DIRECTORY_SEPARATOR.'autoloader.php';

を記述。

 

2つめの意味がわからなかった! わからなかったので無視してページを開いてみると

Cannot redeclare class Autoloader

こっからしばらく悩みましたが解決しました。

結論から言うと、 public/index.php の50行目付近

class_alias('Fuel\Core\Autoloader', 'Autoloader');

これをコメントアウトすればokです。

 

この行の意味するところは

「グローバル名前空間の Autoloader から、名前空間 FuelCore 内の Autoloader へのエイリアスを張る」

です。(class_alias() については http://php.net/manual/function.class-alias.php を参照)

このエイリアスがあったために、

class Autoloader extends FuelCoreAutoloader { }

とすると、Autoloader を二重定義かつ自分自身を継承という事態になっていました。

 

 

まとめると、

コアクラスの Autoloader を拡張するときは

  1. app/classes/autoloader.php を作成
    class Autoloader extends FuelCoreAutoloader { }
  2. app/bootstrap.php の冒頭に
    require APPPATH.'classes'.DIRECTORY_SEPARATOR.'autoloader.php';

    を記述

  3. public/index.php (50行目付近)の
    class_alias('Fuel\Core\Autoloader', 'Autoloader');

    をコメントアウト

の3点を抑えればokです。お後がよろしいようで。

 

この記事がお役に立てば【 いいね 】のご協力をお願いいたします!
0
読み込み中...
0 票, 平均: 0.00 / 10
1,583
X facebook はてなブックマーク pocket
【2024.6.30 CentOS サポート終了】CentOS サーバー移行ソリューション

【2024.6.30 CentOS サポート終了】CentOS サーバー移行ソリューション

【25卒向け】AI×バーチャル面接の募集を開始いたしました!

【25卒向け】AI×バーチャル面接の募集を開始いたしました!

【大阪 / 横浜】インフラエンジニア・サーバーサイドエンジニア 積極採用中!

【大阪 / 横浜】インフラエンジニア・サーバーサイドエンジニア 積極採用中!

この記事をかいた人

About the author