環境
- CodeIgniter 3.0.6
- ドキュメントルートに展開した状態とする。
- つまりドキュメントルートに展開された application、system ディレクトリがあるとする。
- PHP 5.6
ポイント
- application/ ディレクトリに compose.json を作成し、
composer installすること。 - application/config/config.php で
$config['composer_autoload'] = TRUE;<とすること。
上記は次のようなシンプルな構成とするときのポイントです。
- application/vendor/ ディレクトリに Composer の諸々がインストールされる構成
もっといろいろ自由にする場合は、上記のポイントからいろいろ変える必要があるようです。
オートロードを実現して何をしたいのか?
application/ ディレクトリに domain/ ディレクトリを作成し、ここに PHP ファイルを置きたいのです。
そして、コントローラーから domain/ ディレクトリの PHP を使いたいのです!
CodeIgniter に Composer のオートロードを導入するまでの手順
Composer の導入
composer.json を作成します。
{
"autoload": {
"psr-4": {
"domain\\": "domain/"
}
}
}
composer.json を作成したディレクトリで次を実行します。すると、application/vendor/ に必要なものがダウンロード・生成されます。
php composer.phar install
CodeIgniter 設定の変更
CodeIgniter でオートロードの設定を有効にします。
... 略 ... $config['composer_autoload'] = TRUE; ... 略 ...
オートロードされる PHP ファイルを作成
PHP で require、include したくないので Composer のオートロード (autoload) に入門する – oki2a24 でも使用した、2 つのクラスを作成します。
<?php
namespace domain;
use domain\equipment\Weapon;
Class User {
private $user_name;
private $weapon;
public function __construct($user_name, $weapon) {
$this->user_name = $user_name;
$this->weapon = $weapon;
}
public function hello() {
return "{$this->user_name} says hello!";
}
public function attack() {
return "{$this->user_name} attacked with {$this->weapon->weapon_name()}!";
}
}
<?php
namespace domain\equipment;
Class Weapon {
private $weapon_name;
public function __construct($weapon_name) {
$this->weapon_name = $weapon_name;
}
public function weapon_name() {
return $this->weapon_name;
}
}
コントローラーからオートロードを試すためのファイルを作成
<?php
use domain\User;
use domain\equipment\Weapon;
class Pages extends CI_Controller {
public function view($page = 'home')
{
$weapon1 = new Weapon('sword');
$user1 = new User('user1', $weapon1);
$data['hello'] = $user1->hello();
$data['attack'] = $user1->attack();
$this->load->view('pages/home', $data);
}
}
てすと <br> <?php echo $hello; ?> <br> <?php echo $attack; ?>
オートロードを試す
http://localhost/ci306-fortrialanderror/index.php/pages/view
など、pages コントローラーの、view メソッドにアクセシしますと、
てすと
user1 says hello!
user1 attacked with sword!
が表示されました。成功です!やったぜ!
おわりに
domain ディレクトリの PHP ファイルに CodeIgniter のコントローラーからアクセスできるようになりました。
今回の投稿の試みでなにが嬉しいかと申しますと、domain ディレクトリにシステムの部品となるクラスを小さく必要な数だけ用意できるようになります♪ドメイン駆動設計も可能になるはずです♪
あとは、多分大丈夫でしょうけれども、モデルからも domain ディレクトリの PHP ファイルにアクセスできるようになればバッチリですね♪
