Category: ‘symfony’

Symfony2 とeclipse plugin事始め

2011年10月22日 Posted by PURGE

以前、Symfony1.4 でアプリを作成していたが、どうも開発ツールの選定と使い方を間違ったらしく、デバッグできないことで挫折。

久しぶりに Symfony を再勉強してみようと思い、Symfony2 に挑戦しようと思った。でも、開発の深い部分に入ると、やはり開発環境ツールは必須なので、調べてみるとありました。

Symfony2 Eclipse Plugin

私の最高のお気に入り開発ツールは、eclipse。既存の eclipse3.6 にインストールしようとしたが、PDTのバージョン違いで怒られる。そもそも、Symfony2 Eclipse Plugin もPDT3.0 からサポートしているらしいので、eclipse3.7の最新にしてみた。

ちなみに、eclipse PDTのAll in Oneパッケージを探していたが、それらは、eclipse3.6 & PDT2.2 までしか対応していないようなので(※執筆時点)、eclipse3.7 for Java Developer をダウンロードし、Symfony2 Eclipse Plugin のサイトに指定されたアップデートサイトから、すんなりPDT3.0 を含めて、Symfony2 Eclipse Pluginがインストールできた。

そして次は、そもそものSymfony Standard Editionをダウンロードしてみる。ダウロードしたzipファイルを展開してみる。展開したファイルをeclispeに読み込ませてみた。

symfony バリデーションエラー csrf token: Required.

2011年7月24日 Posted by PURGE

下記エラー発生。3日程ハマった。

csrf token: Required.

基本的には、バインド (sfForm::bind) の使用の仕方を理解していなかった。
formクラスに下記の要素名定義を行っていなかった為にバインドがうまく行かずに、バリデーションエラーとなっていた。

アクションクラス

class HogeAction extends sfActions
{
  public function executeIndex(sfWebRequest $request)
  {
    //フォーム生成
    $this->form = new HogeForm();
    if($request->isMethod(sfRequest::POST))
    {
      $this->form->bind($request->getParameter('hoge'));
      if($this->form->isValid())
      {
        $hoges = $this->form->getValues();
        $hoge = $hoges['hoge'];
        //
        $this->getUser()->setFlash('hoge', $hoge);
        $this->redirect('next/foo');
    }
  }
}

フォームクラス

class HogeForm extends BaseForm
{
  public function configure()
  {
    //フォーム設定
    $this->setWidgets(array('hoge'=> new sfWidgetFormInput()));
    //バリデーション設定
    $this->setValidators(array('hoge'=> new sfValidatorString()));
    //要素名定義
    $this->widgetSchema->setNameFormat('hoge[%s]');
  }
}

symfony action.class.phpでの初期化処理

2011年7月20日 Posted by PURGE

アクションクラス内で、各アクション共通の変数を持たせたかったのだが、普通は下記のメソッドを使用するらしい。

public function preExecute()
{
    //共通処理
    $this->common = "共通変数";
}
public function executeIndex1()
{
    //ログ出力
    $this->getLogger()->info($this->common);
}
public function executeIndex2()
{
    //ログ出力
    $this->getLogger()->info($this->common);
}

sfMelodyPluginを試す その3

2011年7月14日 Posted by PURGE

sfMelodyPluginについては、正直言って、使用をほとんど諦めているのだが、続けられるところまでと思って、前回の続き。下記認証画面が表示されるところまで辿り着いた。

アプリを認証ボタンを押してみる。

するとエラー。

500 | Internal Server Error | Doctrine_Record_UnknownPropertyException
Unknown record property / related component "field1" on "sfGuardUser"

だけど見事にコールバックされているようだ。うれしい。それでコールバックされてURL欄を見てみると、確かに oauth_token と oauth_verifier が発行されている事に気付く。

http://local.whoocus.com/frontend_dev.php/access/twitter?oauth_token=Zl9fNdYadhdbuc&oauth_verifier=5R65EtJ66NtAlDu5F4k

結局のところ、sfDoctrineGuardPlugin の使用方法に問題がありそうだ。今回はまた出直そうと思う。

ちなみに、この oauth_token とは、twitter がアプリ認証の際に、ユーザに対して発行されるリクエストトークンと呼ばれる文字列である。つまり、sfDoctrineGuardPlugin の仕組みの中で、ユーザ登録と同時に、このリクエストトークンを自サイトのユーザ情報として保持しなければならないのだろうと推測する。

とりあえず、Doctrine_Record_UnknownPropertyException を調べる事とする。

sfMelodyPluginを試す その2

2011年7月6日 Posted by PURGE

その後、symfony や OAuth認証それ自体の理解不足という事で勉強していた。sfMelodyPlugin の使用をあきらめかけ symfony と関係なくtwitteroauthという有名らしい phpライブラリを試してみた。

認証の仕組みを何となく理解し、早々と sfMelodyPlugin の使用に戻ってみると、どうやら自分のrouting.yml の設定が悪いらしい。もう一度 symfony の routing をおさらいして設定。

すると、以前は、twitterのエラー画面に飛んでいた画面が、下記のお馴染みの画面と連携できた。

原因不明だが、以前エラー画面に飛んでいた時は、下記パラメータのoauth_token=xxxxxxxxxxxxxxxx が送信できていなかったようだ。

https://api.twitter.com/oauth/authorize?param1=value&oauth_token=xxxxxxxxxxxxxxxx

今回はうまくリクエストを送信できたようだ。詳細は、また調査後に記述しようと思う。一歩一歩進んでいる。
続きはまた後日・・・。

※その後の調査の結果、筆者はWindows と Mac それぞれで開発しているのだが、Mac だとうまく上記 oauth_token=xxxxxxxxxxx パラメータ付きでリクエストされる。Windows で開発した場合はどうしてもパラメータが付加されずに下記画面になってしまう。

尚も原因不明である。

symfony Plugin の登録

2011年7月5日 Posted by PURGE

symfony へのプラグイン登録は、対象プラグインを、pluginディレクトリに配置し、 config/ProjectConfiguration.class.php に登録する。

class ProjectConfiguration extends sfProjectConfiguration
{
  public function setup()
  {
    $this->enablePlugins(array(
    						'sfDoctrinePlugin',
    						'sfDoctrineGuardPlugin',
    						'sfDoctrineOAuthPlugin',
    						'sfMelodyPlugin'));
  }
}

sfDoctrineGuardPlugin と sfDoctrineOAuthPlugin と sfMelodyPlugin の継承関係

2011年7月4日 Posted by PURGE

※注意 この記事は現在調査を進めながら記述していますので、完全な情報ではありません。

sfMelodyPlugin のReadmeも理解できないし、情報サイトもほとんどないし、使用方法が全く分からないので、ソースコードを追ってみることにした。

とりあえず、わかったことは、下記の継承関係が存在する。ライブラリ的には依存関係。

■OAuth関係

