【PHP】Yii Framework Part 2
前スレDat落ちでまさかの2スレ目。流行れ!
公式
ttp://www.yiiframework.com/
チュートリアル
ttp://www.yiiframework.com/doc/guide/
公式フォーラム
ttp://www.yiiframework.com/forum/index.php?/forum/21-japanese/ Yiiはモデルにビジネスロジックを書きますが、例えば
$product = new Product();
$product->price = 100;
$product->getTaxPrice();
public function getTaxPrice()
{
return $this->price * 1.05;
}
みたいな書き方はOKなんでしょうか。
それとも、getTaxPrice($price) と書くべきなんでしょうか。
上の書き方がOKの場合→開発者はどのプロパティに値をセットして良いのか分からない
getTaxPrice($price)の方が良い場合→モデルをsave()する際はプロパティに値をセットしてるのにこのときだけ引数で対応?? 両方に対応させたらいいんじゃね?
public function getTaxPrice($price=null)
{
return ($price===null) ? $this->price * 1.05 : $price * 1.05;
} なんかJAVAっぽい
その辺はもう好みの問題じゃないかなあ。
個人的にはgetTaxPriceからpriceは想像できるからそんな不自然でもないと思う。
税込価格で扱っている方が手間がないからプロパティは$this->basePriceにしてpublic function getPrice()にするとか。
ちなみにYiiはget/setを省略してプロパティとして呼べるので
public function getTaxPrice()なら$product->taxPrice;でいい。 なるほどー。
getTaxPrice()はシンプルな構成でしたが、ロジックによっては
複数のプロパティをセットしなければならない場合もありますよね。
そのとき、分かりにくいかなと思った次第です。
かといってメソッド引数に渡すのも微妙な感じです。
例えば user、user_profilesに同時にレコードを登録する場合、Userモデルのクラスに
public function save(User $user, UserProfile $profile)
{
$user->save();
$profile->save();
}
とは多分書きませんよね。普通は
public function save($profile)
{
$this->save();
$profile->save();
}
といった感じでしょうか。
あと両方に対応させるとなると、全てのビジネスロジックメソッドで同様の処理が必要となり、冗長かなぁと思いました。
public function relations(){
return array('profiles'=>array(self::HAS_MANY, 'user_rofiles', 'user_id'));
}
リレーション作って
public function save()
{
$this->save();
$this->profiles->save();
}
じゃないかな。リレーション張れないようなものであれば多分一緒のモデルでSaveするべきじゃない お、それは良さそうですね。
参考になりました。ありがとうございます save()に引数がないと、テーブルのリレーションを知らない開発者は
どのプロパティに値を追加すれば良いか判断がつかない気がする。
例えばUser、UserProfilesが必須で、条件によってUserActivitiesへのインサートが必要な場合とか。 複數のモデル絡んだ入力ならFormModelでまとめたらいいとは思う
引数に入れるのは依存するクラスが増えると無制限に引数増えるから個人的には避けたいかなあ ユーザーIDを元にユーザーテーブルからユーザー情報ひっぱってくるっていう処理が
あらゆる場所にかかれてしまうんだけど、これはしょうがないのかな
まとめるとしたらどのファイルに記述したらいいんだろう $post->attributes=$_POST['Post'];
で、自動的に格納してくれるフィールドって、
DBにフィールドがある場合のみ?
リレーションで、categoriesなんてのがある場合も自動で入れてくれる?
Postモデルに2つのリレーション(どちらもMANY_MANY)を作っていているんだけど、
片方だけ入るのはどうして?? >>40
自己解決した。
http://www.yiiframework.com/doc/guide/1.1/ja/form.model#sec-4
必須項目でもなんでもなかったので、
バリデーションルールに属性が書かれていなかったので「安全」とされずに
一括代入で代入されていなかったようだ。
いや〜理解すればするほど、よくできてるなぁと思う。 コントローラで
class HogeController extends Controller
{
public function actionCreate($name)
{
$account=Account::model()->findByAttributes(array('name'=>$name));
/hoge/create/myname1234
みたいにURLから引数を受け取りたい場合って、
わざわざconfig/main.phpのurlManagerで設定しないとダメなの? 要点を得てないかもしれないが
/hoge/create?name=myname1234&age=17が嫌で
/hoge/create/name/myname/1234/age/17みたいなURLパターンが使いたいなら
'<controller:\w+>/<action:\w+>/*'みたいに末尾を*にするとname/valueのパターンが繰り返される >>43
ありがとうございます。
*を追加する方向でいきます。
あと、もう1つ別の質問があるのですが、
return array(
'condition'=>'t.status=:status',
'params'=>array(
':status'=>1,
),
);
scopes()や、Dbcriteriaなどで使う条件のparamsで、
上記のように数値でstatusを渡すと思い通りに帰ってこなく悩んだのですが、
':status'=>'1'
のようにしなくてはいけないのですね。
これは内部的には数値と文字列を別々にしているということだと思いますが、
MySQLの場合、どれが数値でどれが文字列として解釈されるのかというのを説明したページってありますか?
上記の場合はENUMでstatusを設定していました。 YiiJanとかドキュメントでLinkPagerとかGridViewについての記事を見ても
使おうという気にならない
どこで使えばいいか、どう便利なのか全然わからん 地域別人気度
インドネシア 100
インド 79
ウクライナ 74
ロシア 60
ベトナム 44
ポーランド 14
中国 13
ブラジル 13
イタリア 10
スペイン 9
受託で小さめの案件なら勢いだけで採用してもいいんだけどねえ。
あとは独立しかない…
一応使ってる会社もあるらしいよ
ttps://speakerdeck.com/crifff/yii サーバーにあげると極端にセッションの接続時間が短くなるんだけどどういう理由が考えられる?
・phpinfoのsessionの項目はローカルとサーバで同じ
・configの user['allowAutoLogin'] は true
・もちろんローカル、サーバ全く同じプログラム
LoginForm.phpのlogin()処理は
$duration=3600*24*30; // 30 days
Yii::app()->user->login($this->_identity,$duration);
みたいに30日間続くようにしている
ローカルではこのとおり動いていそうなんだけど、
サーバにあげるとすぐに切れる
ini_set()でsession.gc_maxlifetimeが1440に設定されているけど
変えないといけないのかな?
しかし、ローカルで1440秒以上続く理由がわからない・・・ index.phpでsession.gc_maxlifetimeを設定してもダメだった。。。
なんだ???わけがわからん・・・ まったく知らずに言うけどドメインかhttpsのどっちかじゃないかな >>52
ありがとう!!!!!!!!
,. < ̄ ̄ ̄ ̄ ̄ > 、
/ ヽ _
〈彡 Y彡三ミ;,
{\ \|_ \>ー 、 ト三三ニ:}
人{ >、,___.>、/三 ヾ\ |わ三彡;!
/./ トミ;,_ Y/ \>ノー〜=- "
V / /!  ̄ ̄ ゝ | / _
し/'┴──----─''| ン}\-ヾ彡
ヾ、___ノー'''` >>54
当たりというかドメイン関係の発想で
レンタルサーバだったからセッションの保存先変えたらいけました CakePHPがあまりにもダメダメだったので
純粋なOOPフレームワークであるYiiに乗り換えました。
宜しくお願い致します。 Yiiを一言で表すと、「かゆいところに手が届く」って感じだよな >>56
次にお前はPHPがあまりにもダメダメだったのでrailsにしましたと言う。 PHPは言語でRailsはフレームワーク。
しっかりしろよ。 ・データキャッシュ
・フラグメントキャッシュ
・ページキャッシュ
お前らが一番使ってるキャッシュってどれ?
なんかデータキャッシュやらクエリキャッシュを見ても、
もうページキャッシュでいいじゃんって思ってしまうんだが >>59
RailはDSLなのでRubyの方言と言って差し支えないレベルなのであながち間違ってないんじゃないでしょうか
>>60
俺はむしろページキャッシュ全然つかわないなあ、一部データキャッシュしてる程度
ブログとか投稿系メインならページキャッシュがいいんだろうけどそういうサイトでもないし ページキャッシュは使い所が限られすぎて存在を忘れるレベル
ヘッダにログインしてるかどうかみたいな表示があったらもう使えないからなぁ
フラグメントキャッシュは物珍しさに一回使ってみたけど、なんかお肌に合わなかった。
データ更新したときのためにDependency付けたりするとviewがまたごちゃごちゃしだすんだよな・・。 >>63
普通のデータキャッシュはよく使うよ。
findByPkの結果をキャッシュしたりするし、大したサイズが無いマスターテーブルなんかは期限1日で丸ごとキャッシュしてる。 >>64
都道府県テーブルとかキャッシュしたいんだがどこでどのタイミングでキャッシュ&破棄したらいいのかわからない
Yiiの話か微妙だけど・・・ あらゆる場所で多用するので、
そのたびにDBにアクセスしてひっぱってくるのは負荷が高い気がするので
リレーションで他のテーブルと結合したりもするのですが
とにかく使用度が高い 都道府県なんて10年単位で見ても変化する確率低い物を、
DBから呼び出しでるって時点で設計が間違ってるのでは?
DBで管理するにしても、変更時に静的ファイル生成しちゃったほうが早いだろ。 いや、最初そうしてたんだけど、
都道府県でリレーション組んでるので結局ActiveRecordに変えた
SNSのようなものを作っていて、
都道府県別のユーザー数を統計クエリで集計できるのでARだとすごい便利
class Prefecture extends CActiveRecord
{
public function relations()
{
return array(
'users'=>array(self::HAS_MANY, 'User', 'prefecture_id'),
'userCount' => array(self::STAT, 'User', 'prefecture_id'),
);
}
}
↑こういうのはやっぱりテーブルで持たないと不便(無理?)ですよね? そのprefecture_id
が指し示す都道府県名を利用するのって、県名を表示する時だけでしょ。
それ以外は数字のみで管理・照合してるんだから、都道府県のテーブルなんていらないんじゃね? 県名を参照するだけであれば確かにstatic変数や定数をもったモデルを作るのが良いのだけれど、
>>69のような統計クエリや、MANY_MANYリレーションをつくるときはやっぱりActiveRecordじゃないとダメですよね?
今はHAS_MANYになってるけど、これはもうMANY_MANYに変わります
そうなるとやっぱりAR使うしか無いような気がするんですが、どうでしょう?? DBに入れて外部キー貼ってればツールで見た時に解りやすいし
YiiはARのAttributesに含まれてるほうが何かとチョロいので個人的にはDBにいれるなー
好みじゃないかなー まぁ都道府県の増減はまずないだろうから定数でもいいとは思うけれど
基本変更が殆どないマスタデータって考えれば、テーブル管理でもいいと思うよ
ここは定数、こっちはテーブル、みたいな使い分けするよか全部テーブルってしたほうが
例外パターンとかを決める必要がないので自分はこっちのほうが好きかな
あとは要件次第(ものっそいシビアなパフォーマンス要求されるならDBアクセスも減らすべきじゃね、とかそういう) >>62
ダイナミックコンテンツを使え。超便利。
サイトトップはメインはページキャッシュ使いつつ、ログイン表示とか部分的に動的に出力してる。
ttp://www.yiiframework.com/doc/guide/1.1/ja/caching.dynamic キャッシュに関するノウハウが欲しいな
どこでどういうキャッシュ使えばいいのかまとめて欲しい
ってわけで>>75のサイトで誰か書いて 1.1.13来たね
ttp://www.yiiframework.com/news/65/yii-php-framework-1-1-13-is-released/ 大きな変更といってもjQueryとPHPUにtのバージョンアップくらいかなあ カイブツクロニクルってゲーム、Yiiで作られてるのかな?
ttp://gcwiki.jp/kaibuz/index.php?kako_wiki_zs8
CDbTransactionで検索。
エラーメッセージが同じ。 モデルのデフォルト値で、
空白の場合だけ設定したいんだけどどうしたらいいの? 英語アレルギー+現在のPHPマの大半が新規勉強をやる気持ちが足りてないから、難しいんじゃないかなぁって感じ。 英語ができないやつがどうやってプログラム書けるの?
プログラムって英語じゃん yiiって、他のフレームワークにあるみたいに、DBの日付のカラム名をcreated_atに指定したりすると、
フォーム処理の際に自動的に現在の日付を入れてくれるって機能はないですか? 89です。
×DBの日付のカラム名をcreated_atに指定したりすると、
○DBの日付のカラム名をcreated_atなど決められた名前にすると、 89です。
すいません。自己解決しました。
beforeSaveをオーバーライドすればよかったんですね。 beforeSaveで削って、db側でevent作ってあげれば楽だよね
updated_atも処理出来る http://www.yiiframework.com/wiki/10/how-to-automate-timestamps-in-activerecord-models/
カラム名で判別するわけじゃないけど、自動タイムスタンプの3パターンやり方が書いてある
・rulesのonオプションupdate,insert
・beforeSave()
・CTimestampBehavior protected/runtimeのapplication.logにログが更新されなくなりました。
今日の朝はまでは問題なく仕事から帰ってきたら突然なってました。
特にmain.phpの設定は変えていないのですが・・・・。
何かわかる方いらっしゃいますか?
runtimeのパーミッションは777
application.logのパーミッションも777にしてみましたが、ダメでした。
application.logファイル自体を消してみても、新しいファイルは作成されませんでした。
以下がmain.phpの設定です。
'log'=>array(
'class'=>'CLogRouter',
'routes'=>array(
array(
'class'=>'CFileLogRoute',
'levels'=>'error, warning',
'filter'=>'CLogFilter',
),
array(
'class' => 'CProfileLogRoute'
),
// uncomment the following to show log messages on web pages
/*
array(
'class'=>'CWebLogRoute',
),
*/
),
), levels に trace 加えても作成されない? 公式ガイドとブログチュートリアル一通り読んだんだけど
viewのウィジェットが訳わかめ
CListViewだのCGridViewだのみんな使ってるの? >>95
ありがとうございました。trace加えたら、ログが出てきました。
でも、traceを消したら、またでなくなるって感じです。
今までtrace無い設定でうまくログが出てたんですけどね・・・。 ウィジットもコントローラないとリストの検索とかページネートとかやり難くないんかな? CListView、CGridViewが便利なのはわかった
面倒なことを勝手にやってくれるすごい奴 yii-bootstrapいいじゃん!
これデフォだったらもっと利用者増えそう モジュールの使いどころがよくわからない
ブログのサイドバーによくある最近の投稿とか? と思ったけどそれはウィジェットでよさそうだし
うーん yiic webapp hoge
を簡単にカスタマイズする方法ない?
毎回同じエクステンション入れるのだるい モジュールにするのは他システムでも使い回ししやすくする為でそ それじゃあコンポーネントでもできるじゃん ってなるから理由になってない
モジュールは、モデル、ビュー、コントローラ およびその他の支援的コンポーネントから構成される自己完結したソフトウェアユニット
これがポイント yiiのコーディング規約ってどこかにある?
ググっても見つからなかった。
スペースの有無が気になってるんだけど
なくてもいいところは削ればいいのかな? yiiはちょっと古臭くなっちゃったからlaravelを使おう
fuelphpは日本でしかはやってないオワコンだから注意ね >>113 にほぼ同意
でも次回はPhalcon使う FWが出たり消えたりするのは普通だよ
過渡期って使わなければ何も覚えないしね
特別に敷居が高くなければ、
使って評価のサイクルをした方が良いと思う yiiのどの辺が古く感じるのか知りたい
乗り換えの参考にさせてほしい 俺から言わせると古臭いより立消えに近い。流行る前に盛り上がらなかったし、これから盛り返す要素も特に見当たらない。
それなりに使われるかもしれないが。 laravelさわってみたけどnodeっぽいと思った Yiiは利用者が少ないから需要落ちる
日本ならLaravelかFuelPHPかCakePHPを使ったほうが将来性がある
Symfonyは仕事でやるなら使えばいいけど個人で使うのは無駄 Yiiの自慢(よりどころ?)であった、他のPHP/FWと比較した処理の速さが
CodeIgniterやFuelPHPの出現により無残に砕け散った。。
もう取り返せない状況に来ている
実際の案件で使われていれば、その後の改修案件で需要出てくるけど、そこまでも到達できなかった感がある まぁどんなframeworkでも移行に対したコスト掛からない昨今
色々試したほうがいいね laravelよりfuelphp のほうが取っ付きやすいね yii使い続けるよ
趣味で小さいwebサービス作ってるだけだし fuelは日本のUGがキモいから使わない
麻酔ドライバとか よかった、ここで質問してもまともに回答もらえなかったから別のフレームワークを使って正解だった
こんなYiiとかいうクソマイナーで将来性がないフレームワークを覚えても時間の無駄だという事が分かった 2ちゃんのスレで回答もらえなかったという事実から飛躍した結論に草 英語で情報を探せない人だろうから
日本で普及しているフレームワークしか選択肢がないんじゃね