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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

FuelPHP

FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

Q&A

解決済

1回答

2981閲覧

FuelPHP ORMパッケージの拡張の方法

search_search

総合スコア187

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

FuelPHP

FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

0グッド

0クリップ

投稿2016/06/21 20:02

編集2016/06/21 20:04

FuelPHPを学習中です。ORMパッケージに機能を追加したくて、拡張を試みたのですが、うまくいきません。
Orm\Queryにページネーション用のメソッドを追加し、Orm\Queryを置き換えようとしています。

php

1class Query extends \Orm\Query 2{ 3 //追加したメソッド 4 public function paginate() 5 { 6 7 } 8}

上記のクラスを作り、packages/orm/bootstrap.phpを以下のように変更しました。

//'Orm\\Query' => __DIR__.'/classes/query.php', 'Query' => APPPATH.'/classes/query.php',

しかし、これだと'Orm\Query' not foundと言われてしまいました。

検索して調べてみると、パッケージを拡張するやり方として、
「パッケージからファイルをコピーしてapp/classesにペーストし、それに対して変更を加える」というものがありました。しかし、そのやり方は拡張というよりは改変に近く、やりたくありません。

他にいい方法はないでしょうか?

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

FuelPHPを業務で使っていた者です。

php

1//'Orm\\Query' => __DIR__.'/classes/query.php', 2'Query' => APPPATH.'/classes/query.php',

上記のやり方ですとQueryクラスが追加されますが、
'Orm\Query'ではなくあくまで'Query'というパスにはなるため、not foundになります。

なので、'Orm\Query'で呼び出すためには、以下の様にする必要があります。

php

1namespace Orm; // \Ormのため 2 3class Query extends \Orm\Query 4{ 5 //追加したメソッド 6 public function paginate() 7 { 8 9 } 10}

php

1'Orm\\Query' => APPPATH.'/classes/query.php',

でも、残念がら動きません。\Orm\Queryクラスが\Orm\Queryクラスを継承するという訳分からない状況になってしまうので。。。
全く同じパス(名前空間もクラス名も同じ)での継承がどうしても出来なかったため、名前空間を変えるか、クラス名を変えるかしないとうまくいかなかった記憶があります。
参考: http://madroom-project.blogspot.jp/2012/02/fuelphporm.html

コアクラスであれば普通に拡張出来るんですが。
(\Fuel\Coreを省略して呼び出すという、Fuelの内部の仕組みを活用しているからこそ出来る荒業ですが)

php

1// クラス宣言 2class Response extends \Fuel\Core\Response; 3 4// 呼び出し 5Autoloader::add_classes(array( 6 // Add classes you want to override here 7 'Response' => APPPATH.'extension/core/classes/response.php', 8));

あまりお役に立てず申し訳ないですが、コアクラス以外の拡張に関しては、
結局クラス名を変えるか、namespace を変えるか、ファイルをコピーして書き換えるかで、対応したというのが私の実際の所です。

投稿2016/06/22 04:02

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

search_search

2016/06/23 20:48

コメントありがとうございます。参考URLを参考に、新しいクラスをMyOrm\Queryとして実装したところ、paginateを呼び出したところで、undefined Orm\Query::paginate と言われてしまいました。 しかし、MyOrm\Queryに適当なstatic関数を追加して、完全名で呼び出したところ、正常に動作しました。どうやら、MyOrmパッケージはちゃんと読み込まれているものの、既存のOrm側がそれを使用していないようでした。 そこで、\Orm\ModelのQuery生成関数をオーバーライドして、MyOrm\Queryを返すようにしたところ、無事に、新たに追加したpaginate関数を使用することができるようになりました! 実はCoreクラスの拡張はすでにやっていたのですが、同じ要領でパッケージを拡張することができなかったので、困っていました。本当に助かりました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問