EC Cube4で、管理画面とユーザ画面ともに、表題のエラーが発生した。キャッシュをクリアしようと思ったが、管理画面がこのような状態なので、にっちもさっちも行かなくなった。そこで、コマンドラインからキャッシュをクリアする。
>php bin/console cache:clear
EC Cube4で、管理画面とユーザ画面ともに、表題のエラーが発生した。キャッシュをクリアしようと思ったが、管理画面がこのような状態なので、にっちもさっちも行かなくなった。そこで、コマンドラインからキャッシュをクリアする。
>php bin/console cache:clear
PHPコマンドとして、php から実行すること。
>php bin/console c:c
zabbixをインストール中に、下記のエラーに出くわした。
php53-common-5.3.3-7.el5_8.x86_64 from installed has depsolving problems --> php53-common conflicts with php-common Error: php53-common conflicts with php-common You could try using --skip-broken to work around the problem You could try running: package-cleanup --problems package-cleanup --dupes rpm -Va --nofiles --nodigest
この場合、下記等 を試したが、どうしてもダメ。
yum clean all
アンインストールしようとしたが、そんなもの無いと叱られる。
yum erase php-common Package(s) php-common available, but not installed.
どうやら、昔、手動でphpがインストールされていたので、競合していたようだ。
仕方ないので、古いphpを手動でアンインストールした。
その後、再度 yum にて php をインストールしなおした。
何とかなった。
以前、Symfony1.4 でアプリを作成していたが、どうも開発ツールの選定と使い方を間違ったらしく、デバッグできないことで挫折。
久しぶりに Symfony を再勉強してみようと思い、Symfony2 に挑戦しようと思った。でも、開発の深い部分に入ると、やはり開発環境ツールは必須なので、調べてみるとありました。
私の最高のお気に入り開発ツールは、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に読み込ませてみた。
下記エラー発生。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]'); } }
アクションクラス内で、各アクション共通の変数を持たせたかったのだが、普通は下記のメソッドを使用するらしい。
public function preExecute() { //共通処理 $this->common = "共通変数"; } public function executeIndex1() { //ログ出力 $this->getLogger()->info($this->common); } public function executeIndex2() { //ログ出力 $this->getLogger()->info($this->common); }
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 を調べる事とする。
その後、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ディレクトリに配置し、 config/ProjectConfiguration.class.php に登録する。
class ProjectConfiguration extends sfProjectConfiguration { public function setup() { $this->enablePlugins(array( 'sfDoctrinePlugin', 'sfDoctrineGuardPlugin', 'sfDoctrineOAuthPlugin', 'sfMelodyPlugin')); } }
※注意 この記事は現在調査を進めながら記述していますので、完全な情報ではありません。
sfMelodyPlugin のReadmeも理解できないし、情報サイトもほとんどないし、使用方法が全く分からないので、ソースコードを追ってみることにした。
とりあえず、わかったことは、下記の継承関係が存在する。ライブラリ的には依存関係。
■OAuth関係
class sfOAuth1 extends sfOAuth { }
class sfMelody1 extends sfOAuth1 { }
class sfTwitterMelody extends sfMelody1 { }
■ユーザ関係
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 の使用方法が理解できない。
また行き詰った・・・。