  • sfDoctrineOAuthPlugin/lib/base/vendor/oauth/OAuth.php
  • sfDoctrineOAuthPlugin/lib/base/sfOAuth.class.php
  • sfDoctrineOAuthPlugin/lib/base/sfOAuth1.class.php
  • sfMelodyPlugin/lib/melody/base/sfMelody1.class.php
  • sfMelodyPlugin/lib/melody/sfTwitterMelody.class.php
class sfOAuth1 extends sfOAuth
{
}
class sfMelody1 extends sfOAuth1
{
}
class sfTwitterMelody extends sfMelody1
{
}

■ユーザ関係

  • symfony/lib/user/sfUser.class.php
  • symfony/lib/user/sfSecurityUser.class.php
  • symfony/lib/user/sfBasicSecurityUser.class.php
  • sfDoctrineGuardPlugin/lib/user/sfGuardSecurityUser.class.php
  • lib/model/doctrine/sfDoctrineGuardPlugin/sfGuardUser.class.php
  • sfMelodyPlugin/lib/user/sfMelodyUser.class.php
  • apps/frontend/lib/myUser.class.php
interface sfSecurityUser
{
}
class sfUser implements ArrayAccess
{
}

class sfBasicSecurityUser extends sfUser implements sfSecurityUser
{
}
class sfGuardSecurityUser extends sfBasicSecurityUser
{
}
class sfMelodyUser extends sfGuardSecurityUser
{
}
class myUser extends sfMelodyUser
//class myUser extends sfBasicSecurityUser
{
}

つまり、親クラスのメソッドや変数(属性)を利用可能ということ。

で、README にある下記のコードは、ユーザを通してメソッドを使用するということのようだ。

public function executeIndex(sfWebRequest $request)
{
  //ユーザを取得しサービスに接続する
  $this->getUser()->connect('twitter'); //app.yml に登録したサービス名
}

ということは、下記コードはインスタンスを得られるという事なのか?

  $melody = $this->getUser()->getMelody('twitter');

どうしても、Alias と Namespaces の使用方法が理解できない。
また行き詰った・・・。

sfMelodyPluginを試す その1

2011年7月2日 Posted by PURGE

※注意 この記事は現在調査を進めながら記述していますので、完全な情報ではありません。

Symfony1.4 で連携しようと思ってたどり着いた sfMelodyPlugin
Symfony1.4 の使用方法も間々ならないままにplugins/sfMelodyPlugin ディレクトリにインストール。中にある英語のREADME.txt を読んでみる。
一般的には下記のコマンドでインストールできるようだが、PEARが効かない環境なので一式配置。

$ php symfony plugin:install sfMelodyPlugin

キャッシュをクリアして、

$ php symfony cc

sfMelody を settings.yml に設定する。
ちなみに、Doctrine使用の場合、sfDoctrineOAuthPlugin sfDoctrineGuardPlugin が必要らしい。
sfMelody と同様に pluginsディレクトリに配置した。

all:
  .settings:
    enabled_modules: [default, sfGuardAuth, sfMelody]

適用するアプリケーションにあるmyUser.class.php の継承元を変更する。
apps/my-app/lib/myUser.class.php:

