質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.22%

FuelPHP php oil generateで生成されるファイルの場所を、任意の場所に変更したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 755

kuzurotto

score 403

題名の通りなのですが、php oil g modelを実行すると通常は/fuel/app/classes/modelに生成されます。

しかし、moduleを使っているため
fuel/app/modules/provide/classes/modelに生成させたいのですが、どこで設定するのでしょうか。

「fuelphp module oil model 場所 変更」
で探してるのですがなかなか情報が見当たらず。。。

追記
もしかして設定変更できない?
oilファイルから分析してみました。

public static function model($args, $build = true)
    {
        $singular = \Inflector::singularize(\Str::lower(array_shift($args)));

        if (empty($singular) or strpos($singular, ':'))
        {
            throw new Exception("Command is invalid.".PHP_EOL."\tphp oil g model <modelname> [<fieldname1>:<type1> |<fieldname2>:<type2> |..]");
        }

        if (empty($args))
        {
            throw new Exception('No fields have been provided, the model will not know how to build the table.');
        }

        $plural = \Cli::option('singular') ? $singular : \Inflector::pluralize($singular);

        $filename = trim(str_replace(array('_', '-'), DS, $singular), DS);
        $base_path = APPPATH;

        if ($module = \Cli::option('module'))
        {
            if ( ! ($base_path = \Module::exists($module)) )
            {
                throw new Exception('Module '.$module.' was not found within any of the defined module paths');
            }

            $module_namespace = ucwords($module);
        }

        // こいつを発見。
        $filepath = $base_path.'classes'.DS.'model'.DS.$filename.'.php';


該当箇所を$filepath = $base_path.'modules'.DS.$filename.'.php';に修正してみるとmodel生成場所が変わりました。

configフォルダ配下に何かしらのファイル持ってきてdb.phpみたいな感じで上書きするのかなぁーとか思ってたんですが
ハードコーディングされてるし、イメージと違うのか、、、

このファイルってfuel/packages/oil/classes/generate.phpでパッケージに入ってるんで、ちょっと悩みます。
僕はpackagesやvendorはgit管理していないので、model生成場所がハードコーディングされている以上、対応できないですね。。。

未検証だけど、fuel/packages/oil/classes/generate.phpでのmodel生成場所を修正してgit管理したところで多分、composer updateしたらgit管理しているfuel/packages/oil/classes/generate.phpが上書きされてしまう気がする。

なにか方法はないものか。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

ファイル生成場所がコマンドによる指定に対応していない為、独自がoilを拡張。

fuel/packages/oilを拡張して解決。
fuel/packages/oil自体を拡張してgit管理しても新規端末からのgit clone時のcomposer updateによってfuel/packages/oilが上書きされてしまうため意味がない。

なので、fuel/packages/oilをfuel/packages/materialなどという感じでまるごとコピー。
このfuel/packages/materialはgit管理対象とする。

あとは独自コマンドに対応する$_SERVER['argv']を既存のoilファイルで判定して独自コマンドがあればでfuel/packages/materialを使うようにする。

// Boot the app
require APPPATH.'bootstrap.php';

// Load oil package
\Package::load('oil');
\Package::load('material');

// Generation Directory Change(gdc or GDC)
$original_commands = [
    '--gdc',
    '--GDC'
];
$is_proprietary_processing = false;
foreach ($original_commands as $original_command) {
    if($is_proprietary_processing) {
        break;
    }
    // 独自コマンドがあるかチェック。
    $is_proprietary_processing = in_array($original_command, $_SERVER['argv']);
}

if ($is_proprietary_processing) {
    \Material\Command::init($_SERVER['argv']);
} else {
    // Fire up the command line interfact
    \Oil\Command::init($_SERVER['argv']);
}

service層など独自の層があるなら独自コマンドを受け取って、下記ファイルで判定してGenerate::create()で生成場所を指定したりすればやりたいことの完成。

fuel/packages/material/classes/generate.php
fuel/packages/material/classes/generate/scaffold.php

MG-MacBook-Pro:model_fuelphp_test_migration MacPRO-N-GOTO$ php oil g scaffold monkey name:string description:text -f --with-presenter --gdc
string(125) "/Applications/MAMP/htdocs/Dev/personal/web/model_fuelphp_test_migration/fuel/packages/material/views/scaffolding/template.php"
    Creating migration: /Applications/MAMP/htdocs/Dev/personal/web/model_fuelphp_test_migration/fuel/app/migrations/001_create_monkeys.php
    Creating model: /Applications/MAMP/htdocs/Dev/personal/web/model_fuelphp_test_migration/fuel/app/modules/provide/classes/model/app/monkey.php
    Creating controller: /Applications/MAMP/htdocs/Dev/personal/web/model_fuelphp_test_migration/fuel/app/modules/web/classes/controller/monkey.php
    Creating view: /Applications/MAMP/htdocs/Dev/personal/web/model_fuelphp_test_migration/fuel/app/modules/web/views/monkey/index.php
    Creating view: /Applications/MAMP/htdocs/Dev/personal/web/model_fuelphp_test_migration/fuel/app/modules/web/views/monkey/view.php
    Creating view: /Applications/MAMP/htdocs/Dev/personal/web/model_fuelphp_test_migration/fuel/app/modules/web/views/monkey/create.php
    Creating view: /Applications/MAMP/htdocs/Dev/personal/web/model_fuelphp_test_migration/fuel/app/modules/web/views/monkey/edit.php
    Creating view: /Applications/MAMP/htdocs/Dev/personal/web/model_fuelphp_test_migration/fuel/app/modules/web/views/monkey/_form.php
MG-MacBook-Pro:model_fuelphp_test_migration MacPRO-N-GOTO$ php oil r migrate
Performed migrations for app:default:
001_create_monkeys
MG-MacBook-Pro:model_fuelphp_test_migration MacPRO-N-GOTO$ php oil r migrate:down
Reverted migrations for app:default:
- 001_create_monkeys
MG-MacBook-Pro:model_fuelphp_test_migration MacPRO-N-GOTO$ 

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる