こんにちは。よっしーです(^^)
今日は、docker で環境構築した CodeIgniter に新規コントローラを追加する方法についてご紹介します。
前提条件
この記事では、Dockerでの環境構築が完了していることを前提にしています。環境構築の方法については、下記の記事を参考にお願いします。
Blogコントローラの追加
まず、下記のファイル(Blog.php)を用意します。
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Blog extends CI_Controller {
public function index()
{
echo 'Hello World!';
}
}
このファイル(Blog.php)を下記のパスに配置します。
./app/CodeIgniter-3.1.13/application/controllers/Blog.php
配置が完了したら、ブラウザで「http://localhost:8080/index.php/Blog」にアクセスします。
上図のように、Hello World!が表示されました。これで、コントローラの追加ができました。
メソッドの追加
Blogコントローラに下記のメソッドを追記します。
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Blog extends CI_Controller {
public function index()
{
echo 'Hello World!';
}
public function comments()
{
echo 'Look at this!';
}
}
追記が完了したら、ブラウザで「http://localhost:8080/index.php/Blog/comments」にアクセスすると、「Look at this!」が表示されます。このようにコントローラのメソッドに追加して、リクエストできるようになります。なお、メソッドが省略されたときは、indexが使用されるため、indexメソッドにリクエストする際は、Blogのコントローラ名だけでも可能になります。なので、「http://localhost:8080/index.php/Blog/」と「http://localhost:8080/index.php/Blog/index」は同じ結果になります。
メソッドに引数を渡す
下記のファイル(Products.php)を用意します。
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Products extends CI_Controller {
public function shoes($sandals, $id)
{
echo $sandals;
echo $id;
}
}
このファイル(Blog.php)を下記のパスに配置します。
./app/CodeIgniter-3.1.13/application/controllers/Products.php
配置が完了したら、ブラウザで「http://localhost:8080/index.php/Products/shoes/sandals/123」にアクセスします。
アクセスすると、「sandals123」と表示され、メソッドに引数を渡すことができます。
URLからindex.phpを除去する
ブラウザでアクセスする際に、URLに index.php が含まれていますが、これを削除する方法についてご紹介します。
下記のファイル(.htaccess)を用意します。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
httpd.conf の AllowOverride を All に変更します。
<Directory "/var/www/html">
(略)
AllowOverride All
(略)
</Directory>
docker-compose.yml の volumes に下記を追記します。
- ./.htaccess:/var/www/html/.htaccess
- ./httpd.conf:/etc/httpd/conf/httpd.conf
再起動します。
docker compose down
docker compose up -d
ブラウザで「http://localhost:8080/Blog」にアクセスすると「http://localhost:8080/indesx.php/Blog」と同じ結果になります。
これで、index.php がなくてもアクセスすることができるようになりました。
解説
.htaccess
.htaccessは、Apache HTTPサーバーで使用される構成ファイルの一種です。このファイルは、特定のディレクトリまたはサイト全体に対するWebサイトの構成を変更するために使用されます。.htaccessファイルを使用することで、以下のような機能を実現できます。
- URLのリライト
- アクセスの制限
- MIMEタイプの指定
- カスタムエラーページの表示
- キャッシュの設定
.htaccessファイルは、テキストエディタで作成することができます。作成したファイルをWebサイトのルートディレクトリまたは特定のディレクトリに配置することで、指定した機能が有効になります。ただし、.htaccessファイルを使用するには、Apacheの設定でAllowOverrideが有効になっている必要があります。
.htaccessファイルを使用することで、Webサイトの機能やセキュリティを強化することができます。ただし、誤った設定が悪影響を及ぼす可能性もあるため、慎重に設定する必要があります。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
上記のコードは、URLのリライトを実現するための.htaccessファイルの設定です。具体的には、リクエストされたURLが存在しないファイルまたはディレクトリの場合に、URLを書き換えてindex.phpファイルに転送するという処理を行います。
以下が各行の意味です。
RewriteEngine On
1行目:RewriteEngineディレクティブは、URLのリライト機能を有効にするために必要です。
RewriteCond %{REQUEST_FILENAME} !-f
2行目:REQUEST_FILENAME変数は、Apacheサーバーによってリクエストされたファイル名またはパスを含む変数です。この条件式は、リクエストされたファイルが存在しない場合にマッチします。!-fは、「存在しないファイルである場合」を意味します。
RewriteCond %{REQUEST_FILENAME} !-d
3行目:!-d この条件式は、リクエストされたファイルが存在しないディレクトリの場合にマッチします。!-dは、「存在しないディレクトリである場合」を意味します。
RewriteRule ^(.*)$ index.php/$1 [L]
4行目:RewriteRuleディレクティブは、リクエストされたURLを書き換えるために使用されます。このルールは、リクエストされたURLの末尾に/をつけた状態で、index.phpファイルに転送します。[L]フラグは、ルールにマッチした場合に、以降のルールを無視することを指定します。
例えば、以下のようなURLがリクエストされた場合に、index.phpに転送されます。
- /example
- /example/123
- /example/abc/xyz
以上が、このコードが実現するURLのリライトの仕組みです。
httpd.conf
起動しているコンテナのhttpd.confは、下記の手順でローカル環境にコピーできます。
docker ps
# 取得したいコンテナのCONTAINER ID をメモ
# xxx を上記でメモしたCONTAINER IDに置換する
docker cp xxx:/usr/local/apache2/conf/httpd.conf .
おわりに
今日は、CodeIgniterでコントローラを追加して、index.php を消す方法をご紹介しました。次回は、PHPのプロファイラをインストールしてみたいと思います。
また明日お会いしましょう!
コメント