  class myUser extends sfMelodyUser
  //class myUser extends sfBasicSecurityUser
  {
  }

app.yml を設定する。

all:
  melody:
    create_user: false            # 対象サービス(twitter等)に接続した時にログオンできない場合新規作成するかどうか
    redirect_register: false      # 登録画面にリダイレクトするかどうか
    twitter:                      #name
      key:  my_service_key        # twitter で発行されたコンシューマー・キー(API key)を記述
      secret: my_secret_key       # twitter で発行されたコンシューマー・シークレットを記述
      callback: @mymodule_index   # コールバックURLを記述

      #オプション (↓↓↓↓↓調査中↓↓↓↓↓↓)
      user:                       # to create an user
        field_1:
          call: xx
          call_parameters: [x, x, x]
          path: xx.xy.zz
          prefix: xx_
          suffix: _xx
          key: false
        ...

      provider: twitter          #対象サービス名 (他google / facebook等)
      request_token_url: https://api.twitter.com/oauth/request_token  # リクエスト・トークンURL
      request_auth_url: https://api.twitter.com/oauth/authorize #URLを許可する
      access_token_url: https://api.twitter.com/oauth/access_token  #アクセス・トークンURL

      # (↓↓↓↓↓調査中↓↓↓↓↓↓)
      namespaces:                 # namespaces are used to make some api calls - see namespace Section
        ns1: http://my.name.space
        ...
      aliases:                    # Alias is an easy way to simplify api calls
        me: my/alias
        ...
      auth_parameters:
        param1: value
      call_parameters:
        param1: value
      access_parameters:
        param1: value
      output_format: json
      create_user: true
      redirect_register: false

      #optional only for OAuth 1
      request_parameters:
        param1: value
      request_token_url: https://api.twitter.com/oauth/request_token  # リクエスト・トークンURL

まだ何もわからないまま、アプリケーションを実行してみる。呼び出すべき actions.class に接続のアクションメソッド(executeIndex)とCallbackを受けるアクションメソッド(executeShow)を記述。

  public function executeIndex(sfWebRequest $request)
  {
  	$this->getUser()->connect('twitter');  //nameで指定した名前
  }
  public function executeShow(sfWebRequest $request)
  {
  	$this->me = $this->getUser()->getMelody('twitter')->getMe();
  }

それに伴いrouting.yml も設定する。

twitter_callback:
  url:   /:module
  param: { action: show }

すると、何やら sfOAuth1 が見つからないとのエラー。実際のファイルが sfDoctrineOAuthPlugin に無いのかなと予測したらやはり無い。どうやら OAuthBase のモジュールが別途必要なようだ。急いでダウンロードしたらこのエラーは無くなった。

しかし次のエラー

Fatal error: Call to undefined function curl_init()

どうやらphpにて、cURLが有効になっていない模様。
php.ini で同モジュールを有効にしてApacheの再起動したらtwitterページにリダイレクトできました。

エラー画面なので連携とまではいけませんでした。
まだまだ、完全な連携には程遠いのですがちょっと感動です。

続きは後日・・・。

■参考サイト
Symfohub

symfonyコマンド

2011年6月22日 Posted by PURGE

■schema.yml からのデータベース生成

$ php symfony doctrine:build-db 

■schema.yml からのモデルクラス生成

$ php symfony doctrine:build-model 

■schema.yml からのオブジェクト生成

$ php symfony doctrine:build --all 

■フィクスチャファイルのデータロード

$ php symfony doctrine:data-load 

/var/mysql/mysql.sock 見つからないエラー

2011年6月16日 Posted by PURGE

phpでPDOを使用するときに出たエラー。

Warning: PDO::__construct(): [2002] No such file or directory 
(trying to connect via unix:///var/mysql/mysql.sock) 
in /Users/xxxx/・・・/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection.php on line 470

読んでの如く、パスに mysql.sock が無いというエラー。

php.ini の設定だろうという事で下記のように変更。
MySQLのインストールは自分で行った為、下記のパスに存在していた。
わからない場合は、my.cnf にmysql.sockのロケーションが設定されているようだ。

;pdo_mysql.default_socket=/var/mysql/mysql.sock
    ↓
pdo_mysql.default_socket=/tmp/mysql.sock

php.ini を変更したので、Webサーバを再起動して解決。