Currently viewing the category: "symfony"

久しぶりにブログ書きます!
昨日今日とiOSのハッカソンに行ってきたので、その時に得た知識をこれから少しずつアウトプットしていく予定です

まず今日はphpのフレームワークであるcodeIgniterについて、
前に使ったことのあるsymfonyと比べてどうだったか書いていきます!

symfonyとcodeIgniterを両方使うような人はいないのか、すごい大雑把な比較しか周りになかったので、
ちょっと細かめに、具体的にどういう部分がどうなのかという点で比較したいと思います。

プロジェクトの規模について


codeIgniterは小規模用とよく言われるようです。使ってみた感じも小規模用だと思いました。

なぜかというと、symfonyと比べて圧倒的にファイル数が少ないからです。
ファイル数が少ないというのは、機能ごとに細かくファイルを分割していないということで、
多人数が同時にファイルを変更したりするときにコンフリクトになりやすいです。

しかしのその一方、一人二人で作る場合にはファイルを開くという手間がかなりヘリ、だいぶ楽になります。

また、symfonyでよくあるプロジェクト全体の設定があって、その中にフロントエンドとしての設定があって・・・といった設定の上書きがなく、設定を場所によって変更したりしない(できない?)というのも小規模向けだと思います。

小回りについて


symfonyに比べ、すごい小回りが効きました。具体的にはデータベース周りが非常に差を実感しました。

symfonyの場合、データを挿入するまでには、schemaをyamlでかいて、それをmigrateして、formValidatorを設定して、それぞれのform用にvalidatorをカスタマイズして・・・とかなり段階を踏まなければいけませんでした。
codeIgniterでは巣のphpじゃないかと思うほど簡単に、撮ってきた値に対してvalodatorを書いて、そのあとは自分でSQLを書くという形でデータを入れます。
formの形が何であろうと、keyとvalueしか見ないので幅が広がり、手間暇も少なかったと思います。

速度が早い


これは実測したわけではないのですが、symfonyよりも体感がはやくかんじました。
ベンチマークで検索してみるいろいろな人が計測してくれたデータがありますが、やはり速いようです。
待ち時間でストレスがたまる、といったことは全くありませんでした。
(作ったプロジェクトが小さすぎたという可能性もあり)

不便なところ


小回りが効く、の裏面なのかもしれませんが、何をやるにしても自分でやらなければいけないというのがあります。
データベースのデータをオブジェクトで扱いたければそれ用のライブラリを自分で探さなければいけません。
フレームワークとしてはおそらく最小限のことしかしてくれないので、それ以上は自分で自由にやる形でしょうか。

あと、特にautoloadをしてくれないおかげでモデルやらライブラリやらを使うときは明示的にロードをしないといけないというのも不便でした。




会場ではfuelPhpを使って開発した人もいて、その人はすごい使いやすいと言っていたので次はfuelも試してみたいな〜とおもってます!

 

データを削除しないで削除フラグだけたてておきたいときがよくあります。
webアプリを作る場合はコメントなどはこの機能が必須になります。つけとかないとあとでユーザー間のもめごとが起きたときに困ってしまいます。

Symfony&Doctrineならばこの論理削除が簡単にできます。

■準備

  1. Schema.ymlでactAsにSoftDeleteを追加する
    [plain]Comment:
    actAs: { SoftDelete: ~ }
    columns:
    comment_id: { type: integer, primary: true, autoincrement: true}
    user_id: { type: integer, notnull: true}
    comment: { type: string, notnull: false}
    [/plain]
  2. migrateとかbuild:modelとかをして、DBに変更を適用させる
  3. ProjectConfigration.class.phpでconfigureDoctrine関数を追加し、起動時にDoctrineのSoftDeleteの機能が有効になるように設定する
    [php] public function configureDoctrine(Doctrine_Manager $manager)
    {
    $manager->setAttribute(Doctrine_Core::ATTR_USE_DQL_CALLBACKS, true);
    }[/php]


■つかいかた
この機能を追加する前と何も変わらずに使えます
例)削除済みでないコメントで、特定のユーザーのものを取得する
[php] $data = CommentTable::getInstance()
->createQuery(‘c’)
->where(‘c.user_id = ‘. $userId)
->execute();
[/php]



■削除済みのデータもとりたいとき
削除済みのデータを取りたいときはwhereでdeleted_atのところに条件を追加するようにしてあげます。
例)削除済みのコメントで、特定のユーザーのものを取得する
[php] $data = CommentTable::getInstance()
->createQuery(‘c’)
->where(‘c.user_id = ‘. $userId)
->addWhere(‘c.deleted_at is not null’)
->execute();
[/php]

削除済みのも削除してないのもとりたいときは、ちょっとスマートじゃないですがwhereで両方指定してあげます
例)削除済みのも含め、すべてのコメントで特定のユーザーのものを取得する
[php] $data = CommentTable::getInstance()
->createQuery(‘c’)
->where(‘c.user_id = ‘. $userId)
->addWhere(‘c.deleted_at is null or c.deleted_at is not null’)
->execute();
[/php]

 

この前までmigrationするときは必ずと言っていいほど参考にしていたブログが見れなくなってしまったのでこちらに書いておきます。

■下準備(最初の一度だけやればいいこと)

  1. スキーマを書く(schema.yml)
    例)
    [plain]Tag:
    options:
    collate: utf8_general_ci
    charset: utf8
    columns:
    tagId: { type: integer(5), primary: true, autoincrement: true}
    keyword: { type: string }[/plain]
  2. モデル作成[plain] symfony doctrine:build –all[/plain]
  3. migration用のモデル作成[plain]symfony doctrine:generate-migrations-models[/plain]
  4. DBのつくりなおし
    [plain]symfony doctrine:drop-db
    symfony doctrine:build-db[/plain]
  5. 最初のmigrate[plain]symfony doctrine:migrate[/plain]

■DBを変更時毎回やること

  1. スキーマ変更(schema.yml)
    例)
    [plain]Tag:
    options:
    collate: utf8_general_ci
    charset: utf8
    columns:
    tagId: { type: integer(5), primary: true, autoincrement: true}
    keyword: { type: string }
    count: { type: integer }[/plain]
  2. migration用の差分クラスを作成[plain]symfony doctrine:generate-migrations-diff[/plain]
  3. migrateする[plain]symfony doctrine:migrate[/plain]
  4. モデル、フォーム、フィルターの変更[plain]symfony doctrine:build –model –forms –filters[/plain]

これでmigrate完了

ちなみに、project:deployで適用他のサーバーにデータを持っていったときはDBだけ変更すればいいので
[plain]symfony doctrine:migrate[/plain]
だけでOK。
もちろん[plain]symfony cc[/plain]は忘れないように。

ちなみに見れなくなってしまったブログはこちら
Symfonyのmigrate機能|IからOへ
いつか見れるようになおってるといいな