生活の跡

個人的な備忘録

FuelPHPのドキュメントだけではモジュールの使い方がわからなかった

概要

最近、FuelPHP(Webアプリ開発用のフレームワーク)を勉強し始めました。モジュールというのを使ってみたいと思ったのですが、公式ドキュメントをみながらやっても上手くできずに四苦八苦しました。Webで調べても専門的すぎたりファイルの場所が書いてなかったりしたので、初心者の私では情報が足りず。。
しかし、なんとかコントローラからモジュールを呼び出すことができたので、具体例を載せておきます。

目的

コントローラからモジュールを呼び出して値を受け取る。できるだけシンプルに。

環境

あまり環境によって変わらないと思いますが、一応。
* macOS Mojave
* FuelPHP 1.8.2
* PHP 7.2.1

公式ドキュメント(FuelPHP 1.8)

モジュールの文中にリンクがありますが、HMVCも参考になると思います。

・モジュールについて
モジュール - 概要 - FuelPHP ドキュメント

・HMVC(階層的MVC)について
HMVC リクエスト - 概要 - FuelPHP ドキュメント

ファイル

1.コントローラ(モジュール呼び出し元)

概要
  1. 「sample1」モジュールの「sample1」クラスの「test」メソッドに、パラメータ「taro」を渡す。
  2. モジュールから「hi taro」の文字列を受け取る。
  3. ビュー「sample.php」に「hi taro」を表示させる。
ファイルパス

fuel/app/classes/controller/sample.php

コード
<?php

class Controller_Sample extends Controller
{ 
  public function action_index(){
    //モジュールのコントローラを呼び出して値を受け取る
    $comment = Request::forge('sample1/sample1/test/taro', false)->execute();
    
    //ビューを作成
    $view = View::forge('sample.php');
    $view->set('comment', $comment);
    
    //ブラウザに出力するビューを割り当て
    return $view;
  }
}

2.呼び出すモジュール

概要

受け取ったパラメータ$name に「hi 」をつけて返す

ファイルパス

fuel/app/modules/sample1/classes/controller/sample1.php

コード
<?php

namespace sample1;

class Controller_Sample1 extends \Controller
{
  public function action_test($name){
    return 'hi '.$name;
  }
}

3.ビュー

概要

コントローラから渡された $comment を表示するだけ。

ファイルパス

fuel/app/views/sample.php

コード
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>サンプル</title>
</head>
<body>
  <?php echo $comment; ?>
</body>
</html>

4.設定ファイル

概要

モジュールのファイルを探せるように設定する。ほぼドキュメントに書かれている通りなので、そちらも参考にしてください。

ファイルパス

fuel/app/config/config.php

コード
〜省略〜
     'module_paths' => array(
       APPPATH.'modules'.DS,
     ),
〜省略〜
        'modules' => array(
          'sample1'
        ),
〜省略〜

ブラウザで表示

URL:localhost〜プロジェクト名/public/sample
(※)環境によって読み替えてください。コントローラ「sample」にアクセスしています。

f:id:ishii-akihiro:20190925203410p:plain
ブラウザで表示

注意する点(つまづいた点)

1. モジュール名はコントローラ名と同じにしない

今回モジュール名を「sample1」にしましたが、呼び出し元コントローラと同じ「sample」にすると404エラーになります。
ブラウザから見ると「sample」というコントローラが2つあるように見えて、どっちを呼べばいいかわからない的なアレだと思います(名前空間の取り扱いがちゃんと理解できていないです。。)。

2. モジュールのメソッド名

taro メソッドを呼び出していますが、モジュールでは「action_taro」としています。普通のコントローラと同じルールで「action_」が必要なんですね。メソッド名を「taro」にするとエラーになります。
下記リンク先の情報が参考になりました。 stackoverflow.com