コムセント 技術情報

  1. TOP
  2. コムセント 技術情報
  3. 見落としがちなCodeigniter4のうっかりエラー7選

見落としがちなCodeigniter4のうっかりエラー7選

1.独自に404ページを作るとステータス上は200になってしまう

CodeIgniter 4はデフォルトで404ページ表示が用意されていますが、routes.phpに処理を書き込むことで独自の404ページを作ることができます。

$routes->set404Override(function(){
 echo view('404.php');
});

しかし、これを指定するだけだとHTTPステータスコード上は200、問題のないページとして判断されてしまいます。
throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound(); などの処理を使用して、強制的に404を表示した時もステータスコードは200となってしまいます。
そのため、独自の404ページを作る時はheader情報にステータスコードを仕込む、コントローラー側で404として出力するよう設定するなどして404と返すようにしましょう。

2.groupStart~groupEndの間に内容がないとエラーになる

CodeIgniter 4のクエリビルダでは、条件グループを作成するために「groupStart」と「groupEnd」というメソッドを使用します。これにより、ANDやOR条件をグループ化することで高度な絞り込み検索が可能となります。

しかしここで気をつけなければいけないのは、groupStart~groupEndの間に一切のSQL文を書かない場合は、エラーが発生してしまいます。
検索条件の有無など、「そもそも検索条件が存在しなかったりする」という場合は、gropeStart・gropeEndごと出力しないようにしなければいけません。

3.inputにおいてdisabledやreadonly属性を使いたい時は、'disabled'=>'disabled'と指定すればいい

inputタグを出力したい時はform_inputを利用します。第一引数にフォームの名前、第ニ引数にデフォルト値を指定し、第三引数に配列を与えることで、様々な設定を行うことができます。
その中でidやplaceholderの値を指定する時は'パラメータ名'=>'パラメータの値'という形で指定します。

form_input('test','1',array('id'=>'test','placeholder'=>'テスト'))

では、disabledやreadonlyといった、パラメータの値を指定しない場合はどのように描けばいいのでしょうか?これはパラメータ名とパラメータの値両方に同じものを書けば実装できます。
以下のように書きます。

form_input('test','1',array('id'=>'test','placeholder'=>'テスト','disabled'=>'disabled'))

4.タイムゾーン設定はPHP側の設定を無視する

通常、PHPのタイムゾーン設定はphp.iniなどで設定された値を参照しますが、Codeigniterが時間を取り扱う際にはこの設定を無視します。
CodeIgniter 4のタイムゾーンはapp/Config/App.phpファイル内で設定されているものを使用します。このファイル内の$appTimezone変数を編集することで、タイムゾーンを指定できます。デフォルトではアメリカ時間となっているので、'Asia/Tokyo'と設定して日本時間に合わせましょう。

5.ルーティングは自動だと大文字・小文字を区別しないが、手動だと区別される

CodeIgniter 4のURLルーティングには自動設定・手動設定の両方があります。
自動設定にしていますと、例えば「Blog」というcontrollerを作ると、自動的にhttps://example.com/blog/というURLでアクセスできるようになります。
同時に、https://example.com/Blog/ やhttps://example.com/bloG/といったURLでもアクセスできてしまいます。

手動設定を行う場合は、以下のようにRoutes.phpに書き込むことになります。

$routes->match(['get'],'blog/', 'Blog::index');

このように手動設定を行う場合は、大文字・小文字が厳密に区別されるため、BlogやbloGといったURLではアクセスできません。
デフォルトでは手動設定であり、またセキュリティ上の問題からも手動設定が推奨されていることから、混同することはなさそうに思えますが
CodeIgniter 3、及びCodeIgniter 4の途中までのバージョンまでは自動でしたので、当時から使っていると、この設定で引っかかりがちなので注意が必要です。

6.手動ルーティングを行う時に(:any)などを付けている場合、any部分になにもない場合はルーティングが行われない

具体的には、以下のような状態だと発生します。

$routes->match(['get'],'blog/test/(:any)', 'Blog::test/$1');

以上の設定ですと、「https://example.com/blog/test/(何かの文字列)」 というURLでアクセスが可能ですが、
「https://example.com/blog/test」だとアクセスすることができず、404となってしまいます。
「https://example.com/blog/test」と「https://example.com/blog/test/(何かの文字列)」というURLを両立させる場合は、以下のようにニ種類指定すると可能になります。
$routes->match(['get'],'blog/test/', 'Blog::test);
$routes->match(['get'],'blog/test/(:any)', 'Blog::test/$1');


7.CSRF保護を有効にしていると、<form>やAjax通信で問題が発生する可能性がある

CodeIgniter 4では、セキュリティのためにCSRF保護機能(Cross-Site Request Forgery)が実装されています。
この機能は、フォームからPOST送信を行う時、CSRFトークンを用いて通信のチェックを行います。
通常はform_open()をを使用することで、自動的にform_hiddenが生成され、フォーム送信時にCSRFトークンが送信されるようになります。

ただし、form_openを使わない状態、例えばform_openを使わず直に<form>を入力したり、ajax通信でデータを送る時などにはCSRFトークン情報が自動で送信されることはないため、エラーが発生します。
CSRFトークン情報を手動で出力することはできるので、ajaxなどを使用する時は、トークン名とトークン情報を一緒にサーバーに送るようにしましょう。

以上7選でした。役に立つ知識はありましたでしょうか?
本記事がCodeigniter 4を使っていく上で何かの役に立てば幸いです。

プログラマー/S.Y

このメンバーの記事一覧へ

おすすめ記事