<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>digital matter &#187; symfony</title>
	<atom:link href="http://blog.loadlimits.info/tag/symfony/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.loadlimits.info</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Mon, 06 Feb 2012 13:27:58 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>DoctrineMongoDBBundleでAbstractDoctrineExtensionのエラー</title>
		<link>http://blog.loadlimits.info/2012/01/doctrinemongodbbundle%e3%81%a7abstractdoctrineextension%e3%81%ae%e3%82%a8%e3%83%a9%e3%83%bc/</link>
		<comments>http://blog.loadlimits.info/2012/01/doctrinemongodbbundle%e3%81%a7abstractdoctrineextension%e3%81%ae%e3%82%a8%e3%83%a9%e3%83%bc/#comments</comments>
		<pubDate>Sun, 29 Jan 2012 07:43:32 +0000</pubDate>
		<dc:creator>hotpi</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[解決]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://blog.loadlimits.info/2012/01/doctrinemongodbbundle%e3%81%a7abstractdoctrineextension%e3%81%ae%e3%82%a8%e3%83%a9%e3%83%bc/</guid>
		<description><![CDATA[PHP Fatal error:&#160; Class &#8216;Symfony\\Bridge\\Doctrine\\DependencyInjection\\AbstractDoctrineExtension&#8217; not found in /home/path/to/Symfony/vendor/bundles/Symfony/Bundle/DoctrineMongoDBBundle/DependencyInjection/DoctrineMongoDBExtension.php on line 31 php &#8211; DoctrineMongoDBBundle getting a fatal error in Symfony2 &#8211; Stack Overflow masterリポジトリが書き換えられていて、最新バージョンでは動かないのでdepsファイルにDoctrineMongoDBBundleのレポジトリを指定するときに、バージョン番号を指定する必要があるということでした。 DoctrineMongoDBBundleセクションにversion=v2.0.0を追加すればOKです。 [doctrine-mongodb] git=http://github.com/doctrine/mongodb.git [doctrine-mongodb-odm] git=http://github.com/doctrine/mongodb-odm.git [DoctrineMongoDBBundle] git=http://github.com/symfony/DoctrineMongoDBBundle.git target=/bundles/Symfony/Bundle/DoctrineMongoDBBundle version=v2.0.0]]></description>
			<content:encoded><![CDATA[<p>PHP Fatal error:&#160; Class &#8216;Symfony\\Bridge\\Doctrine\\DependencyInjection\\AbstractDoctrineExtension&#8217; not found in /home/path/to/Symfony/vendor/bundles/Symfony/Bundle/DoctrineMongoDBBundle/DependencyInjection/DoctrineMongoDBExtension.php on line 31</p>
<p><a href="http://stackoverflow.com/questions/7985248/doctrinemongodbbundle-getting-a-fatal-error-in-symfony2" target="_blank">php &#8211; DoctrineMongoDBBundle getting a fatal error in Symfony2 &#8211; Stack Overflow</a></p>
<p>masterリポジトリが書き換えられていて、最新バージョンでは動かないのでdepsファイルにDoctrineMongoDBBundleのレポジトリを指定するときに、バージョン番号を指定する必要があるということでした。   <br />DoctrineMongoDBBundleセクションにversion=v2.0.0を追加すればOKです。</p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>[doctrine-mongodb]
    git=http://github.com/doctrine/mongodb.git

[doctrine-mongodb-odm]
    git=http://github.com/doctrine/mongodb-odm.git

[DoctrineMongoDBBundle]
    git=http://github.com/symfony/DoctrineMongoDBBundle.git
    target=/bundles/Symfony/Bundle/DoctrineMongoDBBundle
    version=v2.0.0
</pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.loadlimits.info/2012/01/doctrinemongodbbundle%e3%81%a7abstractdoctrineextension%e3%81%ae%e3%82%a8%e3%83%a9%e3%83%bc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windows版のPHP5.3がc0000005で強制終了する</title>
		<link>http://blog.loadlimits.info/2012/01/windows%e7%89%88%e3%81%aephp5-3%e3%81%8cc0000005%e3%81%a7%e5%bc%b7%e5%88%b6%e7%b5%82%e4%ba%86%e3%81%99%e3%82%8b/</link>
		<comments>http://blog.loadlimits.info/2012/01/windows%e7%89%88%e3%81%aephp5-3%e3%81%8cc0000005%e3%81%a7%e5%bc%b7%e5%88%b6%e7%b5%82%e4%ba%86%e3%81%99%e3%82%8b/#comments</comments>
		<pubDate>Mon, 23 Jan 2012 05:44:13 +0000</pubDate>
		<dc:creator>hotpi</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[解決]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.loadlimits.info/2012/01/windows%e7%89%88%e3%81%aephp5-3%e3%81%8cc0000005%e3%81%a7%e5%bc%b7%e5%88%b6%e7%b5%82%e4%ba%86%e3%81%99%e3%82%8b/</guid>
		<description><![CDATA[Symfony 1.4.16をWindowsのPHP 5.3.9で実行したときに、特定の条件で強制終了する現象に悩まされていました。 主にSymfonyタスクでdoctrine:data-dumpなどを実行するときに落ちていました。 色々調べた結果、Symfonyに問題があるわけではなく、/lib/vendor/symfony/lib/config/sfDefineEnvironmentConfigHandler.class.phpがきっちり4096バイトだったということが原因でした。 つまり、PHP5.3.9では、4096バイトのファイルをrequireもしくはincludeするとc0000005(Access Violation)で強制終了します。CLIに限らず、Apache経由でも同じです。 試しに4096バイトの一切コードが書かれていないテキストファイルを作ってrequireしてみると、再現しました。 強制終了時のウィンドウと、内容は以下のとおり。 ちなみにモジュール名はnts(Non Thread Safe)版ならphp5.dll、ts(Thread Safe)版ならphp5ts.dllです。 どちらも確認しましたが、どちらも同じ現象です。モジュールは入っていても入っていなくても同じです。 問題の署名: &#160; 問題イベント名:&#160;&#160;&#160; APPCRASH &#160; アプリケーション名:&#160;&#160;&#160; php.exe &#160; アプリケーションのバージョン:&#160;&#160;&#160; 5.3.9.0 &#160; アプリケーションのタイムスタンプ:&#160;&#160;&#160; 4f0c5cd0 &#160; 障害モジュールの名前:&#160;&#160;&#160; php5.dll &#160; 障害モジュールのバージョン:&#160;&#160;&#160; 5.3.9.0 &#160; 障害モジュールのタイムスタンプ:&#160;&#160;&#160; 4f0c5dfb &#160; 例外コード:&#160;&#160;&#160; c0000005 &#160; 例外オフセット:&#160;&#160;&#160; 00090f5b &#160; OS バージョン:&#160;&#160;&#160; 6.1.7601.2.1.0.256.48 &#160; ロケール ID:&#160;&#160;&#160; 1041 &#160; 追加情報 1:&#160;&#160;&#160; 0a9e &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>Symfony 1.4.16をWindowsのPHP 5.3.9で実行したときに、特定の条件で強制終了する現象に悩まされていました。   <br />主にSymfonyタスクでdoctrine:data-dumpなどを実行するときに落ちていました。</p>
<p>色々調べた結果、Symfonyに問題があるわけではなく、/lib/vendor/symfony/lib/config/sfDefineEnvironmentConfigHandler.class.phpがきっちり4096バイトだったということが原因でした。</p>
<p>つまり、PHP5.3.9では、4096バイトのファイルをrequireもしくはincludeするとc0000005(Access Violation)で強制終了します。CLIに限らず、Apache経由でも同じです。</p>
<p>試しに4096バイトの一切コードが書かれていないテキストファイルを作ってrequireしてみると、再現しました。</p>
<p>強制終了時のウィンドウと、内容は以下のとおり。   </p>
<p><a href="http://blog.loadlimits.info/wp-content/uploads/2012/01/image.png"><img style="border-bottom: 0px;border-left: 0px;padding-left: 0px;padding-right: 0px;border-top: 0px;border-right: 0px;padding-top: 0px" border="0" alt="image" src="http://blog.loadlimits.info/wp-content/uploads/2012/01/image_thumb.png" width="500" height="252" /></a></p>
<p>ちなみにモジュール名はnts(Non Thread Safe)版ならphp5.dll、ts(Thread Safe)版ならphp5ts.dllです。   <br />どちらも確認しましたが、どちらも同じ現象です。モジュールは入っていても入っていなくても同じです。</p>
<p>問題の署名:   <br />&#160; 問題イベント名:&#160;&#160;&#160; APPCRASH    <br />&#160; アプリケーション名:&#160;&#160;&#160; php.exe    <br />&#160; アプリケーションのバージョン:&#160;&#160;&#160; 5.3.9.0    <br />&#160; アプリケーションのタイムスタンプ:&#160;&#160;&#160; 4f0c5cd0    <br />&#160; 障害モジュールの名前:&#160;&#160;&#160; php5.dll    <br />&#160; 障害モジュールのバージョン:&#160;&#160;&#160; 5.3.9.0    <br />&#160; 障害モジュールのタイムスタンプ:&#160;&#160;&#160; 4f0c5dfb    <br />&#160; 例外コード:&#160;&#160;&#160; c0000005    <br />&#160; 例外オフセット:&#160;&#160;&#160; 00090f5b    <br />&#160; OS バージョン:&#160;&#160;&#160; 6.1.7601.2.1.0.256.48    <br />&#160; ロケール ID:&#160;&#160;&#160; 1041    <br />&#160; 追加情報 1:&#160;&#160;&#160; 0a9e    <br />&#160; 追加情報 2:&#160;&#160;&#160; 0a9e372d3b4ad19135b953a78882e789    <br />&#160; 追加情報 3:&#160;&#160;&#160; 0a9e    <br />&#160; 追加情報 4:&#160;&#160;&#160; 0a9e372d3b4ad19135b953a78882e789</p>
<p>多分現象はこのバグ報告と同じだと思います。   <br /><a href="https://bugs.php.net/bug.php?id=60758" target="_blank">PHP :: Bug #60758 :: require() crashes Apache</a></p>
<p>5.4.0RC5でも解決してないみたいですね。報告とほぼ同じですが、これで再現できます。</p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>&lt;?php
file_put_contents('test.txt', str_pad('', 4096));
include('./test.txt');
</pre>
</div>
<p>とりあえず対処法としては改行１文字でも増やしておけばいいってことですか…
  </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.loadlimits.info/2012/01/windows%e7%89%88%e3%81%aephp5-3%e3%81%8cc0000005%e3%81%a7%e5%bc%b7%e5%88%b6%e7%b5%82%e4%ba%86%e3%81%99%e3%82%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Symfonyの機能テストでclickを使わずにmultipartのファイルPOSTをする方法</title>
		<link>http://blog.loadlimits.info/2011/08/symfony%e3%81%ae%e6%a9%9f%e8%83%bd%e3%83%86%e3%82%b9%e3%83%88%e3%81%a7click%e3%82%92%e4%bd%bf%e3%82%8f%e3%81%9a%e3%81%abmultipart%e3%81%ae%e3%83%95%e3%82%a1%e3%82%a4%e3%83%abpost%e3%82%92%e3%81%99/</link>
		<comments>http://blog.loadlimits.info/2011/08/symfony%e3%81%ae%e6%a9%9f%e8%83%bd%e3%83%86%e3%82%b9%e3%83%88%e3%81%a7click%e3%82%92%e4%bd%bf%e3%82%8f%e3%81%9a%e3%81%abmultipart%e3%81%ae%e3%83%95%e3%82%a1%e3%82%a4%e3%83%abpost%e3%82%92%e3%81%99/#comments</comments>
		<pubDate>Tue, 23 Aug 2011 00:49:43 +0000</pubDate>
		<dc:creator>hotpi</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[解決]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://blog.loadlimits.info/2011/08/symfony%e3%81%ae%e6%a9%9f%e8%83%bd%e3%83%86%e3%82%b9%e3%83%88%e3%81%a7click%e3%82%92%e4%bd%bf%e3%82%8f%e3%81%9a%e3%81%abmultipart%e3%81%ae%e3%83%95%e3%82%a1%e3%82%a4%e3%83%abpost%e3%82%92%e3%81%99/</guid>
		<description><![CDATA[Symfony 1.4で実装したAPIのFunctionalテストをする際に、ファイルをPOSTする方法に迷ったので調べました。 ファイルのアップロードテストは、通常のWebサイトであれば、 $browser-&#62; get('/upload')-&#62; click('Upload', array('form' =&#62; array( 'file1' =&#62; sfConfig::get('sf_test_dir').'/datas/test01.jpg', ))) ; みたいに書くのですが、テストしたいアプリケーションはAPIなので、GETするページはありません。 sfBrowserBase::clickを参考にして、こんな感じで実装しました。 まずはテスト本体。test/functional/api/hogeActionsTest.php &#60;?php include(dirname(__FILE__).'/../../bootstrap/functional.php'); $browser = new MyTestFunctional(new myBrowser()); $browser-&#62;loadData(); $browser-&#62; info('JPEGファイルをアップロードできる')-&#62; setUploadFile('file1', sfConfig::get('sf_test_dir').'/datas/test01.jpg')-&#62; post('/upload', array('title' =&#62; 'hoge'))-&#62; with('response')-&#62;begin()-&#62; isStatusCode(200)-&#62; end()-&#62; ; 次にmyBrowserを定義します。lib/test/myBrowser.class.php &#60;?php class myBrowser extends sfBrowser { public function setUploadFile($key, $filename) { if (is_readable($filename)) { $fileError = UPLOAD_ERR_OK; [...]]]></description>
			<content:encoded><![CDATA[<p>Symfony 1.4で実装したAPIのFunctionalテストをする際に、ファイルをPOSTする方法に迷ったので調べました。</p>
<p>ファイルのアップロードテストは、通常のWebサイトであれば、</p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>$browser-&gt;
    get('/upload')-&gt;
    click('Upload', array('form' =&gt; array(
        'file1' =&gt; sfConfig::get('sf_test_dir').'/datas/test01.jpg',
    )))
;
</pre>
</div>
<p>みたいに書くのですが、テストしたいアプリケーションはAPIなので、GETするページはありません。</p>
<p>sfBrowserBase::clickを参考にして、こんな感じで実装しました。</p>
<p>まずはテスト本体。test/functional/api/hogeActionsTest.php</p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>&lt;?php

include(dirname(__FILE__).'/../../bootstrap/functional.php');

$browser = new MyTestFunctional(new myBrowser());
$browser-&gt;loadData();

$browser-&gt;
    info('JPEGファイルをアップロードできる')-&gt;
    setUploadFile('file1', sfConfig::get('sf_test_dir').'/datas/test01.jpg')-&gt;
    post('/upload', array('title' =&gt; 'hoge'))-&gt;

    with('response')-&gt;begin()-&gt;
        isStatusCode(200)-&gt;
    end()-&gt;
;
</pre>
</div>
<p>次にmyBrowserを定義します。lib/test/myBrowser.class.php</p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>&lt;?php

class myBrowser extends sfBrowser
{

    public function setUploadFile($key, $filename)
    {
        if (is_readable($filename))
        {
          $fileError = UPLOAD_ERR_OK;
          $fileSize = filesize($filename);
        }
        else
        {
          $fileError = UPLOAD_ERR_NO_FILE;
          $fileSize = 0;
        }

        $this-&gt;parseArgumentAsArray($key, array(
            'name' =&gt; basename($filename),
            'type' =&gt; '',
            'tmp_name' =&gt; $filename,
            'error' =&gt; $fileError,
            'size' =&gt; $fileSize,
        ),
        $this-&gt;files);
    }

}
</pre>
</div>
<p>sfBrowserBaseクラスのfilesに対して配列でファイルの情報を書き込むと、POST直前に$_FILESに書きこんでくれます。</p>
<p>で、あとはMyでmyBrowser::setUploadFileを呼び出すだけです。lib/test/MyTestFunctional.class.php</p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>&lt;?php

class MyTestFunctional extends sfTestFunctional
{
    public function loadData()
    {
        $doctrine = Doctrine_Manager::getInstance()-&gt;getCurrentConnection()-&gt;getDbh();
        $doctrine-&gt;query('SET FOREIGN_KEY_CHECKS = 0');
        $doctrine-&gt;query('TRUNCATE TABLE uploads');
        $doctrine-&gt;query('SET FOREIGN_KEY_CHECKS = 1');
        unset($doctrine);

        Doctrine::loadData(sfConfig::get('sf_test_dir').'/fixtures/');
        return $this;
    }

    public function setUploadFile($key, $filename)
    {
        $this-&gt;browser-&gt;setUploadFile($key, $filename);

        return $this;
    }
}
</pre>
</div>
<p>こうやってsetUploadFile(&#8230;)-&gt;post(&#8230;)と呼び出せばOKです。</p>
<p>sfBrowserBase::callされるたびにfilesの中身はクリアされます。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.loadlimits.info/2011/08/symfony%e3%81%ae%e6%a9%9f%e8%83%bd%e3%83%86%e3%82%b9%e3%83%88%e3%81%a7click%e3%82%92%e4%bd%bf%e3%82%8f%e3%81%9a%e3%81%abmultipart%e3%81%ae%e3%83%95%e3%82%a1%e3%82%a4%e3%83%abpost%e3%82%92%e3%81%99/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>sfFlickrPluginのRequest failed.に対処する</title>
		<link>http://blog.loadlimits.info/2011/06/sfflickrplugin%e3%81%aerequest-failed-%e3%81%ab%e5%af%be%e5%87%a6%e3%81%99%e3%82%8b/</link>
		<comments>http://blog.loadlimits.info/2011/06/sfflickrplugin%e3%81%aerequest-failed-%e3%81%ab%e5%af%be%e5%87%a6%e3%81%99%e3%82%8b/#comments</comments>
		<pubDate>Thu, 23 Jun 2011 10:53:29 +0000</pubDate>
		<dc:creator>hotpi</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[解決]]></category>
		<category><![CDATA[flickr]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://blog.loadlimits.info/2011/06/sfflickrplugin%e3%81%aerequest-failed-%e3%81%ab%e5%af%be%e5%87%a6%e3%81%99%e3%82%8b/</guid>
		<description><![CDATA[symfony 1.4にて、Flickrから画像を取得して使いたかったので、sfFlickrPluginを使ってみました。 sfFlickrPluginのインストール方法はこちらのサイトを参考にチェックアウトできます。 symfonyでFlickrを使用するためのPluginまとめ &#8211; Layer8 Reference 基本的には手動によるセットアップです。 plugins/に展開します。 自分はエクスポートしました。 $ cd plugins/ $ svn export http://svn.symfony-project.com/plugins/sfFlickrPlugin キーに関してはさきほどのサイトを参考に。 あとは config/ProjectConfiguration.class.php に、enablePluginsを追加すればOKです。 public function setup() { $this-&#62;enablePlugins('sfDoctrinePlugin'); $this-&#62;enablePlugins('sfFlickrPlugin'); } で、セットアップ完了。 ここから表題の話。 グループから写真を取得したい場合はgetGroupPhotoListを使います。 が、getGroupPhotoListを実行すると、 Request failed. The requested URL returned error: 413 というエラーで停止。 plugins/sfFlickrPlugin/lib/vendor/Phlickrを最新に差し替えることで解決します。 Phlickrはこちらにあります。 Phlickr &#124; Download Phlickr software for free at SourceForge.net Phlickrの最新版は0.2.8だったので、丸ごと上書きします。 ファイル一式とFramework、TextUiディレクトリも上書き それ以外のディレクトリは調べてないのでわからないですが、まぁ、置いておけば良いのでは。 [...]]]></description>
			<content:encoded><![CDATA[<p>symfony 1.4にて、Flickrから画像を取得して使いたかったので、sfFlickrPluginを使ってみました。</p>
<p>sfFlickrPluginのインストール方法はこちらのサイトを参考にチェックアウトできます。</p>
<p><a href="http://jp.layer8.sh/reference/entry/show/id/606" target="_blank">symfonyでFlickrを使用するためのPluginまとめ &#8211; Layer8 Reference</a></p>
<p>基本的には手動によるセットアップです。   <br />plugins/に展開します。    <br />自分はエクスポートしました。</p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>$ cd plugins/
$ svn export http://svn.symfony-project.com/plugins/sfFlickrPlugin</pre>
</div>
<p>キーに関してはさきほどのサイトを参考に。</p>
<p>あとは<br />
  <br />config/ProjectConfiguration.class.php</p>
<p>に、enablePluginsを追加すればOKです。</p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>  public function setup()
  {
    $this-&gt;enablePlugins('sfDoctrinePlugin');
    $this-&gt;enablePlugins('sfFlickrPlugin');
  }</pre>
</div>
<p>で、セットアップ完了。</p>
<p>ここから表題の話。</p>
<p>グループから写真を取得したい場合はgetGroupPhotoListを使います。<br />
  <br />が、getGroupPhotoListを実行すると、</p>
<p>Request failed. The requested URL returned error: 413</p>
<p>というエラーで停止。</p>
<p>plugins/sfFlickrPlugin/lib/vendor/Phlickrを最新に差し替えることで解決します。<br />
  <br />Phlickrはこちらにあります。</p>
<p><a href="http://sourceforge.net/projects/phlickr/" target="_blank">Phlickr | Download Phlickr software for free at SourceForge.net</a></p>
<p>Phlickrの最新版は0.2.8だったので、丸ごと上書きします。<br />
  <br />ファイル一式とFramework、TextUiディレクトリも上書き</p>
<p>それ以外のディレクトリは調べてないのでわからないですが、まぁ、置いておけば良いのでは。</p>
<p>Testsは、いらない雰囲気。</p>
<p>これで正常に動くようになりました。<br />
  <br />あと、桁あふれの問題があるので、</p>
<p><a href="http://blog.loadlimits.info/2011/05/phlickr%E3%81%AEbuildimgurl%E3%81%A7photo-id%E3%81%8C%E6%A1%81%E3%81%82%E3%81%B5%E3%82%8C/" target="_blank">PhlickrのbuildImgUrlでPhoto IDが桁あふれ : blog.loadlimit &#8211; digital matter -</a></p>
<p>を参考にして修正してください。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.loadlimits.info/2011/06/sfflickrplugin%e3%81%aerequest-failed-%e3%81%ab%e5%af%be%e5%87%a6%e3%81%99%e3%82%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Symfony 1.4からZendFrameworkでPicasaWebAlbumsにアクセスする</title>
		<link>http://blog.loadlimits.info/2011/06/symfony-1-4%e3%81%8b%e3%82%89zendframework%e3%81%a7picasawebalbums%e3%81%ab%e3%82%a2%e3%82%af%e3%82%bb%e3%82%b9%e3%81%99%e3%82%8b/</link>
		<comments>http://blog.loadlimits.info/2011/06/symfony-1-4%e3%81%8b%e3%82%89zendframework%e3%81%a7picasawebalbums%e3%81%ab%e3%82%a2%e3%82%af%e3%82%bb%e3%82%b9%e3%81%99%e3%82%8b/#comments</comments>
		<pubDate>Sun, 05 Jun 2011 12:58:37 +0000</pubDate>
		<dc:creator>hotpi</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Picasa]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[ZendFramework]]></category>

		<guid isPermaLink="false">http://blog.loadlimits.info/2011/06/symfony-1-4%e3%81%8b%e3%82%89zendframework%e3%81%a7picasawebalbums%e3%81%ab%e3%82%a2%e3%82%af%e3%82%bb%e3%82%b9%e3%81%99%e3%82%8b/</guid>
		<description><![CDATA[symfony-projectのページがGoogle検索に引っかかりにくい（引っかかってもバージョン違ったりする）ので色々キーワード入れてメモ。 ZendFrameworkをSymfonyに導入する方法は以下のJobeetの17日目に書いてありました。 Practical symfony &#124; 17日目: 検索 &#124; symfony &#124; Web PHP Framework cd lib/vendor/ wget http://framework.zend.com/releases/ZendFramework-1.11.7/ZendFramework-1.11.7.zip unzip ZendFramework-1.11.7.zip mv ZendFramework-1.11.7/library/Zend/ . とりあえずlib/vendorに入れておきました。 あとはconfig/ProjectConfiguration.class.phpに上記ページのコードを貼りつけて、使う直前にProjectConfiguration::registerZend();してやればOK。 Picasaの方は Zend Framework: Documentation: Picasa Web Albums の使用法 &#8211; Zend Framework Manual このページを参考にしてできます。 丸投げだけど日本語だしわかりやすいので特に解説も不要かな、と…]]></description>
			<content:encoded><![CDATA[<p>symfony-projectのページがGoogle検索に引っかかりにくい（引っかかってもバージョン違ったりする）ので色々キーワード入れてメモ。</p>
<p>ZendFrameworkをSymfonyに導入する方法は以下のJobeetの17日目に書いてありました。</p>
<p><a href="http://www.symfony-project.org/jobeet/1_4/Doctrine/ja/17" target="_blank">Practical symfony | 17日目: 検索 | symfony | Web PHP Framework</a></p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>cd lib/vendor/
wget http://framework.zend.com/releases/ZendFramework-1.11.7/ZendFramework-1.11.7.zip
unzip ZendFramework-1.11.7.zip
mv ZendFramework-1.11.7/library/Zend/ .
</pre>
</div>
<p>とりあえずlib/vendorに入れておきました。</p>
<p>あとはconfig/ProjectConfiguration.class.phpに上記ページのコードを貼りつけて、使う直前にProjectConfiguration::registerZend();してやればOK。</p>
<p>Picasaの方は</p>
<p><a href="http://zendframework.com/manual/ja/zend.gdata.photos.html" target="_blank">Zend Framework: Documentation: Picasa Web Albums の使用法 &#8211; Zend Framework Manual</a></p>
<p>このページを参考にしてできます。</p>
<p>丸投げだけど日本語だしわかりやすいので特に解説も不要かな、と…</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.loadlimits.info/2011/06/symfony-1-4%e3%81%8b%e3%82%89zendframework%e3%81%a7picasawebalbums%e3%81%ab%e3%82%a2%e3%82%af%e3%82%bb%e3%82%b9%e3%81%99%e3%82%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Symfonyでembed18nを使う</title>
		<link>http://blog.loadlimits.info/2011/04/symfony%e3%81%a7embed18n%e3%82%92%e4%bd%bf%e3%81%86/</link>
		<comments>http://blog.loadlimits.info/2011/04/symfony%e3%81%a7embed18n%e3%82%92%e4%bd%bf%e3%81%86/#comments</comments>
		<pubDate>Sun, 10 Apr 2011 15:30:09 +0000</pubDate>
		<dc:creator>hotpi</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[解決]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://blog.loadlimits.info/2011/04/symfony%e3%81%a7embed18n%e3%82%92%e4%bd%bf%e3%81%86/</guid>
		<description><![CDATA[Symfonyで多言語対応する予定があるけど、とりあえず日本語だけ使いたかったときのメモです。embedI18nを自在に使う参考に。例によってSymfony 1.4+Doctrine。 // HogeForm.class.php public HogeForm extends BaseHogeForm { public function configure() { parent::configure(); $this-&#62;embedI18n(array('ja')); // 二次元配列でembedしたフォームにアクセスできる $this-&#62;validatorSchema['ja']['name']-&#62;setOption('required', true); $this-&#62;useFields(array('ja', 'foo', 'bar')); } } このままテンプレートで$form-&#62;render()とかしてしまうと、入れ子表示になってしまうのでrenderRowでそれぞれ表示するようにしてやれば、useFieldsでembedされたフォームの順番がいじれないという問題も解決。 // hogeCreateSuccess.php $form['ja']['name']-&#62;renderRow(); $form['foo']-&#62;renderRow(); $form['bar']-&#62;renderRow(); ちなみにsfFormDoctrine::getI18nFormClass()とかあるのですが、クラス名が取れるだけです。 追記 SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry &#8217;19-ja&#8217; for key &#8216;PRIMARY&#8217; フォームをsaveしたら上記のエラーが出ました。 updateObject後にobject-&#62;toArray()をすると見覚えのない、「ja_JP」というキーが。 Array ( [id] =&#62; [foo] =&#62; hoge [bar] =&#62; moge [...]]]></description>
			<content:encoded><![CDATA[<p>Symfonyで多言語対応する予定があるけど、とりあえず日本語だけ使いたかったときのメモです。embedI18nを自在に使う参考に。例によってSymfony 1.4+Doctrine。</p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>// HogeForm.class.php
public HogeForm extends BaseHogeForm
{

    public function configure()
    {
        parent::configure();

        $this-&gt;embedI18n(array('ja'));

        // 二次元配列でembedしたフォームにアクセスできる
        $this-&gt;validatorSchema['ja']['name']-&gt;setOption('required', true);

        $this-&gt;useFields(array('ja', 'foo', 'bar'));
    }

}
</pre>
</div>
<p>このままテンプレートで$form-&gt;render()とかしてしまうと、入れ子表示になってしまうのでrenderRowでそれぞれ表示するようにしてやれば、useFieldsでembedされたフォームの順番がいじれないという問題も解決。</p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>// hogeCreateSuccess.php
$form['ja']['name']-&gt;renderRow();
$form['foo']-&gt;renderRow();
$form['bar']-&gt;renderRow();
</pre>
</div>
<p>ちなみにsfFormDoctrine::getI18nFormClass()とかあるのですが、クラス名が取れるだけです。</p>
<h3>追記</h3>
<blockquote>
<p>SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry &#8217;19-ja&#8217; for key &#8216;PRIMARY&#8217;</p>
</blockquote>
<p>フォームをsaveしたら上記のエラーが出ました。</p>
<p>updateObject後にobject-&gt;toArray()をすると見覚えのない、「ja_JP」というキーが。</p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>Array
(
    [id] =&gt;
    [foo] =&gt; hoge
    [bar] =&gt; moge
    [Translation] =&gt; Array
        (
            [ja] =&gt; Array
                (
                    [id] =&gt;
                    [name] =&gt; someone
                    [lang] =&gt; ja
                )
            [ja_JP] =&gt; Array
                (
                    [id] =&gt;
                    [name] =&gt;
                    [lang] =&gt; ja_JP
                )
        )
)
</pre>
</div>
<p>色々調べた結果、原因は</p>
<ul>
<li>langがchar(2)なので、jaとja_JPの区別がつかないこと</li>
<li>sfDoctrineRecord::getDefaultCulture()がja_JPなこと</li>
</ul>
<p>恐らく、<br />
  <br /><a href="http://www.symfony-project.org/jobeet/1_4/Doctrine/ja/19">http://www.symfony-project.org/jobeet/1_4/Doctrine/ja/19</a></p>
<p>このページを参考にしているとハマるのではないかと…</p>
<p>ちなみにlangがchar(2)なのは、Doctrine_I18nの中で定義されています。</p>
<p>対策として考えられるのは以下のパターン。</p>
<ul>
<li>sfDoctrineRecord::setDefaultCulture(&#8216;ja&#8217;)をコールする</li>
<li>langをchar(5)にしてja_JPの形式で扱う</li>
<li>settings.ymlのdefault_cultureをjaにする</li>
<li>embedI18nにja_JPを渡す</li>
</ul>
<p>sfDoctrineRecordのカルチャをセットするのは、sfUserのカルチャをセットすることでイベントが駆動して同時にセットできます。なので、$this-&gt;getUser()-&gt;setCulture(‘ja’)とかしておけばOK。</p>
<p>langをchar(5)にするのは、I18nビヘイビアのオプションにlength:5を指定すればできます。この場合、カルチャをすべて５文字で扱うようにしないとlangがマッチしなくなります。length:2の場合は暗黙的に先頭２文字だけにマッチさせることで５文字のカルチャを許容していたので。</p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre># schema.yml
Sample:
  actAs:
    Timestampable: ~
    I18n:
      fields: [name]
      length: 5
</pre>
</div>
<p>settings.ymlのdefault_cultureをjaにするのが一番簡単です。en_USとen_GBはどうするんだという話ですけど…</p>
<p>formクラスに$this-&gt;embedI18n(array(‘ja_JP’))とすることでも対応できます。</p>
<p>気になる方はsfDoctrineRecordI18nFilterクラスのfilterSet関数を見てください。</p>
<p>カタログファイルとかにも影響しそうなのでsettings.ymlに２文字カルチャをセットするのがベターかなぁ。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.loadlimits.info/2011/04/symfony%e3%81%a7embed18n%e3%82%92%e4%bd%bf%e3%81%86/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>symfonyで行の並び順を指定できるビヘイビアを使ってみた</title>
		<link>http://blog.loadlimits.info/2011/02/symfony%e3%81%a7%e8%a1%8c%e3%81%ae%e4%b8%a6%e3%81%b3%e9%a0%86%e3%82%92%e6%8c%87%e5%ae%9a%e3%81%a7%e3%81%8d%e3%82%8b%e3%83%93%e3%83%98%e3%82%a4%e3%83%93%e3%82%a2%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6/</link>
		<comments>http://blog.loadlimits.info/2011/02/symfony%e3%81%a7%e8%a1%8c%e3%81%ae%e4%b8%a6%e3%81%b3%e9%a0%86%e3%82%92%e6%8c%87%e5%ae%9a%e3%81%a7%e3%81%8d%e3%82%8b%e3%83%93%e3%83%98%e3%82%a4%e3%83%93%e3%82%a2%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6/#comments</comments>
		<pubDate>Mon, 21 Feb 2011 01:19:04 +0000</pubDate>
		<dc:creator>hotpi</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://blog.loadlimits.info/2011/02/symfony%e3%81%a7%e8%a1%8c%e3%81%ae%e4%b8%a6%e3%81%b3%e9%a0%86%e3%82%92%e6%8c%87%e5%ae%9a%e3%81%a7%e3%81%8d%e3%82%8b%e3%83%93%e3%83%98%e3%82%a4%e3%83%93%e3%82%a2%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6/</guid>
		<description><![CDATA[今回はこちらを参考に、csDoctrineActAsSortablePluginを使ってみました。 $ ./symfony plugin:install csDoctrineActAsSortablePlugin &#62;&#62; plugin installing plugin "csDoctrineActAsSortablePlugin" &#62;&#62; sfPearFrontendPlugin downloading csDoctrineActAsSortablePlugin-1.5.1.tgz ... &#62;&#62; sfPearFrontendPlugin Starting to download csDoctrineActAsSortablePlugin-1.5.1.tgz &#62;&#62; sfPearFrontendPlugin (6,795 bytes) &#62;&#62; sfPearFrontendPlugin . &#62;&#62; sfPearFrontendPlugin . &#62;&#62; sfPearFrontendPlugin ...done: 6,795 bytes &#62;&#62; sfSymfonyPluginManager Installation successful for plugin "csDoctrineActAsSortablePlugin" &#62;&#62; sfSymfonyPluginManager Installing web data for plugin 使い方はschema.ymlのモデルのActAsにSortableを追加してやればいいだけです。 ModelName: actAs: Timestampable: ~ [...]]]></description>
			<content:encoded><![CDATA[<p>今回は<a href="http://d.hatena.ne.jp/innx_hidenori/20100107/1262850227" target="_blank">こちら</a>を参考に、csDoctrineActAsSortablePluginを使ってみました。</p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>$ ./symfony plugin:install csDoctrineActAsSortablePlugin
&gt;&gt; plugin    installing plugin "csDoctrineActAsSortablePlugin"
&gt;&gt; sfPearFrontendPlugin downloading csDoctrineActAsSortablePlugin-1.5.1.tgz ...
&gt;&gt; sfPearFrontendPlugin Starting to download csDoctrineActAsSortablePlugin-1.5.1.tgz
&gt;&gt; sfPearFrontendPlugin (6,795 bytes)
&gt;&gt; sfPearFrontendPlugin .
&gt;&gt; sfPearFrontendPlugin .
&gt;&gt; sfPearFrontendPlugin ...done: 6,795 bytes
&gt;&gt; sfSymfonyPluginManager Installation successful for plugin "csDoctrineActAsSortablePlugin"
&gt;&gt; sfSymfonyPluginManager Installing web data for plugin</pre>
</div>
<p>使い方はschema.ymlのモデルのActAsにSortableを追加してやればいいだけです。</p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>ModelName:
  actAs:
    Timestampable: ~
    Sortable: ~</pre>
</div>
<p>これで、自動的にpositionというbigintのカラムが生成されて、ソート順が数字で指定できるようになります。</p>
<p>併せて順序を入れ替えるための便利なメソッドが使えるようになります。<br />
  <br /><a href="http://www.symfony-project.org/plugins/csDoctrineActAsSortablePlugin/1_5_1?tab=plugin_readme" target="_blank">http://www.symfony-project.org/plugins/csDoctrineActAsSortablePlugin/1_5_1?tab=plugin_readme</a></p>
<p>今回、I18nの下にSortableを置いたら、インデックス名がやたら長くなってしまい、CREATE文でエラーが出るようになってしまいました。</p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>SQLSTATE[42000]: Syntax error or access violation: 1059 Identifier name '******_*********_***_*******_******_*****_translation_position_sortable_idx' is too long.</pre>
</div>
<p>plugins/csDoctrineActAsSortablePlugin/lib/template/Sortable.php</p>
<p><div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>  protected function getSortableIndexName()
  {
    return sprintf('%s_%s_%s', $this-&gt;getTable()-&gt;getTableName(), $this-&gt;_options['name'], $this-&gt;_options['indexName']);
  }</pre>
</div>
<p>ということなので、nameとindexNameを指定して短くできそうです。<br />
  <br />と言ってもposition_sortable分しか短くできないのですけど。</p>
<p>最終的には、schema.ymlの方でtableNameをdatabase_name.table_nameで指定していたのですが、これをtableName: table_nameにするだけで対応できました。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.loadlimits.info/2011/02/symfony%e3%81%a7%e8%a1%8c%e3%81%ae%e4%b8%a6%e3%81%b3%e9%a0%86%e3%82%92%e6%8c%87%e5%ae%9a%e3%81%a7%e3%81%8d%e3%82%8b%e3%83%93%e3%83%98%e3%82%a4%e3%83%93%e3%82%a2%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL Workbenchからschema.ymlを生成する</title>
		<link>http://blog.loadlimits.info/2011/02/mysql-workbench%e3%81%8b%e3%82%89schema-yml%e3%82%92%e7%94%9f%e6%88%90%e3%81%99%e3%82%8b/</link>
		<comments>http://blog.loadlimits.info/2011/02/mysql-workbench%e3%81%8b%e3%82%89schema-yml%e3%82%92%e7%94%9f%e6%88%90%e3%81%99%e3%82%8b/#comments</comments>
		<pubDate>Thu, 17 Feb 2011 20:18:26 +0000</pubDate>
		<dc:creator>hotpi</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://blog.loadlimits.info/2011/02/mysql-workbench%e3%81%8b%e3%82%89schema-yml%e3%82%92%e7%94%9f%e6%88%90%e3%81%99%e3%82%8b/</guid>
		<description><![CDATA[MySQL Workbenchからsymfony+Doctrine用のschema.ymlを書き出せないかなぁとつぶやいたら@hidenorigotoさんに教えていただいたので試してみました。 http://twitter.com/#!/hidenorigoto/status/38153994970988544 MySQL Workbench schema exporter MySQL Workbench schema exporterは、MySQL WorkbenchプラグインのMySQL Workbench Doctrine Pluginにインスパイアを受けて開発されたようです。 が、こちらのプラグインはすでにメンテされていないようです。 開発終了した理由がぞろぞろ書いてありますが、要約すると「LUAが…」ってことみたいです。 MySQL Workbench schema exporterはPHPで書かれています。MySQL Workbenchのmwbファイルを読み込んでパース、フォーマッタを指定してそれぞれの形式を書き出すようです。 ちなみにmwbファイルはZIP圧縮されたXMLです。あと、SQLite3のデータが入ってました。 注意点としてPHP 5.3以降でないと実行できません… いつものdebian環境では5.2を使ってるので、Windows版の5.3をダウンロードしてインストールしました。 まずはexampleディレクトリに移動します。 C:\Users\test\Downloads\johmue-mysql-workbench-schema-exporter-7d08e29\example&#62;php -v PHP 5.3.5 (cli) (built: Jan 5 2011 20:36:18) Copyright (c) 1997-2010 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies example/data/にtest.mwbがあり、サンプルではこのファイルを使います。 ちなみにサンプルのEER(Enhanced Entity-Relationship) diagramはこんな感じです。 [...]]]></description>
			<content:encoded><![CDATA[<p>MySQL Workbenchからsymfony+Doctrine用のschema.ymlを書き出せないかなぁとつぶやいたら<a href="http://twitter.com/#!/hidenorigoto" target="_blank">@hidenorigotoさん</a>に教えていただいたので試してみました。     <br /><a href="http://twitter.com/#!/hidenorigoto/status/38153994970988544" target="_blank">http://twitter.com/#!/hidenorigoto/status/38153994970988544</a></p>
<p><a href="https://github.com/johmue/mysql-workbench-schema-exporter" target="_blank">MySQL Workbench schema exporter</a></p>
<p>MySQL Workbench schema exporterは、MySQL Workbenchプラグインの<a href="http://code.google.com/p/mysql-workbench-doctrine-plugin/" target="_blank">MySQL Workbench Doctrine Plugin</a>にインスパイアを受けて開発されたようです。     <br />が、こちらのプラグインはすでにメンテされていないようです。</p>
<p>開発終了した理由がぞろぞろ書いてありますが、要約すると「LUAが…」ってことみたいです。</p>
<p>MySQL Workbench schema exporterはPHPで書かれています。MySQL Workbenchのmwbファイルを読み込んでパース、フォーマッタを指定してそれぞれの形式を書き出すようです。    <br />ちなみにmwbファイルはZIP圧縮されたXMLです。あと、SQLite3のデータが入ってました。</p>
<p>注意点としてPHP 5.3以降でないと実行できません…    <br />いつものdebian環境では5.2を使ってるので、Windows版の5.3をダウンロードしてインストールしました。</p>
<p>まずはexampleディレクトリに移動します。</p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>C:\Users\test\Downloads\johmue-mysql-workbench-schema-exporter-7d08e29\example&gt;php -v
PHP 5.3.5 (cli) (built: Jan  5 2011 20:36:18)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies</pre>
</div>
<p>example/data/にtest.mwbがあり、サンプルではこのファイルを使います。</p>
<p>ちなみにサンプルのEER(Enhanced Entity-Relationship) diagramはこんな感じです。</p>
<p><a href="http://blog.loadlimits.info/wp-content/uploads/2011/02/test.png"><img style="border-right-width: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px;padding-top: 0px" border="0" alt="test.mwb" src="http://blog.loadlimits.info/wp-content/uploads/2011/02/test_thumb.png" width="423" height="326" /></a></p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>C:\Users\test\Downloads\johmue-mysql-workbench-schema-exporter-7d08e29\example&gt;php .\doctrine1.yaml.php
&lt;textarea cols="100" rows="50"&gt;Bureau:
  tableName: mydb.bureaus
  columns:
    id:
      type: integer(4)
      primary: true
      notnull: true
      autoincrement: true
    room:
      type: string(45)
  indexes:
    testIndex:
      fields: [room]
      type: unique
  options:
    charset: utf8
    type: InnoDB

Email:
  actAs:
    timestampable:
  tableName: mydb.emails
  columns:
    id:
      type: integer(4)
      primary: true
      notnull: true
      autoincrement: true
    email:
      type: string(255)
    users_id:
      type: integer(4)
      primary: true
      notnull: true
  relations:
    User:
      class: User
      local: users_id
      foreign: id
      foreignAlias: Emails
      onDelete: no action
      onUpdate: no action
  indexes:
    fk_Emails_Users:
      fields: [users_id]
  options:
    charset: utf8
    type: InnoDB

User:
  actAs:
    timestampable:
  tableName: mydb.users
  columns:
    id:
      type: integer(4)
      primary: true
      notnull: true
      autoincrement: true
    name:
      type: string(255)
  options:
    charset: utf8
    type: InnoDB

UsersBureaus:
  tableName: mydb.users_bureaus
  columns:
    users_id:
      type: integer(4)
      primary: true
      notnull: true
    bureaus_id:
      type: integer(4)
      primary: true
      notnull: true
  relations:
    User:
      class: User
      local: users_id
      foreign: id
      foreignAlias: UsersBureauss
      onDelete: no action
      onUpdate: no action
    Bureau:
      class: Bureau
      local: bureaus_id
      foreign: id
      foreignAlias: UsersBureauss
      onDelete: no action
      onUpdate: no action
  indexes:
    fk_users_bureaus_bureaus1:
      fields: [bureaus_id]
  options:
    charset: utf8
    type: InnoDB

Testtable:
  tableName: mydb2.testtable
  columns:
    id:
      type: integer(4)
      primary: true
      notnull: true
  options:
    charset: utf8
    type: InnoDB
&lt;/textarea&gt;&lt;br&gt;&lt;br&gt;1 MB used&lt;br&gt;0.055 sec needed</pre>
</div>
<p>というわけで、リレーションやインデックスなども書きだされるようです。<br />
  <br />HTMLのタグはdoctrine1.yaml.phpの中に書いてあるので、CLIから使うときは適当に外してください。</p>
<p>timestampableなどのビヘイビアに関しては、コメント欄に書くことで出力できるようです。</p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>{d:actAs}
  actAs:
    timestampable:
{/d:actAs}</pre>
</div>
<p>この仕様はちょっと微妙な気が…<br />
  <br />created_atとupdated_atがあったらtimestampable付けるとかの方が楽だなぁ、と。 </p>
<p>作っちゃった後の全テーブルにコメント指定して回るのはちょっと辛いので。</p>
<p>サーバにPHP 5.3が入っているなら、symfony taskでmwbからschema.ymlの生成と、ActAsの追加をやってしまうのがいいかな、と思いました。</p>
<p>うーん、個人的にはMySQL Workbench上で完結したいから、プラグインの方が便利な気はするんですけどねぇ。LUAとは言わなくてもPythonスクリプティング対応しているようなので、Pythonに書き直すとか…</p>
<p>この後、60テーブルほどのファイルを変換してみましたが、問題なく実行できました。<br />
  </p>
<h3>追記(2011/02/19)</h3>
<p>注意点がいくつかあります。<br />
  <br />というか、致命的かも。</p>
<p>１．NOT NULLのchar型にDEFAULT値&#8221;を入れるとNULLに変換される</p>
<p>これはDoctrineのbuild &#8211;sqlがおかしいかな…</p>
<p>column_name:<br />
  <br />&#160; type: char(3)</p>
<p>&#160; notnull: true</p>
<p>&#160; default: &#8221;</p>
<p>column_name char(3) DEFAULT NULL NOT NULLとかいう矛盾を持ったクエリが生成されます。<br />
  <br />ちなみにvarcharは大丈夫です。</p>
<p>default: &#8221;の行は削除しましょう。</p>
<p>２．DECIMALやFLOATの最大桁数と少数点の値が逆になる</p>
<p>ひどい。<br />
  <br />例えばMySQL WorkbenchでDECIMAL(15,4)と指定したカラムがDECIMAL(4,15)と書き出されます。</p>
<p>column_name:<br />
  <br />&#160; type: decimal(4,15)</p>
<p>&#160; notnull: true</p>
<p>&#160; default: &#8217;0.0000&#8242;</p>
<p>もちろん、ちゃんとMySQL Workbenchからクエリのエクスポートをしたときは15,4になります。<br />
  <br />置換で何とか…</p>
<p>うーん、やっぱりMySQL WorkbenchでDBをあらかじめ作成しておいてから→doctrine:build-schema→schema.yml修正が妥当かなぁ。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.loadlimits.info/2011/02/mysql-workbench%e3%81%8b%e3%82%89schema-yml%e3%82%92%e7%94%9f%e6%88%90%e3%81%99%e3%82%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A cache key must contain both a module and an action parameter</title>
		<link>http://blog.loadlimits.info/2010/12/a-cache-key-must-contain-both-a-module-and-an-action-parameter/</link>
		<comments>http://blog.loadlimits.info/2010/12/a-cache-key-must-contain-both-a-module-and-an-action-parameter/#comments</comments>
		<pubDate>Wed, 01 Dec 2010 10:00:16 +0000</pubDate>
		<dc:creator>hotpi</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[解決]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://blog.loadlimits.info/2010/12/a-cache-key-must-contain-both-a-module-and-an-action-parameter/</guid>
		<description><![CDATA[Symfony 1.4にて、Flash上のリンクからページにリンクをしたところ、500エラーが発生。 A cache key must contain both a module and an action parameter 同じURLをそのまま別のウィンドウで開くと問題なく開けるので、リクエストを見比べたところ、違いはrefererの有無だけ。 エラーはinclude_partialの先で起きていて、調べていくと、パラメータを渡さないpartialに、config/cache.ymlでcontextual: trueとしていたのが問題でした。 falseにして解決。 ちなみにこのException自体も、本来は404を出すはずのところらしいです。 あと、キャッシュ有効にしないとこのエラーは出ません。]]></description>
			<content:encoded><![CDATA[<p>Symfony 1.4にて、Flash上のリンクからページにリンクをしたところ、500エラーが発生。</p>
<p>A cache key must contain both a module and an action parameter</p>
<p>同じURLをそのまま別のウィンドウで開くと問題なく開けるので、リクエストを見比べたところ、違いはrefererの有無だけ。</p>
<p>エラーはinclude_partialの先で起きていて、調べていくと、パラメータを渡さないpartialに、config/cache.ymlでcontextual: trueとしていたのが問題でした。</p>
<p>falseにして解決。</p>
<p>ちなみにこのException自体も、本来は404を出すはずのところらしいです。</p>
<p>あと、キャッシュ有効にしないとこのエラーは出ません。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.loadlimits.info/2010/12/a-cache-key-must-contain-both-a-module-and-an-action-parameter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>symfonyで携帯端末用のテンプレート切り替えを実装する</title>
		<link>http://blog.loadlimits.info/2010/09/symfony%e3%81%a7%e6%90%ba%e5%b8%af%e7%ab%af%e6%9c%ab%e7%94%a8%e3%81%ae%e3%83%86%e3%83%b3%e3%83%97%e3%83%ac%e3%83%bc%e3%83%88%e5%88%87%e3%82%8a%e6%9b%bf%e3%81%88%e3%82%92%e5%ae%9f%e8%a3%85%e3%81%99/</link>
		<comments>http://blog.loadlimits.info/2010/09/symfony%e3%81%a7%e6%90%ba%e5%b8%af%e7%ab%af%e6%9c%ab%e7%94%a8%e3%81%ae%e3%83%86%e3%83%b3%e3%83%97%e3%83%ac%e3%83%bc%e3%83%88%e5%88%87%e3%82%8a%e6%9b%bf%e3%81%88%e3%82%92%e5%ae%9f%e8%a3%85%e3%81%99/#comments</comments>
		<pubDate>Wed, 29 Sep 2010 02:05:21 +0000</pubDate>
		<dc:creator>hotpi</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[解決]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://blog.loadlimits.info/2010/09/symfony%e3%81%a7%e6%90%ba%e5%b8%af%e7%ab%af%e6%9c%ab%e7%94%a8%e3%81%ae%e3%83%86%e3%83%b3%e3%83%97%e3%83%ac%e3%83%bc%e3%83%88%e5%88%87%e3%82%8a%e6%9b%bf%e3%81%88%e3%82%92%e5%ae%9f%e8%a3%85%e3%81%99/</guid>
		<description><![CDATA[symfony 1.4で、PCサイトの携帯版を作ることになりました。 アクションは共通にして、テンプレートのファイル名を、携帯とPCで切り分けるようにしたいと思います。 例： templates/indexSuccess.php (PC用) templates/indexSuccess.mobile.php (携帯用) で、これはフォーマットを指定することで実現できます。フォーマットに関してはJobeetを参照。 Practical symfony &#124; 15日目: Web サービス &#124; symfony &#124; Web PHP Framework まずは携帯キャリアのIPから高速にキャリア判定をしてくれるプラグインを準備しておきます。 sfMobileIPPluginをsymfony 1.4で使ってみた 次にフィルタを用意します。 app/frontend/lib/filter/myMobileLayoutFilter.class.php &#60;?php class myMobileLayoutFilter extends sfFilter { public function execute($filterChain) { if ($this-&#62;isFirstCall()) { if (sfMobileIP::carrier() != 'pc') { $request = $this-&#62;getContext()-&#62;getRequest(); $request-&#62;setRequestFormat('mobile'); } } $filterChain-&#62;execute(); } } 最後にfilters.ymlを編集すればOKです。 app/frontend/config/filters.yml [...]]]></description>
			<content:encoded><![CDATA[<p>symfony 1.4で、PCサイトの携帯版を作ることになりました。</p>
<p>アクションは共通にして、テンプレートのファイル名を、携帯とPCで切り分けるようにしたいと思います。</p>
<p>例：   <br />templates/indexSuccess.php (PC用)    <br />templates/indexSuccess.mobile.php (携帯用)</p>
<p>で、これはフォーマットを指定することで実現できます。フォーマットに関してはJobeetを参照。</p>
<p><a href="http://www.symfony-project.org/jobeet/1_4/Doctrine/ja/15" target="_blank">Practical symfony | 15日目: Web サービス | symfony | Web PHP Framework</a></p>
<p>まずは携帯キャリアのIPから高速にキャリア判定をしてくれるプラグインを準備しておきます。</p>
<p><a title="sfMobileIPPluginをsymfony 1.4で使ってみた" href="http://blog.loadlimits.info/2010/09/sfmobileipplugin%e3%82%92symfony-1-4%e3%81%a7%e4%bd%bf%e3%81%a3%e3%81%a6%e3%81%bf%e3%81%9f/">sfMobileIPPluginをsymfony 1.4で使ってみた</a></p>
<p>次にフィルタを用意します。</p>
<p>app/frontend/lib/filter/myMobileLayoutFilter.class.php   <br /> 
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre class="brush: php">&lt;?php

class myMobileLayoutFilter extends sfFilter
{
    public function execute($filterChain)
    {
        if ($this-&gt;isFirstCall()) {

            if (sfMobileIP::carrier() != 'pc') {
                $request = $this-&gt;getContext()-&gt;getRequest();
                $request-&gt;setRequestFormat('mobile');
            }

        }

        $filterChain-&gt;execute();
    }
}
</pre>
</div>
<p>最後にfilters.ymlを編集すればOKです。</p>
<p>app/frontend/config/filters.yml<br />
  </p>
<div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent">
<pre>rendering: ~
security:  ~

myMobileLayoutFilter:
  class: myMobileLayoutFilter

cache:     ~
execution: ~
</pre>
</div>
<p>layoutのテンプレートも携帯版を用意しておきます。</p>
<p>例：<br />
  <br />app/frontend/templates/layout.php (PC用)</p>
<p>app/frontend/templates/layout.mobile.php (携帯用)</p>
<p>注意点として、partialなども全部「.mobile.php」の形式のファイルがないと動作しません。どこかでファイルを作り忘れるとsfRenderExceptionが投げられるので注意してください。ちなみに、dev環境だとそのまま真っ白な画面になってしまって、原因追求がしにくいようです。</p>
<p>その場合は、ログファイルにてチェックしましょう。</p>
<p>log/frontend_dev.log<br />
  <br />symfony [err] {sfRenderException} The template &quot;indexSuccess.mobile.php&quot; does not exist or is unreadable in &quot;&quot;.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.loadlimits.info/2010/09/symfony%e3%81%a7%e6%90%ba%e5%b8%af%e7%ab%af%e6%9c%ab%e7%94%a8%e3%81%ae%e3%83%86%e3%83%b3%e3%83%97%e3%83%ac%e3%83%bc%e3%83%88%e5%88%87%e3%82%8a%e6%9b%bf%e3%81%88%e3%82%92%e5%ae%9f%e8%a3%85%e3%81%99/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

