[PHP][フレームワーク]CodeIgniterスレ
- 1 :nobodyさん:2007/04/27(金) 23:17:16 ID:???
- 公式:http://www.codeigniter.com/
チュートリアル:http://codeigniter.com/tutorials/
ユーザガイド日本語訳:http://ci-user-guide-ja.nought-point-999.net/
小回りの利くフレームワークの話題をひとつ!
- 417 :412:2008/07/03(木) 18:12:02 ID:???
- >>415
ちょいウソあったw
AppControllerじゃなくて MY_Controller だね
/system/application/library/MY_Controller.php
class MY_Controller extends Controller {
function MY_Controller() {
parent::Controller();
}
}
こんな感じ。
ログインの共通処理も ここでやろうかと思ったんだけど
それでいいのかがわからん…
>>416 みたいに 種類ごとにクラス作ったほうがいい気もするし…
- 418 :412:2008/07/03(木) 18:52:48 ID:???
- >>417 の方法でやってるんだが
/system/application/libraries/MY_Controller.php
のようなの作れば コアクラスは自動で置き換わるらしいんだが
置き換わらないな
コントローラ側で
class bbs extends MY_Controller {
}
みたいに MY_ つけてやらないとダメ
CIのルールだとデフォでMY_付けることになってるけど
これじゃ意味ないじゃん
バグ?
- 419 :nobodyさん:2008/07/03(木) 18:57:59 ID:???
- [/system/application/libraries/MY_Controller.php]
class TEST_Controller extends Controller {
}
[/system/application/controllers/test.php]
class Bbs extends TEST_Controller {
}
にしてもいけちゃう
class Bbs extends Controller {
}
だと TEST_Controller が継承されない
(ルール通りにクラス名を MY_Controller にしても場合も同じ)
コアクラス、置き換わってない…
バグくさいね orz
- 420 :412:2008/07/03(木) 19:38:23 ID:???
- ぼけてた 釣ってくる…
でも「コアクラスを拡張する場合のクラス名には MY_ を付ける」
っていう ルールは意味がないね
http://codeigniter.jp/user_guide_ja/general/core_classes.html
ファイルは MY_ 付けないと読み込んでくれないみたいだけど、
クラス名は別に MY_ 付ける必要ないよね?
なんでこんなこと書いてるんだろう
- 421 :nobodyさん:2008/07/03(木) 20:15:07 ID:???
- 英語版にはちゃんとした事書いてたりするけ?
- 422 :411 :2008/07/03(木) 20:23:33 ID:XZ5SMLTk
- 事故解決してたんだけどありがとう。
ただAppModelは相変わらずわかりません。
どのタイミングでロードすればええんですか?
Hook系もだめぽでした。
- 423 :412:2008/07/03(木) 22:43:11 ID:???
- >>422
>>419-420 の方法じゃだめなの?
クラス名 MY_ つけなくてもいけるっぽいから
AppControllerにしとけばいいんじゃ
よくわからん ルールだなあ
おれはてっきり Controller そのものを置き換えてくれるとおもったんだが
ライブラリとかヘルパはそうだよね
- 424 :nobodyさん:2008/07/04(金) 15:09:16 ID:???
- >>422
コントローラはMY_Controllerをextendsして書いてるが、
モデルは仕方ないので各モデルの冒頭で
<?php
require_once(APPPATH."libraries/MY_Model.php");
class Hoge_model extends MY_Model
- 425 :nobodyさん:2008/07/14(月) 11:55:08 ID:???
- $this->db->insert() するときに, created_at とか updated_at というカラムに current_timestamp を指定したいんだけど、どうやったらいいの?
$array = array('name'=>'Foo', 'created_at'=>'current_timestamp');
として insert() してみたけど、current_timestamp にならず 0000-00-00 00:00:00 になった。
ちなみにMySQL5.0
- 426 :nobodyさん:2008/07/14(月) 12:05:24 ID:???
- >>425
Database に、escapeしないでsetする方法ってあったっけ?
それがsetメソッドなら、
$db->エスケープしないset('create_at', '式');
$db->insert('テーブル名') でいけるような気がする。
以上想像。なければ、Databaseを拡張する必要があるかも?
俺もこの辺知りたい。ソース嫁って感じだけど
- 427 :nobodyさん:2008/07/14(月) 12:12:17 ID:???
- NOW()とかも文字列として扱っちゃうから
date('Y-m-d H:i:s') にするしかないと思う
オレは
function now()
{
return date('Y-m-d H:i:s');
}
っていう関数を作ってある
- 428 :nobodyさん:2008/07/14(月) 19:00:27 ID:???
- >>426-427
さんくすです。
できないみたいなので、
fuction current_timestamp() {
return date('Y-m-d H:i:s');
}
を使うことにしました。
でもこれだと、application server と database server が別だと
時刻を必ず揃えておく必要がありますね。
- 429 :nobodyさん:2008/07/14(月) 19:12:37 ID:???
- >>428
サーバの管理がきっちり出来ていれば、どんなサーバも1秒と違わないはずなので、時刻で
よっぽどシビアなソートやチェックをしていない限り、それは大丈夫かと。
また、原則からいうなら元々どちらかに合わせるべきなので、DBの関数が使えない時点で
application側の時刻のみを使うのが必然となるかな。
サーバ間の時刻あわせとは、微妙に話が違うような。
- 430 :nobodyさん:2008/07/14(月) 19:47:05 ID:???
- >>426-428
date_helperのunix_to_human じゃダメなのか?
unix_to_human(time(),TRUE,'eu');
- 431 :nobodyさん:2008/07/15(火) 06:26:58 ID:???
- うちでは、まず application/helpers/database_helper.php として↓を用意して
class SafeMarker {
private $_str;
public function __construct($str) { $this->_str = $str; }
public function __toString() { return $this->_str; }
}
function mark_as_safe($str) {
return new SafeMarker($str);
}
モデルの中でこんな感じで使ってますよ
$this->load->helper('database');
$this->db->set('foo', $bar);
$this->db->set('created_at', mark_as_safe('NOW()'));
$this->db->insert('mytable');
CI_DB_driver#escape を読むとわかるけど、gettype で 'string' でも 'boolean' でも
NULL でもない値はスルーしてくれるので、オブジェクトでラップすると通る。
ただし __toString はPHP5からかな。
一種のhackなので、NOW()みたいな安全だとわかっているものにしか使いませんが。
- 432 :nobodyさん:2008/07/15(火) 07:42:14 ID:???
- >>431
なんちゅうか、バッドノウハウの香りがw
> gettype で 'string' でも 'boolean' でもNULL でもない値はスルーしてくれる
っていう実装自体も、それに依存してるっていうのも、なんだかなあw
オブジェクトを渡されて、上記みたいにすることも前提にしてるのかな?>CI
(それなら、素直にescapeを回避するset系メソッドをつければいいのではと)
- 433 :431:2008/07/15(火) 12:59:01 ID:???
- >>432
どうみてもBKです。本当に(ry
CI内部の実装依存だからCIをバージョンアップすると動かなくなるかも。
個人的には、gettypeを見て判定、の部分はとりたてておかしなコードでは
ないので、マイナーバージョンアップであれば大丈夫だろうという甘い期待w
最悪、mark_as_safe で grep して置き換えれば、なんとかなるだろうとかw
素人にも玄人にもオヌヌメできない。\(^o^)/
- 434 :431:2008/07/15(火) 13:07:49 ID:???
- ってよくみたら set($key, $value = '', $escape = TRUE) って
第三引数があるじゃねーかw
$this->db->set('created_at', 'NOW()', FALSE);
で多分いけるね・・・ orz
- 435 :nobodyさん:2008/07/15(火) 13:10:36 ID:???
- >>434
でもそれだと
$this->db->insert('tablename', array('created_at'=>'NOW()'));
とかができないよね。
431の方法のほうが個人的に好み。
- 436 :nobodyさん:2008/07/15(火) 13:15:25 ID:???
- そういうの考えるのが面倒くさかったので、デフォで$this->db->insert($tablename, $valuearray);時は
created_atに作成日時をつっこみ、$this->db->update($tablename, $valuearray);時はupdated_atに
更新日時を突っ込むようにCI_DBを変更して使ってる。
バッドノウハウなのは百も承知だが、symfonyから流れてきた人にはこれが手放せないのよorz
- 437 :nobodyさん:2008/07/15(火) 17:00:08 ID:???
- >>436
それはDBのNOW()やCURRENT_TIMESTAMP()を使うの?
それともPHPのdate()を使うの?
前者ならまねしたいなあ
- 438 :nobodyさん:2008/08/02(土) 09:47:59 ID:???
- いつの間にか1.5から1.6になってる。
なんかかわったの?
- 439 :nobodyさん:2008/08/03(日) 18:45:02 ID:znW3bDml
- あれ、$this->dbがなくなってね?
- 440 :nobodyさん:2008/08/03(日) 19:04:30 ID:???
- kantigaidatta
- 441 :nobodyさん:2008/08/20(水) 20:18:05 ID:???
- CI使ってる人間ってどれぐらいいるんだろうか
- 442 :nobodyさん:2008/08/20(水) 20:44:32 ID:???
- 17人
- 443 :nobodyさん:2008/08/22(金) 13:30:33 ID:???
- CIってforward とか redirect とかはどうやるの?
- 444 :nobodyさん:2008/08/23(土) 00:51:34 ID:???
- headerで自分で
- 445 :nobodyさん:2008/08/23(土) 01:26:31 ID:???
- helperとか無かったっけ
まあぶっちゃけ自分でheader(ほげほげ)書くのと変わらないけど
- 446 :nobodyさん:2008/08/25(月) 13:31:03 ID:Ziu2Tqsv
- CodeIgniterでは、URLは「コントローラ名/メソッド名」というのが基本ですが、
このパターンを変更することはできますか。
やりたいのは、
- /blog/index
- /blog/show
- /blog/create
- /blog/edit
というのではなく、
- /blog/maka
- /blog/blackstar
- /blog/deaththekid
のように「コントローラ名/ユーザ名」のようにしたいということです。
つまり /blog 以下のアクセスをある特定のメソッドに縛りたいということです。
- 447 :nobodyさん:2008/08/25(月) 15:36:16 ID:???
- >>446
ヒント
config/routes.php
http://codeigniter.com/user_guide/general/routing.html
http://userguide.cilab.info/general/routing.html
- 448 :nobodyさん:2008/08/26(火) 15:08:09 ID:???
- >>447
ありがとうございます!
- 449 :nobodyさん:2008/08/26(火) 15:24:29 ID:???
- Routingについて質問です。
ユーザーズガイドの例にあったのですが、
$route['product/:num'] = "catalog/product_lookup";
という設定をした場合、「:num」の値は Catalog->product_lookup() の中で
どうやって取得すればいいのでしょうか。
通常だと Catalog->product_lookup() の引数にこの値が渡されますが、
試したところ、$route[] を設定した場合は渡されないようです。
- 450 :nobodyさん:2008/08/26(火) 15:37:11 ID:???
- >>449
英語のドキュメントに書いてありました。
$route['product/(:num)'] = "catalog/product_lookup_by_id/$1";
でいいみたいですね。
お騒がせしました。
- 451 :nobodyさん:2008/08/28(木) 12:20:46 ID:B/844Qiw
- $sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?";
$this->db->query($sql, array(3, 'live', 'Rick'));
この時、無関係な?は置換されないようになってますか?
たとえば、クエリの中に、hoge = 'fuga???'があった時など
- 452 :nobodyさん:2008/08/28(木) 22:52:42 ID:???
- >>451
ソレは自分で試してみたほうが早いんじゃない?
- 453 :nobodyさん:2008/08/29(金) 08:50:09 ID:???
- 複数のコントローラ間でメソッドを共有したいとき、どうするのがいいでしょうか。
できれば、あるコントローラのメソッド内で、別のコントローラをnewしてメソッドを実行できるのがいちばん理想的なんですが、そんなことできますか。
- 454 :nobodyさん:2008/08/29(金) 11:22:01 ID:???
- >>453
application/libraryにMY_Controllerを置き、共通メソッドはそこに置く。
そのメソッドを使うコントローラはextends MY_Controllerで作る。
- 455 :nobodyさん:2008/08/29(金) 11:44:55 ID:???
- >>454
しかしそれをしていると、だんだん多重継承っぽい事がしたくなってくるという罠
シンプルな処理、Controllerのプロパティ、機能等が必要ない様なものは、
ユーティリティクラスに切り出すとかもありかと思う
そして、libraries がカオスになるというセンスのない俺
- 456 :nobodyさん:2008/08/29(金) 14:42:55 ID:???
- >>454
MY_Controllerに相当するものは作っているんですが、そこにはやはり多くのコントローラに共通するものだけをおきたいです。
あるコントローラAとコントローラBだけが使うようなものは、やっぱりMY_Controllerにはおきたくないですよね。
class AB_Controller extends MY_Controller
class ControllerA extends AB_Controller
class ControllerB extends AB_Controller
みたいなのってできますっけ?
>>455
多重継承やMix-inは欲しくなりますね。
librariesやhelpersがカオスになるのはよくわかります。
今まさにそんなかんじになりつつあるので、整理しているところです。
- 457 :nobodyさん:2008/09/07(日) 15:37:47 ID:???
- >>456
びっくりするくらい亀レスですがw
> class AB_Controller extends MY_Controller
> class ControllerA extends AB_Controller
> class ControllerB extends AB_Controller
> みたいなのってできますっけ?
できますね。うちでは、MY_Controller にはしていませんが。
(この辺のAutoLoderの仕組みがあんまりよくわかってないw)
- 458 :nobodyさん:2008/09/12(金) 18:31:21 ID:q2obqPa7
- >457
Fatal error: Class 'AB_Controller' not found in 呼び出してるコントローラーを継承しているクラス.php on line XX
ってなるんですが、なぜでしょうか。
以下に配置してます。
/system/application/libraries/AB_Controller.php
--------------------------------------------------------
<?php
class AB_Controller extends MY_Controller {
function AB_Controller()
{
parent::MY_Controller();
}
}
?>
- 459 :nobodyさん:2008/09/13(土) 01:11:52 ID:???
- >>458
「MY_がついてて、MY_の後の最初の1文字だけが大文字」の命名ルールに従ってないと
オートローディングできないですよ〜。
(プレフィクスはconfig.phpでMY_以外に変更可能)
命名規則を揃えるか、自前でコントローラクラスにrequire_onceを書くか、どっちかの手当てが
必要。
- 460 :nobodyさん:2008/09/14(日) 01:01:21 ID:cUARlcyz
- >>459
ありがとうございました。大変助かりました!
- 461 :nobodyさん:2008/09/18(木) 13:09:07 ID:???
- CodeIgniter的には、pluginとhelperの違いって何かありますか。
どっちも関数を提供するだけで、違いが内容に見えます。
- 462 :nobodyさん:2008/09/18(木) 16:11:44 ID:nzPLdxkT
- ログのしきい値おかしいね。普通
0 出力なし
1 ERROR
2 INFOも
3 DEBUGも
じゃない?
- 463 :nobodyさん:2008/09/18(木) 17:07:43 ID:???
- syslogの区分けにして欲しいよな
ciはアメリカ人らしく独自すぎるところが結構ある
- 464 :nobodyさん:2008/09/18(木) 17:47:47 ID:nzPLdxkT
- だよね。
しきい値勝手に変えちゃったもん。
- 465 :nobodyさん:2008/09/22(月) 21:08:37 ID:???
- なんかDB使ってるとFromのテーブルがどんどん増えていくんだけれども。
もしかして静的にテーブル溜め込んでんの?
- 466 :nobodyさん:2008/10/08(水) 18:34:20 ID:???
- CIでunit testやってる人いません?
うちはCIのWikiに出てたSimpletesterをいじりながらなんとかやってますけど、
1フォルダ内のテストクラスを全実行することしか出来なくてちょっとこまってます。
ttp://codeigniter.com/wiki/SimpleTester_-_Unit_testing_library/
109 KB
[ 2ちゃんねる 3億PV/日をささえる レンタルサーバー \877/2TB/100Mbps]
取りに行ったけどなかった。次は一時間後に取りに行くです。新着レスの表示
掲示板に戻る
全部
前100
次100
最新50
read.cgi ver 05.0.7.8 2008/09/25 アクチョン仮面 ★
FOX ★ DSO(Dynamic Shared Object)