[PHP][フレームワーク]CodeIgniterスレat PHP
[PHP][フレームワーク]CodeIgniterスレ - 暇つぶし2ch413:nobodyさん
08/07/03 17:40:04
>>412
ぶっちゃけ、どんなURLにしたいかで変わる様な気がする
別ドメインがよければ、Apacheの設定も絡むし。
一般的なのはどんな感じなんだろうねえ

414:412
08/07/03 17:54:55
>>413

ありがとう そだね

とりあえずは controller/admin/ にディレクトリ掘って
そこに置くことにした


あと 管理者関連のコントローラだけ 共通の認証チェック処理いれたいんだけど
その辺のやり方がわからない


前にCakePHPさわったときは beforeFilter なんかで
コントローラ共通の処理入れられたんだけど
CIは 自分でControllerクラス継承して 作らないとだめなのかな?

管理ページ周りの処理で 参考になるとこあったら教えてください…

415:412
08/07/03 18:02:00
Controllerクラス継承して作る場合は
>>411 の言ってることと同じだね


一応 コアクラスの継承は

system/application/library/ に Controllerクラスを継承したMY_Controller.php
とか作ればいいみたいだよ


ログイン認証の共通処理も そうやってAppController 作ればいいんかな…
その辺りの情報がないから どうやるのがいいのか
いまいちわからん

416:nobodyさん
08/07/03 18:06:26
>>414
CIさわらずにKohana触ってる邪道な俺だけど、俺も知りたい
便乗w

俺は、libraries の中にBaseController, UserController, AdminController って作っちゃったな・・・

誰か、筋の良いやり方を教えて

417:412
08/07/03 18:12:02
>>415

ちょいウソあったw

AppControllerじゃなくて MY_Controller だね

/system/application/library/MY_Controller.php

class MY_Controller extends Controller {
function MY_Controller() {
parent::Controller();
}
}

こんな感じ。

ログインの共通処理も ここでやろうかと思ったんだけど
それでいいのかがわからん…

>>416 みたいに 種類ごとにクラス作ったほうがいい気もするし…

418:412
08/07/03 18:52:48
>>417 の方法でやってるんだが
/system/application/libraries/MY_Controller.php

のようなの作れば コアクラスは自動で置き換わるらしいんだが
置き換わらないな

コントローラ側で

class bbs extends MY_Controller {
}

みたいに MY_ つけてやらないとダメ
CIのルールだとデフォでMY_付けることになってるけど
これじゃ意味ないじゃん

バグ?

