tag:blogger.com,1999:blog-60845125207385048792024-03-14T17:37:24.813+09:00Symfony2.GrAFRSymfony2の記事を書いてます。他のブログもよろ〜ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.comBlogger24125tag:blogger.com,1999:blog-6084512520738504879.post-19963928686957605232012-05-06T16:27:00.001+09:002012-05-06T16:28:30.751+09:00Form CollectionType ~ prototypeFormにcollection type ってのがあります。このprototypeについての説明
詳しくは <a href="http://symfony.com/doc/current/cookbook/form/form_collections.html">コチラ(How to Embed a Collection of Forms)</a>を見てもらえればよいのですが、簡単にここでもまとめておこうかと思います。
<h3 class="section_title1">そもそも collection type ってなんなのか</h3>
まぁ、これは名前のままなんですが、typeの集合ですね。
例えば、「あなたの好きな曲はなんですか?」って項目に、TextType(テキストフィールド)が複数ぶら下がる場合を考えれば、
そのTextTypeを集めるのがCollectionTypeとなります。<br /><br />
もうちょっとわかりやすく説明しますと、UserにSongがぶら下がるとしましょう。これはOneToManyでUserがすきな曲は複数もてます。
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaNbpkBT_7lEw_ybMWrO8QLnb4dj3e_3s4Pp8ssd05Ujx2XtlwvMCbPNHjP3ykr1BGYwFnuv_xAeberm-Dh09dZ3WZ11YKe7axOLXjEcd90i-Rwy7eOEcIGPz8jFlNreuMkOi3IpLsM-w/s1600/IMG_collection.png" imageanchor="1" style=""><img border="0" height="320" width="256" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaNbpkBT_7lEw_ybMWrO8QLnb4dj3e_3s4Pp8ssd05Ujx2XtlwvMCbPNHjP3ykr1BGYwFnuv_xAeberm-Dh09dZ3WZ11YKe7axOLXjEcd90i-Rwy7eOEcIGPz8jFlNreuMkOi3IpLsM-w/s320/IMG_collection.png" /></a></div>
こんなとき、UserTypeのEmbedでSongTypeを埋め込みたいですよね。でも1つのUserに対してSongTypeのフィールドたちをいっぱいもたなくてはならない。それってどうすんの?
=> ここで使うのが CollectionTypeなわけです。<br />
EntityでもOneToManyの場合、Doctrine\Common\Collections\Collection が使用されますが、このCollectionと同じことなのかな。このCollectionを扱うためのTypeがCollectionType的な。
<br /><br />
<h3 class="section_title1">動的に項目増やしたい場合ってあるよね?</h3>
Collectionはなんとなくわかった。ちょっと疑問なんだけど、一般的にSongが上図のように3つしかぶら下がらないとは限らないよね?
サービスによっては、Javacript とかで項目を動的に追加したりしたい場合ってあるとおもう。<br />
その場合もCollection使うと思うんだけど、どうなのよ?
<br /><br />
このために、prototypeがあるわけです。prototypeを使えばフォームの項目のHTML内容をプロトタイプとして持ってくれるので、あとはJavascriptでそれをベースにどんどん増やしてね☆ って話。
<pre name="code" class="php">
// src/Hoge/UserBundle/Form/Type/UserType.php
// ...
public function buildForm(FormBuilder $builder, array $options)
{
$builder->add('username');
$builder->add('songs', 'collection', array(
'type' => new SongType(),
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false,
'prototype' => true,
));
}
</pre>
以下のようにするとdata-prototype に、エスケープされたプロトタイプのHTMLが入ります
<pre name="code" class="php">
<ul class="songs" data-prototype="{{ form_widget(form.songs.get('prototype')) | e }}">
<li></li>
</ul>
</pre>
で、javascriptで以下のように$$name$$を数字に置き換えれば、動的に追加できます。
例えば、ボタンのクリックイベントで addTagForm() を呼べばOK
<pre name="code" class="javascript">
$(function(){
var collectionHolder = $('ul.songs');
var addTagForm = function() {
// Get the data-prototype we explained earlier
var prototype = collectionHolder.attr('data-prototype');
// Replace '$$name$$' in the prototype's HTML to
// instead be a number based on the current collection's length.
var newForm = prototype.replace(/\$\$name\$\$/g, collectionHolder.children().length);
collectionHolder.append('<li>'+newForm+'</li>');
};
});
</pre>
ざっくりだけど、こんなかんじです。ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-6084512520738504879.post-32594577155844789082012-05-02T20:01:00.001+09:002012-05-02T20:02:28.852+09:00Formのwidget個々のカスタマイズFormのwidgetには、choice, time, number ..... のように、いくつか用意されています。
詳しくは <a href="http://docs.symfony.gr.jp/symfony2/book/forms.html" target="_blank">コチラ (symfony日本語ドキュメント)</a>
で, templateで出力する際は
<pre name="code" class="php">
{{ form_widget(form.fieldname) }}
</pre>
みたいにやります。
そうすると、
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUTx2uHbp3nSEazFIPNhpp-FHoj1r0WbMSQ4KN7O_CTuuxiIwzTh6VguoDpCwJ2KCNdJfhYOyE87DNPeCqgig_091ZgveDk3xc2-sSvD9FqGv8L63cTLs8J7FXVPEM5gdQUPV4GBEgh_E/s1600/symfony_choise_radio.png" imageanchor="1" style=""><img border="0" height="34" width="107" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUTx2uHbp3nSEazFIPNhpp-FHoj1r0WbMSQ4KN7O_CTuuxiIwzTh6VguoDpCwJ2KCNdJfhYOyE87DNPeCqgig_091ZgveDk3xc2-sSvD9FqGv8L63cTLs8J7FXVPEM5gdQUPV4GBEgh_E/s320/symfony_choise_radio.png" /></a></div>
みたいな感じで表示されます。
ですが、
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDj4zZEjHZgR4KcY2TUPnLO2cN7AxbA0NOf28gcYW6B5DlM43w8YNOynUbPNctIO9PeKxDK_L8uZuOLS-JkI8KWc5MrNM8agYSWu2nqv3jQFq_fJZpJrl4ofQIwJhjMWVPhu0h_rDU7n0/s1600/symfony_choise_radio2.png" imageanchor="1" style=""><img border="0" height="41" width="64" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDj4zZEjHZgR4KcY2TUPnLO2cN7AxbA0NOf28gcYW6B5DlM43w8YNOynUbPNctIO9PeKxDK_L8uZuOLS-JkI8KWc5MrNM8agYSWu2nqv3jQFq_fJZpJrl4ofQIwJhjMWVPhu0h_rDU7n0/s320/symfony_choise_radio2.png" /></a></div>
みたく、縦並びにしたいとかって、レイアウトをwidgetごとに変更したいときってありますよね。
そんなときは、
<pre name="code" class="php">
{% form_theme form _self %}
{% block _[formtype名]_[フィールド名]_widget %}
{% spaceless %}
<div {{ block('widget_container_attributes') }}>
{% for child in form %}
<div> {# 追加!!!!!! #}
{{ form_widget(child) }}
{{ form_label(child) }}
</div> {# 追加!!!!!! #}
{% endfor %}
</div>
{% endspaceless %}
{% endblock _recallItem_is_new_widget %}
</pre>
みたいな感じで、テンプレートをカスタマイズできます。
これは、テンプレートのデフォルトのテーマをカスタマイズって形をとっていて、その元となるテンプレートは
vendor/symfony/src/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig
にありますので、これを見ながらカスタマイズすればOK.ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-6084512520738504879.post-91797492203114188452012-04-01T10:55:00.002+09:002012-04-01T10:59:38.920+09:00独自のアノテーションを作成する独自のアノテーションを作成したいっ!ってなったことありませんか? ( @Route, @Template のように )<br />
例えば、Entity で CreatedAt を Annotation につけると現在時刻を付加 (→ <a href="http://www.scandio.de/2012/02/symfony2-custom-annotations/">http://www.scandio.de/2012/02/symfony2-custom-annotations/</a> で紹介されています)等のことが楽にできるようになります。<br />
<br />
<br />
この独自アノテーションの作成方法を簡単にまとめておきます。<br />
<br />
※ 以下のように、param フィールド をもつ Custom というコントローラーのアノテーションを作ることにします。<br />
<pre class="php" name="code"><?php
namespace Application\MogeraBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Core\HogeBundle\Annotations\Custom;
class DefaultController extends Controller
{
/**
* @Custom(param="hogehoge")
*/
public function indexAction()
{
exit();
}
}
</pre><br />
<br />
① まずこの Custom クラスを作成<br />
<pre class="php" name="code"><?php
namespace Core\HogeBundle\Annotations;
/**
* @Annotation
*/
class Custom
{
// fields
private $param = "";
// constructor
public function __construct(array $data)
{
// アノテーションに記述した値が $data の中に入ってる
$this->param = $data['param'];
}
// get value of param
public function getParam(){
return $this->param;
}
}
</pre><br />
<br />
② アノテーションを処理するDriver部分を作成<br />
この例では、コントローラーが呼ばれるタイミングの、onKernelController で、アノテーションを処理させます。<br />
<pre name="code" class="php"><?php
namespace Core\HogeBundle\Annotations;
use Doctrine\Common\Annotations\Reader;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
class CustomAnnotationDriver{
private $reader;
public function __construct(Reader $reader)
{
// set annotations reader
$this->reader = $reader;
}
/**
* onKernelController
*/
public function onKernelController(FilterControllerEvent $event)
{
if (!is_array($controller = $event->getController())) {
return;
}
$object = new \ReflectionObject($controller[0]);// get controller
$method = $object->getMethod($controller[1]);// get method
// getMethodAnnotation は 第二引数に指定したアノテーションタイプにマッチしたものを返します
// annotation reader には、アノテーションの種類によってもいくつかメソッドが用意されてるので、ソースは見ておくと良いかも
$custom = $this->reader->getMethodAnnotation( $method, 'Core\\HogeBundle\\Annotations\\Custom' );
if( !empty($custom) ){
print $custom->getParam(); // hogehoge と出力される
}
}
}
</pre><br />
<br />
③ service に登録 (今回は onKernelController で アノテーションを処理するので以下のように。)<br />
また、CustomAnnotationDriver にはコンストラクタで annotation_reader で 必要とするので、arguments にそれを記述。<br />
<pre name="code" class="xml">services:
hoge_annotation_driver:
class: Core\HogeBundle\Annotations\CustomAnnotationDriver
tags:
- { name: kernel.event_listener, event: kernel.controller, method: onKernelController }
arguments: [@annotation_reader]
</pre><br />
<br />
<br />
こんな感じ。ただ、今回は print しか処理をしてないです。<br />
参考になれば嬉しいです。ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-6084512520738504879.post-53951120392432482902012-03-18T16:13:00.001+09:002012-03-18T16:21:00.806+09:00FormでEntityにないフィールドを使用する場合Symfony2のフォームフレームワークでは、EntityとForm定義を結びつけることができます。<br />
<br />
その方法は、<a href="http://symfony.com/doc/current/book/forms.html" target="_blank">http://symfony.com/doc/current/book/forms.html</a>とかを見てもらえば分かるのですが、<br />
<br />
AbstractTypeを継承したクラスで<br />
<pre class="php" name="code">public function getDefaultOptions(array $options)
{
return array(
'data_class' => 'Acme\TaskBundle\Entity\Category',
);
}
</pre>とするか、<br />
<br />
formインスタンスを作成する時に、<br />
<pre class="php" name="code">use Acme\TaskBundle\Form\Type\TaskType;
public function newAction()
{
$task = new Task(); // Task Entityのインスタンスを作成
$form = $this->createForm(new TaskType(), $task); // それを第二引数でわたす
// ...
}
</pre>とするかです。<br />
<br />
<br />
このようにすると、Entityにデータをbindすることができるのですが、Entiryに存在しないフィールド名をフォームに定義してしまうと、エラーが出る。<br />
例えば、TaskEntiryに urlというパラメータが存在しないのに、formで $builder->add('url','text') のように定義してしまうと、TaskEntityにはgetUrlってメソッドが無いよ!!と、怒られるわけです。<br />
<br />
<br />
この場合は、以下のようにすればOK<br />
<br />
<pre class="php" name="code">$builder->add('url','text'
array(
"property_path" => false,
)
);
</pre>property_pathというパラメータにfalseを与えるだけ。<br />
<br />
<br />
ちなみに、bindRequestした場合は、<br />
<pre class="php" name="code">$form->bindRequest($request);
$url = $form['url']->getData();
</pre><br />
こんな感じでパラメータを取得できます。<br />
<br />
<br />
<br />
ただ、一つの方法ってだけで、このソリューションを使いまくるのは、それはそれでぐちゃぐちゃになりそうなので、あくまで一つの解決策ってかんじですね。ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-6084512520738504879.post-73374707668659130052011-12-08T17:42:00.000+09:002011-12-08T17:42:36.521+09:00consoleコマンドリスト<pre class="console_design1">$ php app/console list</pre>のコマンドで、コンソールのコマンドリストを見れます。<br />
別にコンソール上で見ればいいけど、一応一覧をメモっておく。<br />
<br />
<pre class="console_design1">Symfony version 2.0.6 - app/dev/debug
<span class="Apple-style-span" style="color: #9fc5e8;">Usage:</span>
<span class="Apple-style-span" style="color: yellow;"> [options] command [arguments]</span>
<span class="Apple-style-span" style="color: #9fc5e8;">Options:</span>
<span class="Apple-style-span" style="color: yellow;">--help</span> <span class="Apple-style-span" style="color: #f1c232;">-h</span> Display this help message.
<span class="Apple-style-span" style="color: yellow;">--quiet</span> <span class="Apple-style-span" style="color: #f1c232;">-q</span> Do not output any message.
<span class="Apple-style-span" style="color: yellow;">--verbose</span> <span class="Apple-style-span" style="color: #f1c232;">-v</span> Increase verbosity of messages.
<span class="Apple-style-span" style="color: yellow;">--version</span> <span class="Apple-style-span" style="color: #f1c232;"> -V</span> Display this program version.
<span class="Apple-style-span" style="color: yellow;">--ansi</span> Force ANSI output.
<span class="Apple-style-span" style="color: yellow;">--no-ansi</span> Disable ANSI output.
<span class="Apple-style-span" style="color: yellow;">--no-interaction</span> <span class="Apple-style-span" style="color: #f1c232;">-n</span> Do not ask any interactive question.
<span class="Apple-style-span" style="color: yellow;">--shell</span> <span class="Apple-style-span" style="color: #f1c232;">-s </span>Launch the shell.
<span class="Apple-style-span" style="color: yellow;">--env</span> <span class="Apple-style-span" style="color: #f1c232;">-e</span> The Environment name.
<span class="Apple-style-span" style="color: yellow;">--no-debug</span> Switches off debug mode.
<span class="Apple-style-span" style="color: #9fc5e8;">Available commands:</span>
<span class="Apple-style-span" style="color: yellow;">help</span> Displays help for a command
<span class="Apple-style-span" style="color: yellow;">list</span> Lists commands
<span class="Apple-style-span" style="color: #9fc5e8;">assetic</span>
<span class="Apple-style-span" style="color: yellow;">assetic:dump</span> Dumps all assets to the filesystem
<span class="Apple-style-span" style="color: #9fc5e8;">assets</span>
<span class="Apple-style-span" style="color: yellow;">assets:install</span> Install bundles web assets under a public web directory
<span class="Apple-style-span" style="color: #9fc5e8;">cache</span>
<span class="Apple-style-span" style="color: yellow;">cache:clear</span> Clear the cache
<span class="Apple-style-span" style="color: yellow;">cache:warmup</span> Warms up an empty cache
<span class="Apple-style-span" style="color: #9fc5e8;">container</span>
<span class="Apple-style-span" style="color: yellow;">container:debug</span> Displays current services for an application
<span class="Apple-style-span" style="color: #9fc5e8;">doctrine</span>
<span class="Apple-style-span" style="color: yellow;">doctrine:cache:clear-metadata</span> Clear all metadata cache for a entity manager
<span class="Apple-style-span" style="color: yellow;">doctrine:cache:clear-query</span> Clear all query cache for a entity manager
<span class="Apple-style-span" style="color: yellow;">doctrine:cache:clear-result</span> Clear result cache for a entity manager
<span class="Apple-style-span" style="color: yellow;">doctrine:database:create</span> Create the configured databases
<span class="Apple-style-span" style="color: yellow;">doctrine:database:drop</span> Drop the configured databases
<span class="Apple-style-span" style="color: yellow;">doctrine:ensure-production-settings</span> Verify that Doctrine is properly configured for a production environment.
<span class="Apple-style-span" style="color: yellow;">doctrine:generate:crud</span> Generates a CRUD based on a Doctrine entity
<span class="Apple-style-span" style="color: yellow;">doctrine:generate:entities</span> Generate entity classes and method stubs from your mapping information
<span class="Apple-style-span" style="color: yellow;">doctrine:generate:entity</span> Generates a new Doctrine entity inside a bundle
<span class="Apple-style-span" style="color: yellow;">doctrine:generate:form</span> Generates a form type class based on a Doctrine entity
<span class="Apple-style-span" style="color: yellow;">doctrine:mapping:convert</span> Convert mapping information between supported formats.
<span class="Apple-style-span" style="color: yellow;">doctrine:mapping:import</span> Import mapping information from an existing database
<span class="Apple-style-span" style="color: yellow;">doctrine:mapping:info</span> Show basic information about all mapped entities
<span class="Apple-style-span" style="color: yellow;">doctrine:query:dql</span> Executes arbitrary DQL directly from the command line.
<span class="Apple-style-span" style="color: yellow;">doctrine:query:sql</span> Executes arbitrary SQL directly from the command line.
<span class="Apple-style-span" style="color: yellow;">doctrine:schema:create</span> Executes (or dumps) the SQL needed to generate the database schema
<span class="Apple-style-span" style="color: yellow;">doctrine:schema:drop</span> Executes (or dumps) the SQL needed to drop the current database schema
<span class="Apple-style-span" style="color: yellow;">doctrine:schema:update</span> Executes (or dumps) the SQL needed to update the database schema to match the current mapping metadata
<span class="Apple-style-span" style="color: #9fc5e8;">generate</span>
<span class="Apple-style-span" style="color: yellow;">generate:bundle</span> Generates a bundle
<span class="Apple-style-span" style="color: yellow;">generate:doctrine:crud</span> Generates a CRUD based on a Doctrine entity
<span class="Apple-style-span" style="color: yellow;">generate:doctrine:entities</span> Generate entity classes and method stubs from your mapping information
<span class="Apple-style-span" style="color: yellow;">generate:doctrine:entity</span> Generates a new Doctrine entity inside a bundle
<span class="Apple-style-span" style="color: yellow;">generate:doctrine:form</span> Generates a form type class based on a Doctrine entity
<span class="Apple-style-span" style="color: #9fc5e8;">init</span>
<span class="Apple-style-span" style="color: yellow;">init:acl</span> Mounts ACL tables in the database
<span class="Apple-style-span" style="color: #9fc5e8;">router</span>
<span class="Apple-style-span" style="color: yellow;">router:debug</span> Displays current routes for an application
<span class="Apple-style-span" style="color: yellow;"> router:dump-apache</span> Dumps all routes as Apache rewrite rules
<span class="Apple-style-span" style="color: #9fc5e8;">swiftmailer</span>
<span class="Apple-style-span" style="color: yellow;">swiftmailer:spool:send</span> Send emails from the spool
</pre>ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-6084512520738504879.post-22143081729583420542011-12-08T04:31:00.000+09:002011-12-08T04:31:48.615+09:00既存のテーブルからEntityを作成!タイトルのように、既存のテーブルからEntityを作成したい場合は、どうするのかなーと思ってた所、こんな記事がありました。→ <a href="http://symfony.com/doc/2.0/cookbook/doctrine/reverse_engineering.html">How to generate Entities from an Existing Database</a>ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-6084512520738504879.post-86925225995273282182011-12-06T18:42:00.003+09:002011-12-07T00:04:38.401+09:00controllerに書くアノテーションについて<a href="http://symfony.com/doc/2.0/bundles/SensioFrameworkExtraBundle/index.html" target="_blank">SensioFrameworkExtraBundle</a> <br />
<br />
Symfony2 では、アノテーションとして Routing の情報等を書くけど、そのアノテーションに関する情報がまとまってなくて、どっかにないかなーと思っていたら、<a href="http://symfony.com/doc/2.0/bundles/SensioFrameworkExtraBundle/index.html" target="_blank">ドキュメント</a>にあったので、紹介 + 自分なりにまとめてみます。<br />
<br />
とりあえず、アノテーションに以下の5つの機能があるっぽい<br />
<ul><li><a href="#annotation_RouteMethod" style="color: #333377;">@Route and @Method</a> : ルーティングの情報や、ルートに許可されるHTTPメソッドを指定</li>
<li><a href="#annotation_ParamConverter" style="color: #333377;">@ParamConverter</a> : リクエストの内容をオブジェクトに変換する機能を使用することを指定</li>
<li><a href="#annotation_Template" style="color: #333377;">@Template</a> : テンプレート名を指定する</li>
<li><a href="#annotation_Cache" style="color: #333377;">@Cache</a> : HTTPキャッシュを作成するためのアノテーション</li>
</ul><br />
<br />
<h3><a name="annotation_RouteMethod">@Route and @Method</a></h3>ドキュメントはコチラ → <a href="http://symfony.com/doc/2.0/bundles/SensioFrameworkExtraBundle/annotations/routing.html" target="_blank">@Route and @Method</a> <br />
<br />
<pre class="php" name="code">/**
* @Route("/{id}", requirements={"id" = "\d+"}, defaults={"foo" = "bar"})
*/
public function showAction($id)
{
}
</pre><ul><li>@Route() では、<span class="Apple-style-span" style="color: #b45f06;">第一引数</span>で pattern 情報を指定</li>
<li><span class="Apple-style-span" style="color: #b45f06;">requirements</span> には, 正規表現などで、Route 情報に制限をかけられる</li>
<li><span class="Apple-style-span" style="color: #b45f06;">defaults</span> で、デフォルトで渡されるパラメータの値を設定可能</li>
<li>@Routeを複数指定することもできる</li>
</ul><br />
<pre class="php" name="code">use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
/**
* @Route("/blog")
*/
class PostController extends Controller
{
/**
* @Route("/edit/{id}")
* @Method({"GET", "POST"})
*/
public function editAction($id)
{
}
}
</pre><ul><li><span class="Apple-style-span" style="color: #b45f06;">クラスに対して @Route 情報を記述</span>することで、全アクションに対して機能させることも可能</li>
<li>@Method({"GET", "POST"}) のように、<span class="Apple-style-span" style="color: #b45f06;">@Method() を使用して</span>、HTTPメソッドに制限をかけることができる。</li>
</ul><br />
<br />
<br />
<h3><a name="annotation_ParamConverter">@ParamConverter</a></h3>ドキュメントはコチラ → <a href="http://symfony.com/doc/2.0/bundles/SensioFrameworkExtraBundle/annotations/converters.html" target="_blank">@ParamConverter</a><br />
<br />
リクエストの内容をオブジェクトに変換する機能を使用。<br />
<br />
<pre class="php" name="code">use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
/**
* @Route("/blog/{id}")
* @ParamConverter("post", class="SensioBlogBundle:Post")
*/
public function showAction(Post $post)
{
}
</pre><br />
<ul><li>SensioBlogBundle:Post でPostオブジェクトがなかったら 404NotFoundが返される。</li>
<li>全てのコンバーターは<span class="Apple-style-span" style="color: #b45f06;">ParamConverterInterface</span>を実装してつくる</li>
</ul><br />
詳細はドキュメントを参照。<br />
<br />
<br />
<h3><a name="annotation_Template">@Template</a></h3>ドキュメントはコチラ → <a href="http://symfony.com/doc/2.0/bundles/SensioFrameworkExtraBundle/annotations/view.html" target="_blank">@Template</a><br />
<br />
<pre class="php" name="code">use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
:
/**
* @Template("SensioBlogBundle:Post:show")
*/
public function showAction1($id)
{
// get the Post
$post = ...;
return array('post' => $post);
}
/**
* @ParamConverter("post", class="SensioBlogBundle:Post")
* @Template("SensioBlogBundle:Post:show", vars={"post"})
*/
public function showAction2(Post $post)
{
}
</pre><ul><li>@Template("SensioBlogBundle:Post:show")のように、<span class="Apple-style-span" style="color: #b45f06;">テンプレートを指定</span>することが可能</li>
<li><span class="Apple-style-span" style="color: #b45f06;">vars</span> を指定することで、テンプレートにデータを渡すことも可能</li>
</ul><br />
<br />
<h3><a name="annotation_Cache">@Cache</a></h3>ドキュメントはコチラ → <a href="http://symfony.com/doc/2.0/bundles/SensioFrameworkExtraBundle/annotations/cache.html" target="_blank">@Cache</a><br />
<br />
<pre class="php" name="code">/**
* @Cache(expires="tomorrow")
*/
class BlogController extends Controller
{
/**
* @Cache(expires="+2 days")
*/
public function indexAction()
{
}
}
</pre><br />
このようにして、<span class="Apple-style-span" style="color: #b45f06;">expiresでキャッシュの有効期限を指定</span>して、キャッシュを簡単に作成可能<br />
<br />
<br />
詳しくは、ドキュメント参照でお願いします。<br />
とりあえず、アノテーションに関してはこんな感じ!ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com1tag:blogger.com,1999:blog-6084512520738504879.post-72133853384686049982011-12-06T05:06:00.000+09:002011-12-06T05:06:08.579+09:00アノテーションを使用するときはインポートすること!@Route や @Template のアノテーションを利用するときは、<br />
<br />
<pre name="code" class="php">// these import the "@Route" and "@Template" annotations
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
</pre><br />
のように、FrameworkExtraBundle の Configuration\Route と Configuration\Template をインポートすること!!ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-6084512520738504879.post-20808073363781924242011-12-05T21:56:00.002+09:002011-12-05T21:57:38.261+09:00Actionの戻り値についてSymfony2.0 では、Controller の Action の戻り値は、Response オブジェクト。<br />
ってのはまぁ、良いとして、Response オブジェクトの作成方法についてちょっと自分なりにメモしておく。<br />
(間違ってたらコメントください(´・ω・`))<br />
<br />
基本的に以下の3パターン。<br />
( <a href="http://symfony.com/doc/current/book/controller.html">http://symfony.com/doc/current/book/controller.html</a>より引用 )<br />
<br />
<b>① 自分でレスポンスオブジェクトを作成</b><br />
<pre class="php" name="code">use Symfony\Component\HttpFoundation\Response;
public function helloAction()
{
return new Response('Hello world!');
}
</pre>リダイレクトする場合は、このパターン<br />
<br />
<br />
<b>②render関数を Action 内で使用</b><br />
自分でテンプレートを指定して、レンダリングを行う。render() の戻り値が Response オブジェクトなので、これをそのまま Action の戻り値とする。<br />
<pre class="php" name="code">use Symfony\Component\HttpFoundation\Response;
public function helloAction()
{
return $this->render('AcmeHelloBundle:Welcome:hello.html.twig', array('name' => $name));
}
</pre><br />
<br />
<b>③ テンプレートに渡すパラメータをActionの戻り値にして、Responce オブジェクト作成は フレームワークにやらせる</b><br />
自分でテンプレートを指定して、レンダリングを行う。render() の戻り値が Response オブジェクトなので、これをそのまま Action の戻り値とする。<br />
<pre class="php" name="code">use Symfony\Component\HttpFoundation\Response;
public function helloAction()
{
// array('name' => $name) が 内部で AcmeHelloBundle:Welcome:hello.html.twig に渡され、Response オブジェクトが自動で作成される
return array('name' => $name)
}
</pre><br />
<br />
多分こんな感じ。ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-6084512520738504879.post-58252584425008528682011-12-05T19:56:00.000+09:002011-12-05T19:56:27.834+09:00Custom Repository ClassDoctrineでは、Entityというものを使うけど、これは基本的にデータを保持するためだけのクラス。<br />
で、実際に find などの様にデータベース上のデータをフェッチするには、Repository を使用する。<br />
<br />
こんな感じ。(<a href="http://docs.symfony.gr.jp/symfony2/book/doctrine.html">http://docs.symfony.gr.jp/symfony2/book/doctrine.html</a>より引用)<br />
<pre class="php" name="code">$product = $this->getDoctrine()
-$gt;getRepository('AcmeStoreBundle:Product')
-$gt;find($id);
</pre><br />
<br />
...で、このgetRepositoryを見てみると、<br />
<br />
<pre class="php" name="code">/**
* Gets the repository for an entity class.
*
* @param string $entityName The name of the entity.
* @return EntityRepository The repository class.
*/
public function getRepository($entityName)
{
$entityName = ltrim($entityName, '\\');
if (isset($this->repositories[$entityName])) {
return $this->repositories[$entityName];
}
$metadata = $this->getClassMetadata($entityName);
$customRepositoryClassName = $metadata->customRepositoryClassName;
if ($customRepositoryClassName !== null) {
$repository = new $customRepositoryClassName($this, $metadata);
} else {
$repository = new EntityRepository($this, $metadata);
}
$this->repositories[$entityName] = $repository;
return $repository;
}
</pre><br />
の様になっている。<br />
<br />
で、ここで注目するのは<br />
<br />
<pre class="php" name="code">if ($customRepositoryClassName !== null) {
$repository = new $customRepositoryClassName($this, $metadata);
} else {
$repository = new EntityRepository($this, $metadata);
}</pre><br />
のとこ。つまりカスタムリポジトリクラスがあれば、それを使用するけど、そうじゃなきゃEntityRepositoryを使うよーってことですね。<br />
<br />
ってことで、自分で Repositoryを作成するには、EntityRepositoryを継承して独自にカスタマイズすればOK。<br />
データ取得とかはコントローラでなくてモデル側に書いたほうが良いので、そういうのは独自のリポジトリを用意してそこで処理をさせたほうが綺麗!<br />
<br />
ってことらしいです。ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-6084512520738504879.post-15582586839895787102011-10-20T15:57:00.002+09:002011-12-08T18:59:26.090+09:00Doctrine - コマンドメモ<div style="margin: 0 0 10px 0;">① データベースの作成<br />
<pre class="console_design1">php app/console doctrine:database:create
</pre></div><br />
<div style="margin: 0 0 10px 0;">② Entity Class の作成<br />
<pre class="console_design1">php app/console doctrine:generate:entity --entity="AcmeStoreBundle:Product" --fields="name:string(255) price:float description:text"
</pre></div>ちなみに、Doctrineで扱えるフィールドタイプについては、<a href="http://docs.symfony.gr.jp/symfony2/book/doctrine.html#book-doctrine-field-types" target="_blank">http://docs.symfony.gr.jp/symfony2/book/doctrine.html#book-doctrine-field-types</a>や、<a href="http://www.doctrine-project.org/docs/orm/2.0/en/reference/basic-mapping.html#doctrine-mapping-types" target="_blank">http://www.doctrine-project.org/docs/orm/2.0/en/reference/basic-mapping.html#doctrine-mapping-types</a> に載ってあります。<br />
<br />
<br />
<br />
<div style="margin: 0 0 10px 0;">③ テーブル/スキーマの作成<br />
<pre class="console_design1">php app/console doctrine:schema:update --force
</pre></div><br />
<br />
<div style="margin: 0 0 10px 0;">④ Entity Class の更新<br />
<pre class="console_design1">php app/console doctrine:generate:entities Acme
</pre></div>ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-6084512520738504879.post-90891992242862822732011-10-17T18:44:00.004+09:002011-10-20T15:27:29.214+09:00Model (Doctrine) について②<a href="http://symfony2-gf.blogspot.com/2011/10/model-doctrine.html">Model (Doctrine) について①</a> の続きです。<br />
<br />
詳しくは、<a href="http://symfony.com/doc/current/book/doctrine.html">Databases and Doctrine ("The Model")</a>を参照してください。<br />
<br />
<h4 class="section_title2">オブジェクトの永続化</h4><br />
INSERTするときは以下のように、Entityに値をセットし、EntituManagerのpersist()を呼び、最後にflush() を実行すれば良い。<br />
<br />
<pre class="php" name="code">use Acme\StoreBundle\Entity\Product;
use Symfony\Component\HttpFoundation\Response;
public function createAction()
{
// Productインスタンスの作成
$product = new Product();
// 値をセット
$product->setName('A Foo Bar');
$product->setPrice('19.99');
$product->setDescription('Lorem ipsum dolor');
// EntityManager オブジェクトの取得
$em = $this->getDoctrine()->getEntityManager();
// データの保存
$em->persist($product);
$em->flush();
return new Response('Created product id '.$product->getId());
}
</pre><br />
<br />
<h4 class="section_title2">オブジェクトのフェッチ</h4><br />
Doctrineオブジェクトからフェッチ対象のリポジトリを取得 (getRepository) する。<br />
そのリポジトリオブジェクトに対し、 find, findAll, findBy などでデータを取得できる。<br />
<br />
<pre class="php" name="code">$product = $this->getDoctrine()
->getRepository('AcmeStoreBundle:Product')
->find($id);
</pre><br />
いろんな取得方法がある。<br />
<br />
<pre class="php" name="code">// IDからデータを取得
$product = $repository->find($id);
// 指定したカラムの値からデータを1つ取得
$product = $repository->findOneById($id);
$product = $repository->findOneByName('foo');
// 同様に、指定したカラムの値からデータを取得 (複数)
$products = $repository->findByPrice(19.99);
// 細かい検索条件を付ける場合は以下 (findOneByは1つ、findByは複数取得)
$product = $repository->findOneBy(array('name' => 'foo', 'price' => 19.99));
$product = $repository->findBy(
array('name' => 'foo'),
array('price' => 'ASC')
);
// 全て取得
$products = $repository->findAll();
// 自分でクエリーを生成することも簡単
$em = $this->getDoctrine()->getEntityManager();
$query = $em->createQuery(
'SELECT p FROM AcmeStoreBundle:Product p WHERE p.price > :price ORDER BY p.price ASC'
)->setParameter('price', '19.99');
$products = $query->getResult();
// クエリービルダーを使用することもできる (createQueryBuilder)
$repository = $this->getDoctrine()
->getRepository('AcmeStoreBundle:Product');
$query = $repository->createQueryBuilder('p')
->where('p.price > :price')
->setParameter('price', '19.99')
->orderBy('p.price', 'ASC')
->getQuery();
$products = $query->getResult();
</pre><br />
<br />
<h4 class="section_title2">オブジェクトのアップデートと削除</h4><br />
データをアップデート処理と削除処理について。<br />
ちなみに、update, delete, どちらも最後に flush() を呼ぶ必要があります。<br />
<br />
<pre class="php" name="code">public function updateAction($id)
{
// データを取得
$em = $this->getDoctrine()->getEntityManager();
$product = $em->getRepository('AcmeStoreBundle:Product')->find($id);
if (!$product) {
throw $this->createNotFoundException('No product found for id '.$id);
}
// データに値をセット
$product->setName('New product name!');
// データを更新
// $productの中身を変更して、そのまま flush() すれば更新される。(参照渡しでエンティティを取得しているっぽいね。)
// よって、persist() とかいちいち呼ぶ必要が無いです。
$em->flush();
// 削除はこうやる
$em->remove($product);
$em->flush();
return $this->redirect($this->generateUrl('homepage'));
}
</pre><br />
<br />
<h4 class="section_title2">カスタムなリポジトリクラスの作成</h4><br />
前述のように、自分でクエリーを作成 (createQuery) する場合を考える。そのとき、毎回同じコードをコントローラに記述する事になってしまうと煩雑になってしまう。そんなときは、自分でカスタムなリポジトリクラスを作成することで解決できる。<br />
<br />
まず、ProductRepository を使いますよーと、アノテーションで記載する。<br />
<pre class="php" name="code">// src/Acme/StoreBundle/Entity/Product.php
namespace Acme\StoreBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="Acme\StoreBundle\Repository\ProductRepository")
*/
class Product
{
//...
}
</pre><br />
....で、以下のコマンドを実行する<br />
<br />
<pre class="console_design1">php app/console doctrine:generate:entities Acme</pre><br />
そうすると、リポジトリクラスが作成される(以下)<br />
そこにfindAllOrderedByNameなどのカスタムなプログラムを書いてやる。これでOK。<br />
<br />
<pre class="php" name="code">// src/Acme/StoreBundle/Repository/ProductRepository.php
namespace Acme\StoreBundle\Repository;
use Doctrine\ORM\EntityRepository;
class ProductRepository extends EntityRepository
{
public function findAllOrderedByName()
{
return $this->getEntityManager()
->createQuery('SELECT p FROM AcmeStoreBundle:Product p ORDER BY p.name ASC')
->getResult();
}
}
</pre>ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-6084512520738504879.post-44965690888355771962011-10-17T15:04:00.002+09:002011-10-20T15:27:19.306+09:00Model (Doctrine) について①Doctrine は, PHPのORM (Object-relational mapping : オブジェクト指向言語におけるオブジェクトと、MySQLやPostgreSQLの様な、リレーショナルデータベースにおけるレコードとを対照させるもの) で、Symfonyで利用されている。<br />
<br />
詳しくは、<a href="http://symfony.com/doc/current/book/doctrine.html">Databases and Doctrine ("The Model")</a>を参照してください。<br />
<br />
<h4 class="section_title2">データベースの情報を設定</h4>まず、データベースに接続するためには, app/config/parameters.ini でホストなどを指定する。<br />
<br />
<pre class="xml" name="code">[parameters]
database_driver="pdo_mysql"
database_host="localhost"
database_name="hoge"
database_user="moge"
database_password="piyo"
</pre><br />
以下のコマンドを叩けば、app/config/parameters.ini の情報に基づいてデータベースを作成してくれる。<br />
<pre class="console_design1">php app/console doctrine:database:create
</pre><br />
<h4 class="section_title2">Entity Class の作成</h4>エンティティを、src/Acme/StoreBundle/Entity/ のような場所 (〇〇Bundle/Entity下) に作成する。(このクラス自体は、データを格納するだけ)<br />
<br />
まず、以下のコマンドを実行する。<br />
<pre class="console_design1">php app/console doctrine:generate:entity --entity="AcmeStoreBundle:Product" --fields="name:string(255) price:float description:text"
</pre><br />
すると、ORM情報をアノテーションとして設定されているエンティティクラスが作成される (以下)。<br />
また、Getter と Setter も用意してくれます。<br />
<br />
<pre class="php" name="code">// src/Acme/StoreBundle/Entity/Product.php
namespace Acme\DemoBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Acme\DemoBundle\Entity\Product
*
* @ORM\Table()
* @ORM\Entity
*/
class Product
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string $name
*
* @ORM\Column(name="name", type="string", length=255)
*/
private $name;
/**
* @var float $price
*
* @ORM\Column(name="price", type="float")
*/
private $price;
/**
* @var text $description
*
* @ORM\Column(name="description", type="text")
*/
private $description;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set name
*
* @param string $name
*/
public function setName($name)
{
$this->name = $name;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Set price
*
* @param float $price
*/
public function setPrice($price)
{
$this->price = $price;
}
/**
* Get price
*
* @return float
*/
public function getPrice()
{
return $this->price;
}
/**
* Set description
*
* @param text $description
*/
public function setDescription($description)
{
$this->description = $description;
}
/**
* Get description
*
* @return text
*/
public function getDescription()
{
return $this->description;
}
}
</pre><br />
ORM情報をYAML等のコンフィグファイルで設定したい場合は、--format=yml のオプションを加えることで可能。(その場合のコンフィグファイルは、src/Acme/StoreBundle/Resources/config/doctrine/Product.orm.yml となる)<br />
<br />
ちなみに、SQLのキーワードとなってる名前をフィールドにつけようとすると、エラーとなるらしい。その場合は、<br />
<pre class="php" name="code">/** @Column(name="`number`", type="integer") */
private $number;
</pre>のようにエスケープが必要らしいです。(<a href="http://www.doctrine-project.org/docs/orm/2.0/en/reference/basic-mapping.html#quoting-reserved-words">Reserved SQL keywords documentation</a> より)<br />
<br />
<br />
<h4 class="section_title2">テーブル/スキーマの作成</h4>次の以下のコマンドを実行すれば、自動的にテーブル/スキーマの作成を行なってくれる。<br />
<pre class="console_design1">php app/console doctrine:schema:update --force
</pre><br />
とりあえず、今回はココまでっ!!ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-6084512520738504879.post-25095635733247267262011-10-14T15:35:00.002+09:002011-10-14T15:40:00.130+09:00Twigに関するメモTwigに関して、少しメモを。<br />
<br />
<ul style="list-style: disc;"><li>テンプレートの継承が可能 (blocklタグ)</li>
<li><span class="Apple-style-span" style="color: magenta;">{{ ... }}</span>: 変数や式の結果を出力, {{ ... }} で出力されるものは、デフォルトでエスケープしてくれる</li>
<li><span class="Apple-style-span" style="color: magenta;">{% ... %}</span>: for ループや if 文等の、テンプレートのロジックを制御するタグ</li>
<li><span class="Apple-style-span" style="color: magenta;">{# ... #}</span> コメントを記述できる</li>
<li><span class="Apple-style-span" style="color: magenta;">{{ path('_demo_hello' }}</span> のようにして、routing configrationに基づいてパスを記述できる</li>
<li><span class="Apple-style-span" style="color: magenta;">url 関数</span>は絶対 URL を生成</li>
<li>画像やcssなどを読み込む際は、<span class="Apple-style-span" style="color: magenta;">{{ asset('css/blog.css') }}</span> などとすることで、アセットを簡単に扱える</li>
</ul>ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-6084512520738504879.post-82137419068510336082011-10-13T20:37:00.002+09:002011-10-13T22:11:10.621+09:00Viewの作成方法ビューについて少し。<br />
<br />
まず、全体のレイアウトは、<span class="Apple-style-span" style="color: orange;">app/Resources/views/</span> の中に layout.html.twig で、<br />
ページ毎に異なる部分は、moge<span class="Apple-style-span" style="color: orange;">Bundle/Resources/views/</span>の中で hello.html.twig で記述。<br />
<br />
<br />
Twig には、テンプレートの継承機能があり、<br />
<br />
layout.html.twigで以下のように書いたとし、<br />
<pre class="html" name="code"><!-- layout.html.twig -->
{% block title %}Layout{% endblock %}
</pre><br />
継承先のhello.html.twigで、<br />
<pre class="html" name="code"><!-- hello.html.twig -->
{% block title %}Hello{% endblock %}
</pre><br />
とすることで、titleブロックのオーバーライドが可能。<br />
<br />
ちなみに、デフォルトで存在するレイアウトファイルの中身は以下のようになってる。<br />
<br />
<pre class="html" name="code"><!-- base.html.twig -->
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>{% block title %}Welcome!{% endblock %}</title>
{% block stylesheets %}{% endblock %}
<link rel="shortcut icon" href="{{ asset('favicon.ico') }}" />
</head>
<body>
{% block body %}{% endblock %}
{% block javascripts %}{% endblock %}
</body>
</html></pre><br />
つまり、これを継承して、title, body, javascripts 等のブロックをオーバーライドすれば、OKっぽい。<br />
おもしろい〜。<br />
<br />
ちなみに、Twig は、デフォルトですべての出力をエスケープしてくれるらしいです。ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-6084512520738504879.post-37658800614904123672011-10-13T20:11:00.000+09:002011-10-13T20:11:23.352+09:00Twig Bundle for TextmateTwigのTextmate Bundleを作成されている方がいたので、一応紹介。<br />
<br />
<a href="https://github.com/Anomareh/PHP-Twig.tmbundle">Anomareh / PHP-Twig.tmbundle</a><br />
<br />
Twig用のタグを出力してくれるものです。でも、自分は使わないかな〜。ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-6084512520738504879.post-70719751859608961692011-10-13T18:08:00.001+09:002011-10-13T19:57:58.367+09:00symfony2 - ページ作成の流れのおさらいversion : 2.0.4<br />
<br />
もう少し詳しい情報は、<a href="http://symfony2-gf.blogspot.com/2011/10/symfony2-report2.html">独学Symfony2 : report2</a> にもあります。<br />
<br />
まず, Symfony2でのページ作成は, 以下のSTEPで成り立っている。<br />
<div class="solidFrame1">◯ Bundleの作成<br />
① Create a route : リクエストのURIから, 対応するコントローラーを指定するための Routing 情報を決める<br />
② Create a controller : リクエストを処理し, 応答を返すための Controller の部分を作成<br />
③ Create a template : テンプレートの作成</div><br />
<h4 class="section_title1">Bundleの作成</h4><br />
<h5 class="innersection_title1">Bundleの作成</h5>AcmeStudyBundleを作成<br />
<pre class="console_design1">php app/console generate:bundle --namespace=Acme/HelloBundle --format=yml</pre>ちなみに, このコマンドを使用しない場合は, 自分でディレクトリやAcmeStudyBundle.phpなどを作成する必要がある。<br />
また、このコマンドを使用して、AppKernelに自動で追加もできます。今回はこれで作成。<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdgMMxBnlgD-sBOEhEsFHXWCeYtmJUhrGvJGoIGgnYSbQ33LzqKU6ppRtn1EaaFWG7xg7Z6JtbZ7DeP7hokTLqIgyU2QJlzh0XxxLamJGR_n7La6OwpUqNiwgaz8N-fayUvepmU589Q6Y/s1600/IMG_generate_bundle.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdgMMxBnlgD-sBOEhEsFHXWCeYtmJUhrGvJGoIGgnYSbQ33LzqKU6ppRtn1EaaFWG7xg7Z6JtbZ7DeP7hokTLqIgyU2QJlzh0XxxLamJGR_n7La6OwpUqNiwgaz8N-fayUvepmU589Q6Y/s200/IMG_generate_bundle.png" width="153" /></a></div><br />
<h4 class="section_title1">Route の作成</h4><span class="Apple-style-span" style="color: #bf9000;">app/config/routing.yml</span> にルーティング情報を追加<br />
routeに, /hello/{name} というパターンに対して AcmeStudyBundle:Hello:index が呼ばれるように設定する。<br />
<br />
以下のようにして、routingファイルをインポートして使用できる (コマンドでBundleを作成した場合は、勝手にインポートの記述を追加してくれます。便利。)<br />
<pre class="xml" name="code"># app/config/routing.yml
AcmeHelloBundle:
resource: "@AcmeHelloBundle/Resources/config/routing.yml"
prefix: /
</pre><br />
<pre class="xml" name="code"># src/Acme/HelloBundle/Resources/config/routing.yml
hello:
pattern: /hello/{name}
defaults: { _controller: AcmeHelloBundle:Hello:index }
</pre><br />
<br />
<h4 class="section_title1">Controller の作成</h4>routeに, /hello/{name} というパターンに対して AcmeStudyBundle:Hello:index が呼ばれるように設定する(詳細はドキュメント見てね!)<br />
<br />
Routingの設定により、/hello/{name} でアクセスすると, AcmeStudyBundle の HelloController の indexAction が呼ばれる。<br />
<br />
<h4 class="section_title1">View の作成</h4><br />
最後に、アクションに対するビューを作成。どのビューが呼ばれるかは、indexActionに記述されている通り。<br />
ちなみに、Twigはテンプレートの継承が可能なのでスゴイおもしろい!笑<br />
<br />
<br />
<br />
以上が基本的な流れ。ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-6084512520738504879.post-45477026328496071052011-10-12T21:21:00.001+09:002011-10-12T21:21:23.195+09:00独学Symfony2 : memo コーディング規則<a href="http://docs.symfony.gr.jp/symfony2/contributing/code/standards.html">http://docs.symfony.gr.jp/symfony2/contributing/code/standards.html</a><br />
<br />
にコーディング規則がのってました!しかも日本語訳で!<br />
ということでメモ〜ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-6084512520738504879.post-89891106787990589032011-10-12T21:20:00.003+09:002011-10-12T21:20:59.091+09:00独学Symfony2 : report4version : BETA3 (正式リリース後, 改変の可能性あり)<br />
<br />
今回は <a href="http://symfony.com/doc/current/book/controller.html">Controller</a> について。<br />
<br />
ここらへんからは, ドキュメントを読むよりもソースを実際に書いてやっていくほうが勉強になるだろうってことで、要所要所しか説明しない予定です(めんどうだし。。笑)<br />
<br />
<br />
<h4 class="section_title1">routing と コントローラー引数</h4><br />
ドキュメントと同じルーティング情報で説明する。<br />
<br />
<div class="solidFrame1">hello:<br />
pattern: /hello/{first_name}/{last_name}<br />
defaults: { _controller: AcmeHelloBundle:Hello:index, <span class="Apple-style-span" style="color: #38761d;">color: green</span> }</div>というrouting 設定だとする。この場合, HelloControllerのindexActionが呼ばれるということは, もう明らかである。<br />
そして, first_nameとlast_nameが引数に与えられることもわかる。この引数についてちょっと詳しく見てみる。<br />
<br />
<div class="dottedFrame1"><ul><li style="margin: 0 0 10px 0;"><span class="Apple-style-span" style="color: #38761d;">color:green</span> の記述のために, $color 引数も与えられる。<br />
function ($first_name, $last_name, $color)<br />
</li>
<li style="margin: 0 0 10px 0;">引数の順番は関係ない!<br />
function ($first_name, $last_name, $color) でも, function ($last_name, $color, $first_name) でも同じこと<br />
逆に言えば, /hello/{first_name}/{last_name} とルーティングで設定したら, 変数は $first_name と $last_name になるってこと。<br />
</li>
<li style="margin: 0 0 10px 0;">function ($first_name, $last_name, $color, $foo) のように, ドコにも定義していない $foo はダメ!<br />
ただ, デフォルト引数にして、function ($first_name, $last_name, $color, $foo = "foo") のようにすればOK<br />
</li>
<li style="margin: 0 0 10px 0;">function ($first_name, $color) のように, 変数が無い($last_name)場合でも問題ない<br />
</li>
</ul></div><br />
<br />
<br />
<h4 class="section_title1">コントローラーの一般タスク</h4><table class="table_design1"><tr> <td>Redirecting</td><td>URLのリダイレクト<br />
<pre name="code" class="php">return new RedirectResponse($this->generateUrl('hello', array('name' => 'Lucas')));
</pre>※ generateUrlは router サービスの generateUrl のショートカット<br />
</td></tr>
<tr> <td>Forwarding</td><td>処理を他のコントローラーにデリゲートする<br />
<pre name="code" class="php">$response = $this->forward('コントローラ指定', array(パラメータ));
return $response;</pre>これで, 指定したコントローラの 〇〇Action(パラメータ) が実行される。<br />
※ これは httpKernel サービスの forward のショートカット<br />
</td> </tr>
<tr> <td>Rendering Templates</td><td>テンプレートのレンダリング<br />
<pre name="code" class="php">$content = $this->renderView('テンプレート', array(渡すパラメータ));
return new Response($content);
</pre>renderViewはtemplatingサービスのrenderメソッドのショートカット<br />
これを簡単にかくと<br />
<pre name="code" class="php">return $this->render('テンプレート', array(渡すパラメータ));
</pre>で良い。<br />
</td> </tr>
<tr> <td>Accessing other Services</td><td>他のサービスを利用<br />
<pre name="code" class="php">$service = $this->get('サービス名');
</pre>とすることで、他のサービスが使用可能。例として, request, response, templating, router, mailer がある。<br />
</td> </tr>
</table><br />
<br />
<h5 class="innersection_title1">requestサービス</h5><br />
requestサービスを使うと, セッションを扱ったり POST, GETの値を取得したりできる。<br />
<pre name="code" class="php">$request = $this->get('request'); // サービス取得
$session = $request->getSession(); // セッションオブジェクトの取得
// ちなみに, セッションオブジェクトの取得は, $session = $this->get('session'); でもよさげ。
$session->set('key','value'); // セッションに保存
$session->get('key'); // セッションから値取得
$request->isXmlHttpRequest(); // Ajaxリクエストかどうか
$request->query->get('page'); // GETパラメータの取得
$request->request->get('page'); // POSTパラメータの取得
</pre><br />
<br />
<br />
まぁ、こんな感じでSymfonyの基礎の基礎を学びました。あとは実際に作成しながら、要所要所書いていく形にします。ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-6084512520738504879.post-61880719388477686682011-10-12T21:20:00.001+09:002011-10-12T21:20:40.967+09:00独学Symfony2 : report3version : BETA3 (正式リリース後, 改変の可能性あり)<br />
<br />
今回も, ドキュメント的には <a href="http://symfony.com/doc/current/book/page_creation.html">Creating Pages in Symfony2</a> の続きになります。<br />
<br />
<h5 class="innersection_title1">Symfony2プロジェクトの構造</h5><br />
一応, 基本的なSymfony2プロジェクトのディレクトリ構造は, 名前かも判るように<br />
<div class="solidFrame1">Symfony2プロジェクトのディレクトリ構造<br />
<ul><li>app/: アプリケーションのコンフィグファイルを含む</li>
<li>src/: 作成するソースなどはここに格納</li>
<li>vendor/: 様々なvendorファイルを置く場所</li>
<li>web/: 公開ディレクトリ, img, css, js などといったのはココ, あとフロントコントローラもここ!</li>
</ul></div>という感じ。<br />
<br />
ちなみに, プロジェクトを公開するときは, web/ のフロントコントローラにおいて, <br />
<pre name="code" class="php">$kernel = new AppKernel('prod', true);
</pre>dev環境では見れても, 上記のようにprod環境をtrueにしていないと、prodには反映されないので注意!<br />
(一度prodで実行すると キャッシュが作成され, 以後はそのキャッシュで動くっぽいな。たぶん。)<br />
<br />
また, prod 環境の場合, 速度のための最適化が行われ, そのためにキャッシュを作成するようになっている。そのため, もしprodの環境を変更した場合は, 以下のコマンドを実行すること!<br />
<br />
<pre class="console_design1">rm -rf app/cache/*
</pre><br />
<br />
<h5 class="innersection_title1">Bundleの構造</h5><br />
そして Symfony2 のアプリケーションは, Bundle によって構成されている。この Bundle のディレクトリ構造は以下のようになっている。<br />
<div class="solidFrame1">Bundle のディレクトリ構造<br />
<ul><li>Controller/ : Bundleのコントローラを格納</li>
<li>Resources/config/ : コンフィグレーションファイルを格納 (routing.yml などもここに入れます)</li>
<li>Resources/views/ テンプレートファイルを置く (コントローラー名/テンプレート名 という形式で)</li>
<li>Resources/public/ webディレクトリにシンボリックリンクが作成されるので, ここに img, css, js を置ける</li>
<li>Tests/ Bundleのテストをするためのもの</li>
</ul></div><br />
<br />
<h5 class="innersection_title1">アプリケーションの設定</h5><br />
app/config/を見ると, config.yml だけでなく, config_[prod,dev,text].yml といったように, それぞれの環境に対するコンフィグレーションファイルが存在する。<br />
まず初めに config.ymlが呼ばれ(これは必ず呼ばれる), その後に, AppKernelクラスの registerContainerConfiguration で, 環境に応じた config_[prod,dev,text].yml が呼ばれる。<br />
これにより, 環境に柔軟な設定が可能。<br />
<br />
<br />
ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-6084512520738504879.post-41523857300266220312011-10-12T21:19:00.003+09:002011-10-12T21:19:56.449+09:00独学Symfony2 : report2version : BETA3 (正式リリース後, 改変の可能性あり)<br />
<br />
<a href="http://symfony.com/doc/current/book/from_flat_php_to_symfony2.html">When Flat PHP meets Symfony</a> では, FrameWorkを使うことに利点みたいなのを書いていますので, 初めてFrameWorkなるものを使用して開発する!という場合は読んだほうが良いでしょう。(日本語ドキュメントもありました。)<br />
ただ、ここではこの章は省略します。<br />
<br />
ということで, <a href="http://symfony.com/doc/current/book/page_creation.html">Creating Pages in Symfony2</a> を読んでいきます。<br />
(訳というよりも解説なんで、よろしくですw)<br />
<br />
<br />
まず, Symfony2でのページ作成は, 以下のSTEPで成り立っている。<br />
<div class="solidFrame1">◯ Bundleの作成<br />
① Create a route : リクエストのURIから, 対応するコントローラーを指定するための Routing 情報を決める<br />
② Create a controller : リクエストを処理し, 応答を返すための Controller の部分を作成<br />
③ Create a template : テンプレートの作成<br />
</div><br />
ということで、実際にマニュアルに従って作成してみる<br />
<br />
<h4 class="section_title1">Bundleの作成</h4><br />
<h5 class="innersection_title1">Bundleの作成</h5>ページ作成を始める前に, まず Bundle というものを作成する必要がある。(Bundleってのは, プラグイン的な物で, Symfony2の中の要素は全て Bundle であるらしい)<br />
で, 作成するには以下のコマンドを実行すれば良い。ちなみに, 以下のコマンドで Cannot write to cache folder みたいなエラーが出たら, cacheフォルダの権限がおかしいので, chmod -R 777 cache してやってね!<br />
<br />
<pre class="console_design1">php app/console init:bundle "Acme\StudyBundle" src
</pre><br />
で, このコマンドの出力結果は以下のようなものだった。<br />
<div class="console_output1">Summary of actions<br />
<span class="Apple-style-span" style="color: #e69138;">- The bundle "AcmeStudyBundle" was created at "src/Acme/StudyBundle" and is using the namespace "Acme\StudyBundle".</span><br />
- The bundle contains a sample controller, a sample template and a sample routing file.<br />
<br />
Follow-up actions<br />
- Enable the bundle inside the AppKernel::registerBundles() method.<br />
Resource: http://symfony.com/doc/2.0/book/page_creation.html#create-the-bundle<br />
- Ensure that the namespace is registered with the autoloader.<br />
Resource: http://symfony.com/doc/2.0/book/page_creation.html#autoloading-introduction-sidebar<br />
- If using routing, import the bundle's routing resource.<br />
Resource: http://symfony.com/doc/2.0/book/routing.html#including-external-routing-resources<br />
- Starting building your bundle!<br />
Resource: http://symfony.com/doc/2.0/book/page_creation.html#the-hello-symfony-page</div><br />
で, この出力にあるように , 実際に見てみると src/Acme/StudyBundle が作成されています。<br />
ちなみに作成されたディレクトリ構造は以下.<br />
<br />
<div class="dottedFrame1" style="font-size: 12px;"><span class="Apple-style-span" style="color: #6fa8dc;">StudyBundle/</span><br />
AcmeStudyBundle.php<br />
<span class="Apple-style-span" style="color: #6fa8dc;">Controller/</span><br />
DefaultController.php<br />
<span class="Apple-style-span" style="color: #6fa8dc;">Resources/</span><br />
<span class="Apple-style-span" style="color: #6fa8dc;">config/</span><br />
routing.yml<br />
<span class="Apple-style-span" style="color: #6fa8dc;">view/</span><br />
<span class="Apple-style-span" style="color: #6fa8dc;">Default/</span><br />
index.html.twig</div><br />
ちなみに, このコマンドを使用しない場合は, 自分でディレクトリやAcmeStudyBundle.phpなどを作成する必要があります(ドキュメント同ページの Creating a Bundle を参照してください)<br />
<br />
<br />
<h5 class="innersection_title1">app/autoload.phpを確認</h5>app/autoload.php に, 以下の記述を追加することで, ネームスペースがロードされることを確認<br />
<pre class="php" name="code">$loader->registerNamespaces(array(
'Acme' => __DIR__.'/../src',
));
</pre><br />
<h5 class="innersection_title1">AppKernel classを確認</h5>$registerBundles というメソッドに, Bundle を追加することで, Bundle の初期化を行う。<br />
( $bundle に, new Acme\StudyBundle\AcmeStudyBundle(), を追加する)<br />
<br />
<br />
<br />
<h4 class="section_title1">Route の作成</h4><span class="Apple-style-span" style="color: #bf9000;">app/config/routing.yml</span> に, ルーティング情報を追加する。xmlでも, PHPでも良いらしいけど, デフォルトではYAMLであったため, YAMLでやっていきます!<br />
<br />
<div class="dottedFrame1">※ routing.yml のインポートも可能! css のインポートみたく @ を付けて<br />
resource: "@AcmeStudyBundle/Resources/config/routing.yml"<br />
のようにする!</div><br />
routeの詳細は後日ってことで。<br />
<br />
<br />
<h4 class="section_title1">Controller の作成</h4>routeに, /hello/{name} というパターンに対して AcmeStudyBundle:Hello:index が呼ばれるように設定する(詳細はドキュメント見てね!)<br />
<br />
そうしたとき, /hello/{name} でアクセスすると, <span class="Apple-style-span" style="color: #b45f06;">AcmeStudyBundle の HelloController の indexAction</span> が呼ばれるわけである。そしてindexActionの引数に$nameが渡される。<br />
<br />
<br />
<div class="dottedFrame1">use Symfony\Bundle\FrameworkBundle\Controller\Controller;<br />
を使用することで, テンプレートを使用してページを作成できる。ちなみに, ビューは Twig テンプレートが基本らしいですね。<br />
そのテンプレートの配置方法は以下の様にすればいいっぽい (twigを使用することを前提としてます)<br />
<br />
<br />
<span class="Apple-style-span" style="color: #674ea7;">#コンテンツ部分 : src/[Bundle]/Resources/views/[コントローラー名]/[アクション名].html.twig</span><br />
例 ) src/Acme/StudyBundle/Resources/views/Hello/index.html.twig<br />
※ このビューファイルから, {% extends '::layout.html.twig' %} などとして, ↓ のレイアウトを指定するっぽいです。<br />
<br />
<span class="Apple-style-span" style="color: #674ea7;">#レイアウト部分 : app/Resources/views/[レイアウト名].html.twig</span> (cakePHPでいう, views/layout/*.ctpのこと)<br />
例 ) app/Resources/views/layout.html.twig</div><br />
controllerについてやviewについての詳細はここでは説明しません。。ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-6084512520738504879.post-1720828515544882792011-10-12T21:19:00.001+09:002011-10-12T21:19:30.944+09:00独学Symfony2 : report1version : BETA3 (正式リリース後, 改変の可能性あり)<br />
<br />
とりあえず、Symfony2の勉強をしようと, ちょいドキュメントを読んでます。<br />
そのまとめというか、訳というか。実際のページ作成とかは, まず触ってみたいので, ドキュメントのまとめより、自分なりに触った際の解説をしていこうかと。。<br />
<br />
<a href="http://symfony.com/doc/current/book/http_fundamentals.htm">Symfony2 and HTTP Fundamentals</a>l<br />
<br />
Symfony2のアプリケーションの, 要求~応答までの流れとしては,<br />
<div class="dottedFrame1">① リクエストはまず FrontController なるものに処理され, SymfonyKernelの部分へと渡される。<br />
② そこで Routing 機能により, 要求されたURIから適切な Controller が選ばれる。<br />
③ その Controller が呼ばれ, ユーザーに応答を返す<br />
</div>という感じになっているようです。(まぁ, Cakephp も似たような感じだよね。)<br />
<br />
<br />
<h4 class="section_title1">Symfony2 Components について</h4>Symfonyには20以上の多くのComponentが存在します。<br />
おそらく, /vendor/symfony/src/Symfony/Component/* にあるやつかな。(ちなみに21つありました。)<br />
<br />
このページで説明していたのは以下のもの<br />
<br />
<table class="table_design1"><tr> <th>コンポーネント名</th> <th>説明</th> </tr>
<tr> <td>HttpFoundation</td> <td>HTTP要求/応答, また, セッションやファイルアップロードなどのクラスを含む</td> </tr>
<tr> <td>Routing</td> <td>リクエストのURIを処理するためのもの</td> </tr>
<tr> <td>Form</td> <td>フォーム作成や, フォームの送信データを扱うためのもの</td> </tr>
<tr> <td>Validation</td> <td>バリデーションのためのクラス (まぁ、名前のとおりですよね(全部名前の通りなんですがw))</td> </tr>
<tr> <td>ClassLoader</td> <td>クラスのロードを自動的に行うためのもの (Cakeでいう, ClassRegistry みたいなやつかな? まだよくわから〜ん)</td> </tr>
<tr> <td>Templating</td> <td>テンプレートのレンダリングに関する処理を扱うためのクラス</td> </tr>
<tr> <td>Security</td> <td>アプリケーション内部のセキュリティを扱うためのもの</td> </tr>
<tr> <td>Translation</td> <td>翻訳のためのもの</td> </tr>
</table><br />
また, すべてのコンポーネントは切り離されているため, Symfony2 フレームワークを使用していないプロジェクトでも、使用できるようになっているらしいです。ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-6084512520738504879.post-70210827865074009952011-10-12T21:18:00.002+09:002011-10-12T21:18:50.227+09:00独学Symfony2 : report0 [インストール]version : BETA3 (正式リリース後, 改変の可能性あり)<br />
<br />
<br />
2011年6月4日のSymfony2勉強会に向けて, Symfony2 standard ディストリビューションのインストールを行ったので, そのメモを。<br />
ちなみに OS は Mac OS X 10.6 です。<br />
<br />
とりあえずgitとAPCのインストール<br />
<br />
<span class="Apple-style-span" style="color: #b45f06;">① まず, homebrewをインストールします</span><br />
<div style="background: #4f4e56; color: white; padding: 5px;">ruby -e "$(curl -fsSL https://gist.github.com/raw/323731/install_homebrew.rb)"</div><br />
<br />
<span class="Apple-style-span" style="color: #b45f06;">② git のインストール</span><br />
<div style="background: #4f4e56; color: white; padding: 5px;">brew install git</div><br />
<br />
<span class="Apple-style-span" style="color: #b45f06;">③ homebrewのアップデート</span><br />
brew update を行うのだが, このコマンドでエラーが生じて途中で止まってしまったため, 以下を実行<br />
<div style="background: #4f4e56; color: white; padding: 5px;">$ cd /usr/local/<br />
$ git remote add origin git://github.com/mxcl/homebrew.git<br />
$ git fetch origin<br />
$ git reset --hard origin/master</div><br />
そして, homebrewをアプデ!! (ちなみに, ② のgitインストールは, ここで必要っぽい)<br />
<div style="background: #4f4e56; color: white; padding: 5px;">brew update</div><br />
<span class="Apple-style-span" style="color: #b45f06;">④ Symfony2でAPC(Alternative PHP Cache) があるとよいので, APCをインストール</span><br />
<div style="background: #4f4e56; color: white; padding: 5px;">brew install apc</div><br />
ちなみに, この時の出力は以下 (青字の部分は, あとでphp.iniの最後に追記すること)<br />
<br />
<div style="border: 1px dotted #999999; font-size: 10px; padding: 11px;">To finish installing APC:<br />
* Add the following lines to php.ini:<br />
<span class="Apple-style-span" style="color: #0b5394;">[apc]</span><br />
<span class="Apple-style-span" style="color: #0b5394;">extension="/usr/local/Cellar/apc/3.1.6/apc.so"</span><br />
<span class="Apple-style-span" style="color: #0b5394;">apc.enabled=1</span><br />
<span class="Apple-style-span" style="color: #0b5394;">apc.shm_segments=1</span><br />
<span class="Apple-style-span" style="color: #0b5394;">apc.shm_size=64M</span><br />
<span class="Apple-style-span" style="color: #0b5394;">apc.ttl=7200</span><br />
<span class="Apple-style-span" style="color: #0b5394;">apc.user_ttl=7200</span><br />
<span class="Apple-style-span" style="color: #0b5394;">apc.num_files_hint=1024</span><br />
<span class="Apple-style-span" style="color: #0b5394;">apc.mmap_file_mask=/tmp/apc.XXXXXX</span><br />
<span class="Apple-style-span" style="color: #0b5394;">apc.enable_cli=1</span><br />
* Restart your webserver<br />
* Copy "/usr/local/Cellar/apc/3.1.6/apc.php" to any site to see APC's usage.<br />
==> Summary<br />
/usr/local/Cellar/apc/3.1.6: 2 files, 204K, built in 17 seconds</div><br />
<br />
<span class="Apple-style-span" style="color: #b45f06;">⑤ 次にとうとうSymfony2をダウンロード!</span><br />
<br />
symfony sandbox というものがあるらしく , git で 入れても良いのだが, Symfony2 standard ディストリビューション ということで, ちょっとよくわからなかった。ただ、勉強会ではSymfony2(Standard Edition)のインストール方法 等を学ぶということで, とりあえず <a href="http://symfony.com/download">http://symfony.com/download</a> からダウンロードしたものを使用した。<br />
<br />
まぁ, これを展開するだけです。<br />
<br />
<span class="Apple-style-span" style="color: #b45f06;">⑥ app/check.php にアクセスし, 正しくインストールされているか確認</span><br />
例として, 以下のような感じです。<br />
<br />
<div class="separator" style="clear: both; text-align: left;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYJ7ilAUYNmPlZJoc9mUCI7WLQCMycjLSfM3djcr16WBzZyd-som3TEPe94zVRqzKpQgQHTw8auFmzE_a1FuEDho1rTlC9jWToak0TfZ1EN2u-V-dT0APkmaDcOycIC-es30Q2OGFeUZo/s1600/symfony2_check.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="219" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYJ7ilAUYNmPlZJoc9mUCI7WLQCMycjLSfM3djcr16WBzZyd-som3TEPe94zVRqzKpQgQHTw8auFmzE_a1FuEDho1rTlC9jWToak0TfZ1EN2u-V-dT0APkmaDcOycIC-es30Q2OGFeUZo/s320/symfony2_check.png" width="320" /></a></div><br />
<br />
<span class="Apple-style-span" style="color: #b45f06;">⑦ インストールできていれば, web/ ディレクトリをDocumentRootにする。</span><br />
これは apache の方の設定ですね。<br />
<br />
<br />
<br />
<span class="Apple-style-span" style="color: #b45f06;">⑧ .....ということだけど, intlが無いって言われてしまったので, intlモジュール入れました!</span><br />
<br />
<div style="background: #4f4e56; color: white; padding: 5px;">brew install icu4c<br />
</div><br />
php-5.3.6 をダウンロードし, その中の ext/intlに移動し以下のコマンドを実行<br />
<div style="background: #4f4e56; color: white; padding: 5px;">phpize<br />
./configure --enable-intl --with-icu-dir=/usr/local/Cellar/icu4c/4.4.1<br />
make<br />
make test<br />
sudo make install.<br />
</div><br />
php.ini に, extension=intl.so を追記し, apache再起動<br />
<br />
<br />
これでOKかな?大変だった〜。<br />
<br />
<br />
参考にさせて頂いたサイトは以下<br />
・ <a href="http://d.hatena.ne.jp/Kiske/20101118/1290031924">Symfony2勉強会向けのセットアップ準備(Mac向け)</a><br />
・ <a href="http://d.hatena.ne.jp/z3100/20110501/1304248529">Homebrewのupdateでエラー</a>ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0tag:blogger.com,1999:blog-6084512520738504879.post-23287202234204982582011-10-12T20:39:00.000+09:002011-10-12T20:39:27.360+09:00ブログ開設〜<a href="http://michelle-gf.blogspot.com/">Dev.GrAFR</a> の方でも、少し書いてたけど、しょっと本格的にSymfony2を使うことになってきたので、専用にSymfony2用の開発ブログを解説しましたー(^^)ゆちゃんhttp://www.blogger.com/profile/12754048020092995283noreply@blogger.com0