移転しました。

symfonyの自分用メモ

最近、symfonyをよく触るようになった。忘れやすい部分や気になる部分をメモ。間違ってたり変なところがあればツッコミ歓迎です。

最初にやること

$ {symfony home}/data/bin/symfony init-project projectname
$ symfony init-app appname

自分のディレクトリにばらまかれるのでmkdirして潜ってからやること。

Subversionのignoreとか

$ chmod 777 ./cache
$ chmod 777 ./log
$ rm -rf ./cache/*
$ rm -rf ./log/*

とかやってコミット。

$ svn propedit svn:ignore cache
$ svn propedit svn:ignore log

二つとも「*」とだけ入力して配下のファイルをignoreにする。できたらコミット。

モジュール作る

$ symfony init-module appname modulename

routingとか

moduleとactionが必要。パラメータはフォーマット指定可能。

routing_name:
  url:   /action/module/:param/*
  param:
    module: hogemodule
    action: hogeaction
  requirements:
    param: ^[a-zA-Z0-9]+$

MySQL関連

「./config/databases.yml」を書く。

all:
  propel:
    class:          sfPropelDatabase
    param:
      phptype:      mysql
      host:         localhost
      database:     hogedb
      username:     hogeuser
      password:     hogepw
      encoding:     utf8

「./config/propel.ini」を書く。

propel.database.createUrl  = mysql://hogeuser:hogepw@localhost/
propel.database.url        = mysql://hogeuser:hogepw@localhost/hogedb

scheme作る。

$ symfony propel-build-schema

詳しくは知らないけれどもdefaultあるとmodel作ろうとして失敗するのでperlを唱える。
参考: http://unicus.jp/wp/archives/19

$ perl -i -pe 's|^.*default.*\n||g' ./config/schema.yml
$ symfony propel-build-model

とかやってmodelを作る。

キャッシュクリア

何かと忘れずにやるように。

$ symfony cc

Actionでよくやること

User取る。

$this->getUser();

認証されてるかどうか。security.ymlと関係あり。

$this->getUser()->isAuthenticated();

Session。namespace使うなら引数増やす。

$this->getUser()->setAttribute($key, $value);
$this->getUser()->getAttribute($key);

リクエストパラメータの受け取り。

$this->getRequestParameter('hoge');

どこかへリダイレクト。routing.ymlにルールがあること。

$this->redirect('hoge/index');

SessionをMySQL

テーブル作る。

CREATE TABLE session (
  sess_id      varchar(32)  NOT NULL,
  sess_data    text         NOT NULL,
  sess_time    datetime     NOT NULL,
  PRIMARY KEY (sess_id)
) ENGINE=MYISAM;

「./apps/appname/config/factories.yml」を書く。

all:
  storage:
    class: myMySQLSessionStorage
    param:
      db_table:     session
      database:     propel
      session_name: sessoinname

Propelでよくやること

プライマリキーで抜く。

TablenamePeer::retrieveByPk($id);

全部抜く。

TablenamePeer:doSelect(new Criteria());

先頭一つ抜く。

TablenamePeer:doSelectOne(new Criteria());

countする。

TablenamePeer:doCount(new Criteria());

WHERE句を作る。

$criteria = new Criteria();
$criteria->add(TablenamePeer::COLUMN_NAME, 'hoge');

ORDER BY句を作る。

$criteria->addAscendingOrderByColumn(TablenamePeer::COLUMN_NAME);
$criteria->addDescendingOrderByColumn(TablenamePeer::COLUMN_NAME);

LIMITを設定する

$criteria->setLimit($number);

OFFSETを設定する。

$criteria->setOffset($number);

JOINで抜く。(上は./config/schema.yml)

foreignTable: 'table'
foreignReference: 'column'
TablenamePeer::doSelectJoinAll($criteria);

特定JOINで抜く。

TablenamePeer::doSelectJoinTablenameRelatedByColumn($criteria);

JOIN後にリレーショナルテーブルを取得。三つ以上でJOINすると上手くいかなかった。

$record->getTablenameRelatedByColumn():

Helperでよく使うのを列挙

<?php

link_to($name = '', $internal_uri = '', $options = array())

button_to($name, $internal_uri, $options = array())

options_for_select($options = array(), $selected = '', $html_options = array())

form_tag($url_for_options = '', $options = array())

select_tag($name, $option_tags = null, $options = array())

input_tag($name, $value = null, $options = array())

input_hidden_tag($name, $value = null, $options = array())

input_file_tag($name, $options = array())

input_password_tag($name = 'password', $value = null, $options = array())

textarea_tag($name, $content = null, $options = array())

checkbox_tag($name, $value = '1', $checked = false, $options = array())

radiobutton_tag($name, $value, $checked = false, $options = array())

submit_tag($value = 'Save changes', $options = array())

reset_tag($value = 'Reset', $options = array())

submit_image_tag($source, $options = array())

label_for($id, $label, $options = array())

scaffold

アプリケーションを作る。

$ symfony init-app <APPLICATION_NAME>

crudを作る。「propel-generate-crud」ではなく「propel-init-crud」を使うとフレームワーク側のコードを継承した形になる。

$ symfony propel-generate-crud <APPLICATION_NAME> <MODULE_NAME> <CLASS_NAME>

ざっくりとこんな感じで。また追記するかも。