はじめに
CodeIgniter4の動作要件の1つとして、PHPのintl拡張モジュールが有効化されていることが挙げられますが、CodeIgniter4ベースのシステムをレンタルサーバで運用する際、intl拡張モジュールが無い問題にしばしば遭遇します。
intl拡張モジュールが有効化されたレンタルサーバやVPS/IaaSを選択すれば解決しますが、諸般の事情により他サービスを選択できないケースもあり、非常に悩ましい問題であったりもします。(CodeIgniter4に限らず、CakePHPやLaravel等の他のフレームワークやCMS等をレンタルサーバ上で運用する際においても、しばしば悩まされます)
今回、CodeIgniter4のソースコードを書き換えることで、intl拡張モジュールの無い環境でCodeIgniter4を動作させることが出来ましたので、以下に手順を記載します。
CodeIgniter4のバージョン
CodeIgniter 4.4.6
変更点
上記以外のバージョンにおいても同様の変更箇所を変更することで、intl拡張モジュールの無い環境で動作させることは可能と思われます。
// 218行目と238行目をコメントアウト
199 /**
200 * Handles some basic app and environment setup.
201 *
202 * @return void
203 */
204 public function initialize()
205 {
206 // Define environment variables
207 $this->bootstrapEnvironment();
208
209 // Setup Exception Handling
210 Services::exceptions()->initialize();
211
212 // Run this check for manual installations
213 if (! is_file(COMPOSER_PATH)) {
214 $this->resolvePlatformExtensions(); // @codeCoverageIgnore
215 }
216
217 // Set default locale on the server
218 - Locale::setDefault($this->config->defaultLocale ?? 'en');
218 + // Locale::setDefault($this->config->defaultLocale ?? 'en');
219
220 // Set default timezone on the server
221 date_default_timezone_set($this->config->appTimezone ?? 'UTC');
222
223 $this->initializeKint();
224 }
225
226 /**
227 * Checks system for missing required PHP extensions.
228 *
229 * @return void
230 *
231 * @throws FrameworkException
232 *
233 * @codeCoverageIgnore
234 */
235 protected function resolvePlatformExtensions()
236 {
237 $requiredExtensions = [
238 - 'intl',
238 + // 'intl',
239 'json',
240 'mbstring',
241 ];
242
243 $missingExtensions = [];
244
245 foreach ($requiredExtensions as $extension) {
246 if (! extension_loaded($extension)) {
247 $missingExtensions[] = $extension;
248 }
249 }
250
251 if ($missingExtensions !== []) {
252 throw FrameworkException::forMissingExtension(implode(', ', $missingExtensions));
253 }
254 }
// 73-74行目に `$locale = 'ja-JP';` を追加
73 {
+ $locale = 'ja-JP';
74 $this->locale = $locale ?: Locale::getDefault();
制限事項
この変更を行うことでintl拡張モジュールの無い環境でもCodeIgniter4が動作するようになります。しかし、当然ではありますがintl拡張モジュールに依存する処理は動作しません。例えば、 Times and Dates ライブラリはintl拡張モジュールに依存するため、このライブラリが提供するメソッドを利用しようとするとエラーになります。
その他、バリデーションの一部機能や国際化に関する機能が期待通りの動作にならない(処理が無視される、エラーが発生する)等の制限が生じる場合もあるため、運用にあたっては注意が必要となります。可能であれば、CodeIgniter4のコードを確認のうえ、利用するライブラリやクラスのメソッドがintl拡張モジュールに依存していないこと、フォールバック処理が存在する場合はそのロジックがどのようになっているか確認することをお勧めします。