419:nobodyさん
08/07/03 18:57:59
[/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
08/07/03 19:38:23
ぼけてた 釣ってくる…


でも「コアクラスを拡張する場合のクラス名には MY_ を付ける」
っていう ルールは意味がないね


URLリンク(codeigniter.jp)


ファイルは MY_ 付けないと読み込んでくれないみたいだけど、
クラス名は別に MY_ 付ける必要ないよね?

なんでこんなこと書いてるんだろう

421:nobodyさん
08/07/03 20:15:07
英語版にはちゃんとした事書いてたりするけ?

422:411
08/07/03 20:23:33 XZ5SMLTk
事故解決してたんだけどありがとう。

ただAppModelは相変わらずわかりません。
どのタイミングでロードすればええんですか?
Hook系もだめぽでした。

423:412
08/07/03 22:43:11
>>422

>>419-420 の方法じゃだめなの?

クラス名 MY_ つけなくてもいけるっぽいから
AppControllerにしとけばいいんじゃ

よくわからん ルールだなあ


おれはてっきり Controller そのものを置き換えてくれるとおもったんだが
ライブラリとかヘルパはそうだよね

424:nobodyさん
08/07/04 15:09:16
>>422
コントローラはMY_Controllerをextendsして書いてるが、
モデルは仕方ないので各モデルの冒頭で
<?php
require_once(APPPATH."libraries/MY_Model.php");

class Hoge_model extends MY_Model


425:nobodyさん
08/07/14 11:55:08
$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さん
08/07/14 12:05:24
>>425
Database に、escapeしないでsetする方法ってあったっけ?
それがsetメソッドなら、
$db->エスケープしないset('create_at', '式');
$db->insert('テーブル名') でいけるような気がする。

以上想像。なければ、Databaseを拡張する必要があるかも?
俺もこの辺知りたい。ソース嫁って感じだけど

427:nobodyさん
08/07/14 12:12:17
NOW()とかも文字列として扱っちゃうから
date('Y-m-d H:i:s') にするしかないと思う

オレは
function now()
{
return date('Y-m-d H:i:s');
}
っていう関数を作ってある

428:nobodyさん
08/07/14 19:00:27
>>426-427
さんくすです。
できないみたいなので、
fuction current_timestamp() {
return date('Y-m-d H:i:s');
}
を使うことにしました。
でもこれだと、application server と database server が別だと
時刻を必ず揃えておく必要がありますね。

429:nobodyさん
08/07/14 19:12:37
>>428
サーバの管理がきっちり出来ていれば、どんなサーバも1秒と違わないはずなので、時刻で
よっぽどシビアなソートやチェックをしていない限り、それは大丈夫かと。
また、原則からいうなら元々どちらかに合わせるべきなので、DBの関数が使えない時点で
application側の時刻のみを使うのが必然となるかな。

サーバ間の時刻あわせとは、微妙に話が違うような。

430:nobodyさん
08/07/14 19:47:05
>>426-428
date_helperのunix_to_human じゃダメなのか?

unix_to_human(time(),TRUE,'eu');


431:nobodyさん
08/07/15 06:26:58
うちでは、まず 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さん
08/07/15 07:42:14
>>431
なんちゅうか、バッドノウハウの香りがw
> gettype で 'string' でも 'boolean' でもNULL でもない値はスルーしてくれる
っていう実装自体も、それに依存してるっていうのも、なんだかなあw

オブジェクトを渡されて、上記みたいにすることも前提にしてるのかな?>CI
(それなら、素直にescapeを回避するset系メソッドをつければいいのではと)

433:431
08/07/15 12:59:01
>>432
どうみてもBKです。本当に(ry
CI内部の実装依存だからCIをバージョンアップすると動かなくなるかも。

個人的には、gettypeを見て判定、の部分はとりたてておかしなコードでは
ないので、マイナーバージョンアップであれば大丈夫だろうという甘い期待w
最悪、mark_as_safe で grep して置き換えれば、なんとかなるだろうとかw
素人にも玄人にもオヌヌメできない。\(^o^)/

434:431
08/07/15 13:07:49
ってよくみたら set($key, $value = '', $escape = TRUE) って
第三引数があるじゃねーかw

$this->db->set('created_at', 'NOW()', FALSE);

で多分いけるね・・・ orz

435:nobodyさん
08/07/15 13:10:36
>>434
でもそれだと
$this->db->insert('tablename', array('created_at'=>'NOW()'));
とかができないよね。
431の方法のほうが個人的に好み。

436:nobodyさん
08/07/15 13:15:25
そういうの考えるのが面倒くさかったので、デフォで$this->db->insert($tablename, $valuearray);時は
created_atに作成日時をつっこみ、$this->db->update($tablename, $valuearray);時はupdated_atに
更新日時を突っ込むようにCI_DBを変更して使ってる。
バッドノウハウなのは百も承知だが、symfonyから流れてきた人にはこれが手放せないのよorz

437:nobodyさん
08/07/15 17:00:08
>>436
それはDBのNOW()やCURRENT_TIMESTAMP()を使うの?
それともPHPのdate()を使うの?
前者ならまねしたいなあ

438:nobodyさん
08/08/02 09:47:59
いつの間にか1.5から1.6になってる。
なんかかわったの?


439:nobodyさん
08/08/03 18:45:02 znW3bDml
あれ、$this->dbがなくなってね?

440:nobodyさん
08/08/03 19:04:30
kantigaidatta

441:nobodyさん
08/08/20 20:18:05
CI使ってる人間ってどれぐらいいるんだろうか

442:nobodyさん
08/08/20 20:44:32
17人

443:nobodyさん
08/08/22 13:30:33
CIってforward とか redirect とかはどうやるの?

444:nobodyさん
08/08/23 00:51:34
headerで自分で

445:nobodyさん
08/08/23 01:26:31
helperとか無かったっけ
まあぶっちゃけ自分でheader(ほげほげ)書くのと変わらないけど

446:nobodyさん
08/08/25 13:31:03 Ziu2Tqsv
CodeIgniterでは、URLは「コントローラ名/メソッド名」というのが基本ですが、
このパターンを変更することはできますか。

やりたいのは、
- /blog/index
- /blog/show
- /blog/create
- /blog/edit
というのではなく、
- /blog/maka
- /blog/blackstar
- /blog/deaththekid
のように「コントローラ名/ユーザ名」のようにしたいということです。
つまり /blog 以下のアクセスをある特定のメソッドに縛りたいということです。


447:nobodyさん
08/08/25 15:36:16
>>446
ヒント
config/routes.php
URLリンク(codeigniter.com)
URLリンク(userguide.cilab.info)

448:nobodyさん
08/08/26 15:08:09
>>447
ありがとうございます!

449:nobodyさん
08/08/26 15:24:29
Routingについて質問です。
ユーザーズガイドの例にあったのですが、
$route['product/:num'] = "catalog/product_lookup";
という設定をした場合、「:num」の値は Catalog->product_lookup() の中で
どうやって取得すればいいのでしょうか。
通常だと Catalog->product_lookup() の引数にこの値が渡されますが、
試したところ、$route[] を設定した場合は渡されないようです。


450:nobodyさん
08/08/26 15:37:11
>>449
英語のドキュメントに書いてありました。
$route['product/(:num)'] = "catalog/product_lookup_by_id/$1";
でいいみたいですね。
お騒がせしました。

451:nobodyさん
08/08/28 12:20:46 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さん
08/08/28 22:52:42
>>451
ソレは自分で試してみたほうが早いんじゃない?

453:nobodyさん
08/08/29 08:50:09
複数のコントローラ間でメソッドを共有したいとき、どうするのがいいでしょうか。
できれば、あるコントローラのメソッド内で、別のコントローラをnewしてメソッドを実行できるのがいちばん理想的なんですが、そんなことできますか。

454:nobodyさん
08/08/29 11:22:01
>>453
application/libraryにMY_Controllerを置き、共通メソッドはそこに置く。
そのメソッドを使うコントローラはextends MY_Controllerで作る。


455:nobodyさん
08/08/29 11:44:55
>>454
しかしそれをしていると、だんだん多重継承っぽい事がしたくなってくるという罠

シンプルな処理、Controllerのプロパティ、機能等が必要ない様なものは、
ユーティリティクラスに切り出すとかもありかと思う

そして、libraries がカオスになるというセンスのない俺

456:nobodyさん
08/08/29 14:42:55
>>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さん
08/09/07 15:37:47
>>456
びっくりするくらい亀レスですがw

> class AB_Controller extends MY_Controller
> class ControllerA extends AB_Controller
> class ControllerB extends AB_Controller
> みたいなのってできますっけ?

できますね。うちでは、MY_Controller にはしていませんが。
(この辺のAutoLoderの仕組みがあんまりよくわかってないw)

458:nobodyさん
08/09/12 18:31:21 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さん
08/09/13 01:11:52
>>458
「MY_がついてて、MY_の後の最初の1文字だけが大文字」の命名ルールに従ってないと
オートローディングできないですよ~。
(プレフィクスはconfig.phpでMY_以外に変更可能)

命名規則を揃えるか、自前でコントローラクラスにrequire_onceを書くか、どっちかの手当てが
必要。

460:nobodyさん
08/09/14 01:01:21 cUARlcyz
>>459
ありがとうございました。大変助かりました!

461:nobodyさん
08/09/18 13:09:07
CodeIgniter的には、pluginとhelperの違いって何かありますか。
どっちも関数を提供するだけで、違いが内容に見えます。

462:nobodyさん
08/09/18 16:11:44 nzPLdxkT
ログのしきい値おかしいね。普通
0 出力なし
1 ERROR
2 INFOも
3 DEBUGも
じゃない?

463:nobodyさん
08/09/18 17:07:43
syslogの区分けにして欲しいよな
ciはアメリカ人らしく独自すぎるところが結構ある

464:nobodyさん
08/09/18 17:47:47 nzPLdxkT
だよね。
しきい値勝手に変えちゃったもん。

465:nobodyさん
08/09/22 21:08:37
なんかDB使ってるとFromのテーブルがどんどん増えていくんだけれども。
もしかして静的にテーブル溜め込んでんの?

466:nobodyさん
08/10/08 18:34:20
CIでunit testやってる人いません?

うちはCIのWikiに出てたSimpletesterをいじりながらなんとかやってますけど、
1フォルダ内のテストクラスを全実行することしか出来なくてちょっとこまってます。
URLリンク(codeigniter.com)


467:nobodyさん
08/10/20 05:19:44
base_urlにIndex.phpが引っ付くのはでふぉ?

468:nobodyさん
08/10/20 05:21:12
ちがったform_openだ

469:nobodyさん
08/10/24 20:58:58
1.7.0

470:nobodyさん
08/10/28 10:49:17
1.7でなにか変わった?

471:nobodyさん
08/10/28 14:21:52
validationクラスがform_validationクラスに名前変更&若干の仕様変更
→configに定義したものから読み込み可能になった

sessionデータをDBに保存するように変更とソレに伴ってテーブル定義変更

この二つ位かな?個人的には

詳しくは
URLリンク(codeigniter.com)

472:470
08/10/28 20:20:01
なるほど、どもです。

473:nobodyさん
08/11/12 18:05:07
ciってcgi版phpでrewriteを使って
URLリンク(www.example.com)

URLリンク(www.example.com)
でアクセスできるようにすると、動かないのですかね・・・



最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch