MR.NiNi About Log Tech Graph Memo Books Twitter

About
Log
Tech
Graph
Memo
Books
Twitter

symfonyの小ネタ集

symfony 1.4の小ネタです。
将来的に内容を取りまとめて技術情報の方に持っていく予定です。

アクセス元の記録

意外と便利なアクセス元の記録。
例えばログインが必要なページにアクセスする際、settings.ymlでログイン用モジュール・アクションに自動的に飛びますが、認証後に該当ページに飛ばしたい場合にはログイン用モジュール・アクション側で以下の構文を用いてアクセス元と引数を記録する事が出来ます。

$request->getParameterHolder()->getAll()

上記の構文で拾ったデータをsetAttribute()でattribute_holderに配列変数として保持しておき、ログイン後、redirect()に配列変数をそのまま代入すれば該当ページに引数付きで飛ばす事が出来ます。

$request_value = $this->getUser()->getAttribute('XXXXXX');
$this->getUser()->removeAttribute('XXXXXX');
$this->redirect($request_value);


XXXXXXには任意の変数名(attribute_holder名)を入れます。
ちなみに、「removeAttribute()」では使用済みの変数を削除しております。
なお、boolean modeで検索する場合にはデータベース(テーブル)側で然るべき構成を行なっておく必要がありますので注意して下さい。

別テーブルのデータを取得

Doctrineの機能と関連しますが、参照したテーブルの情報を元に、関連する別テーブルのデータを拾ってくる事が出来ます。
具体的な例としては「コンテンツのテーブルにあるユーザIDから、ユーザテーブルにあるユーザ名を拾ってくる」方法です。

$result->getAccount()->getName()

「getAccount()」はアカウントテーブル「account」を、「getName()」はアカウントテーブルの「name」カラムをそれぞれ参照します。
$resultはDoctrineで拾ってきたデータを格納している変数です。
なお、schema.ymlでテーブル同士(カラム同士)のrelationを正しく記述してモデルファイル等を生成しないと正しく動作しませんのでご注意下さい。

ちなみに、普通に上記の形式でデータを取得すると、都度別テーブルの情報を参照しに行きます。
foreach()を使用して100のエントリを表示する場合、SQLクエリが100回発行される形になりますので、多用する場合はキャッシュを使用するか、参照先を連想配列で一気に取得して添え字を使用してデータを取得した方が効率的です。

boolean modeでの検索

全文検索用です。

$query = Doctrine_Query::create()->from('table t');
$query->where('match (column1) against (? IN BOOLEAN MODE) or match (column2) against (? IN BOOLEAN MODE) ', array($column1 $column2)) ;


「?」には後の配列で指定している変数の内容が順番に入ります。

CentOS 6.3標準Apache使用時のインストール先

これはPEARの挙動に負うところが大きいですが、表題の場合、/usr/share/pear配下に置かれます。このため、プロジェクト構築時にwebディレクトリにコピーするsfディレクトリ等は/usr/share/pear/data/symfony/web配下になります。

symfony上のdoctrineでドライバが足りないと怒られた場合

CentOS 6.3環境の場合、symfony doctrine:build --all等を実行して「Couldn't locate driver named mysql」と言われた際には、(MySQL使用時は)php-mysqlを導入する。
root権限で下記コマンドを実行すれば良い。

yum install php-mysql

PostgreSQLを使用している場合はphp-pgsqlを同様に導入する。
なお、解説サイトによってはphp-pdoの導入を指示されているが、CentOS 6.3の場合は(インストール状況次第ではあるが)最初から入っている。

symfonyからMySQLにアクセス出来ない場合

CentOS 6.3環境の場合、以下のコマンドをroot権限で実行する。

setsebool -P httpd_can_network_connect=1

SELinuxは止めてしまった方が楽ですが、セキュリティ的には動かしておいた方が良かったりします。

symfonyの認証タイムアウトを変更する

symfonyの認証タイムアウトは、php側のセッションタイムアウト設定にも関係しますので、php.iniまたは.htaccessの設定と併せて変更する必要があります。
php.iniにおける「session.gc_maxlifetime」の設定はデフォルトで1440秒(24分)に設定されていますので、まずはこれを変更します。以下の例では7200秒(2時間)となります。

session.gc_maxlifetime = 7200

変更後はhttpdを再起動して下さい。
次に、symfony側の設定を変更する事になりますが、これはapps/APPNAME/config/factories.ymlにて定義します。
user:
  class: myUser
  param:
    timeout:         7200
上記の構文はデフォルトでは存在しないので、適宜追加します。
追加後はsymfony ccを実行して反映させて下さい。



メモ書きトップに戻る / トップページに戻る