-
Notifications
You must be signed in to change notification settings - Fork 0
/
atom.xml
1095 lines (856 loc) · 117 KB
/
atom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>kumamidori blog</title>
<link href="http://kumamidori.github.io/" rel="self"/>
<link href="http://kumamidori.github.io"/>
<updated>2014-11-27T23:52:53+09:00</updated>
<id>http://kumamidori.github.io</id>
<author>
<name>kuma_nana</name>
<email>[email protected]</email>
</author>
<entry>
<title>PHPUnit tests in Eclipse - MakeGood, Luna and Composer -</title>
<link href="http://kumamidori.github.io/php/2014/11/24/makegood_composer"/>
<updated>2014-11-24T00:00:00Z</updated>
<id>http://kumamidori.github.io/php/2014/11/24/makegood_composer</id>
<content type="html">
<h2 id="phpunit-tests-in-eclipse---makegood-luna-and-composer--">PHPUnit tests in Eclipse - MakeGood, Luna and Composer -</h2>
<p><a href="https://github.com/piece/makegood">MakeGood</a> is a continuous test runner to run unit tests on Eclipse PDT.</p>
<h3 id="environment">Environment</h3>
<ul>
<li>Mac 10.9 Maverics</li>
<li>PHP : 5.6 (Liip binary), Xdebug enabled</li>
<li>Eclipse for PHP Developers, Luna Service Release 1 (4.4.1)</li>
<li>MakeGood</li>
<li><strong>PHPUnit 4 via project’s composer (local install)</strong></li>
</ul>
<h3 id="configure-eclipse-project---properties">Configure Eclipse (Project - [properties])</h3>
<h4 id="makegood">MakeGood</h4>
<ul>
<li>[General]</li>
</ul>
<p>[Add] your [Test Folders].
Set the [Preload Script] to your bootstrap file.</p>
<p>Example:</p>
<p><code>
[Test Folders] your-project_path/src,
[Preload Script] bootstrap_test.php
</code></p>
<p><img src="/assets/images/201411/1_properties_makegood_general.png" /></p>
<ul>
<li>[PHPUnit]</li>
</ul>
<p>Set the path to the phpunit xml file under the PHPUnit tab.</p>
<p><img src="/assets/images/201411/2_properties_makegood_phpunit.png" /></p>
<h4 id="php---build-path">PHP - [Build Path]</h4>
<p>Your project path.</p>
<p><img src="/assets/images/201411/3_properties_buildpath.png" /></p>
<h3 id="and-youre-done">And you’re DONE!</h3>
<p>Everything should be ready now.
If you can’t see the MakeGood tab already, browse to Window &gt; Show View &gt; MakeGood.</p>
<p><img src="/assets/images/201411/5_makegood-show-view1.png" /></p>
<p><img src="/assets/images/201411/6_makegood-show-view2.png" /></p>
<p>… and see the results …</p>
<p><img src="/assets/images/201411/7_phpunit_results.png" /></p>
<p>Happy TDD-ing♪</p>
<h3 id="links">Links</h3>
<ul>
<li><a href="https://github.com/piece/makegood">MakeGood (Github wiki)</a></li>
<li><a href="http://blog.loftdigital.com/running-phpunit-tests-in-eclipse-pdt">Running PHPUnit tests in Eclipse PDT - blog.loftdigital.com</a></li>
</ul>
</content>
</entry>
<entry>
<title>発表スライドリンクなど</title>
<link href="http://kumamidori.github.io/diary/2014/10/27/dddosaka_lt_speaker"/>
<updated>2014-10-27T00:00:00Z</updated>
<id>http://kumamidori.github.io/diary/2014/10/27/dddosaka_lt_speaker</id>
<content type="html">
<p>もう年末年始の帰省予定も決まったので、気分は年末です。</p>
<p>DDD読書会の記録をここに書いていなかったので書こうと。
大苦手な発表を3回やりました。最初の発表は、「内容が無い、ダメだこれは・・・」と自分で思いながらだったけど、それが、大変貴重な良い学習機会、きっかけとなりました。後の2回の発表は、丁寧に調べながら書いた資料で、内容自体は気に入っています(肝心のしゃべりの方はいつも本当に本当にひどくてごめんなさい)。下にリンクを貼っておきます。</p>
<p>今後は自分のGithubの方に何か置いていけたら良いな、と思っているものの、土曜日はひたすら眠り続けていることが多くて、あんまりはかどっていません・・・。</p>
<p>来年もまた、設計の勉強会、読書会のようなものをやれたらと。企画も少し具体化しました。詳細が決まったら告知を出します。でも、DDDの時みたいに10人以上来るような形ではなくて、ごくこじんまりで、というイメージです。</p>
<h3 id="section">発表資料リンク</h3>
<ul>
<li><a href="http://www.slideshare.net/kumamidori/dddvol1-37609362">8/3大阪DDD読書会ワークショップvol.1ガイダンス</a></li>
<li><a href="http://www.slideshare.net/kumamidori/140921-dddosaka-lttalk">9/21DSLを学ぶ - 設定式によるルールの表現を試す -</a></li>
</ul>
</content>
</entry>
<entry>
<title>大阪DDD読書会vol.5、「モデル駆動設計」前半、復習メモ</title>
<link href="http://kumamidori.github.io/ddd/2014/04/27/ddd_osaka_vol5_modeling"/>
<updated>2014-04-27T00:00:00Z</updated>
<id>http://kumamidori.github.io/ddd/2014/04/27/ddd_osaka_vol5_modeling</id>
<content type="html">
<p>4/19に大阪DDD読書会vol.5で、第2章「コミュニケーションと言語の使い方」後半から第3章「モデルと実装を結びつける」の前半まで読みました。
(公式レポートWikiは<a href="https://github.com/dddosaka/reading_ddd_report/wiki/vol5_20140419">こちら</a>)。</p>
<p>感想や復習メモをつらつらと書いていきます。</p>
<h3 id="section">モデル駆動設計について</h3>
<h4 id="section-1">「モデルを使っていく」とはどういうことか?</h4>
<p>本の中で</p>
<blockquote>
<p>荷受け地や荷出し地などがあって、これらを全部[経路選択サービス]に与えると、
必要なものがすべて揃った[輸送日程]が戻ってくる。</p>
</blockquote>
<p>という説明と</p>
<blockquote>
<p>[経路選択サービス]は、[経路仕様]を満たしている[輸送日程]を見つける。</p>
</blockquote>
<p>という表現を比べて、後者が簡潔だ、という話が出てきます。</p>
<p>モデリング作業として、実際にテストコードを書いて実行してみるまでもなく、ただ言葉にしてみるだけで、ある程度試していくことができるわけです。「モデル駆動設計」という言葉の響きは難しく聞こえるけれど、想像していたよりもずっと簡単なことを言っている?</p>
<h3 id="section-2">ユビキタス言語、ドメインモデル、コードを結びつけるアプローチとして、既存で近いことができるツールには何があるか?</h3>
<p>「手で用語集やモデル図を直すなんて、やってられない。ツールを使うことになるのでは」という話です。</p>
<h4 id="section-3">コードからのドキュメント生成</h4>
<p>昔からある。たとえばコメントからドキュメントを生成するJavaDocのようなもの。</p>
<p>イメージが沸きにくかったので、PHPメンターズさんの公開されている
<a href="http://phpmentors.jp/post/54317035667/symfony2-ddd-specification-sample" target="_blank">「Symfony2 ベースのサンプル」</a>をお借りしてきて、<a href="http://apigen.org/" target="_blank">ApiGen</a>で、サンプルを生成してみました。</p>
<p><img src="/assets/images/201404/apigen_sample.png" /></p>
<p>※日本語の部分は私が追記したコメントです。</p>
<p>(関係ないけれど、apigen、PEARでインストールしたら、そのままだと動かなかった。
手でエラーになる箇所のincludeパスを書き換えてやるか、composer install して使うかすればOKだった)。</p>
<p>ビルド系ツール(Grunt、Jenkins等)で自動生成させれば、手間なく吐けます。</p>
<h4 id="uml">UML的なもの</h4>
<p><a href="http://www.infoq.com/jp/articles/kenji-modeling-agile" target="_blank">平鍋さんのアジャイルモデリングの記事</a>に活用イメージが紹介されています。</p>
<p>※「php uml 自動生成」でぐぐって、<a href="http://www.stack.nl/~dimitri/doxygen" target="_blank">doxygen</a>を試してみたのですが、継承等はUML生成されるのですが、あるメソッドが別のクラスのオブジェクトを引数に取る、といった情報についての図示ができるツールではありませんでした。</p>
<h3 id="section-4">「ドメイン」、「モデル」という用語について</h3>
<p>3章の内容とは直接関係無いのですが、自分の中で混乱していた用語がやっと整理できたような気がするので以下にメモ。</p>
<h4 id="ddd">ユーザが見ても理解可能なコアドメインのモデルと、そうではない、「実装のためのモデル」とがある。DDD本では後者は扱っていないのか?</h4>
<p><small>
(読書会を始めた当初の時期、私が会社で作っていたのは、
スケールを前提条件とした分散トランザクションの処理だった。
それは、ユーザ(ディレクタ = ドメインエキスパート)から見れば「ひとこと」であっさりと言えてしまう単純な機能であるにも関わらず、
裏側は非同期(メッセージキューイング)で、そこそこ複雑な構成のクラス群。
これは、DDD本で言うとどのあたりの話になるのかなと、気になっていた)。
</small></p>
<p>ユーザでも理解可能なドメインモデルは、分かりやすく抽象化されているもので、私のイメージしている実装のためのモデルは、もっと具体的な、「解決ドメインのモデル」と言えそう。
この本が主題にしているのは、前者の、問題ドメインのドメイン知識から作るドメインモデルの方だと思う(たぶん。自信無し)。</p>
<p><small>
“ユーザ(ディレクタ)から見れば「ひとこと」であっさりと言えてしまう”のであれば、
実装コード上も、そのまま「ひとこと」で済んでいるだけのI/Fが、ドメイン層のどこかに表現される。
スケールのための裏側のごちゃごちゃとした実装の仕掛け群については、オブジェクト指向の責務分割によって、別のクラスやパッケージに切り出す。
これによって、たとえば保守を担当することになった他のエンジニアが後から見ても、意味が把握できるシステムになる、という理解で良いのかなと思いました(自信なし)。
</small></p>
<p>以上とは全く別な話として、「問題ドメイン」には、「ビジネスドメイン」と「技術ドメイン」とがある。
技術ドメインとして、思いつく例を挙げる。</p>
<ul>
<li>Webアプリケーションフレームワークそのものを作っているエンジニアから見たWebアプリケーション</li>
<li>メッセージキューイングシステムそのものを作っているライブラリ作者から見たメッセージキューイング</li>
</ul>
<p>Webチャットのように、リアルなモノではなく、電子データのやり取りが中心となるようなコンピュータドメインもある。</p>
<h4 id="xead-modeler">話は変わって、設計支援ツール「XEAD Modeler」をインストールしてみるところまでの話</h4>
<p>ところで、最近「<a href="http://www.amazon.co.jp/%E6%A5%AD%E5%8B%99%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%83%A2%E3%83%87%E3%83%AA%E3%83%B3%E3%82%B0%E7%B7%B4%E7%BF%92%E5%B8%B3-%E6%A5%AD%E5%8B%99%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%92%E5%8A%B9%E6%9E%9C%E7%9A%84%E3%81%AB%E8%A8%AD%E8%A8%88%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E7%B2%BE%E9%81%B845%E9%A1%8C-%E6%B8%A1%E8%BE%BA-%E5%B9%B8%E4%B8%89/dp/4822282856" target="_blank">業務システムモデリング練習帳</a>」を読んでいます。後半になってくると、私には難しくて、なかなか読破できません、笑。エンタープライズ向けの本ですが、Web系PHPerが読んでもおもしろい、実践的なトレーニングブック。モデル図もたくさん出てきます。</p>
<p>読書会では、著者の渡辺幸三さんの話題がたびたび出てくるので、読んでみたくなったのでした。</p>
<p>渡辺さんが作られている設計支援ツール、<a href="http://homepage2.nifty.com/dbc/products.html" target="_blank">XEAD Modeler</a> を Mac で動かして、販売管理のサンプルデータを開いて、おおっ、なんか凄い!と思ったりしました。
まだ記事に書けるほどの理解ができていないので、今後学習していきたいと思います。
(Macだと、右クリックのイベントが拾えていないような気がします。私の使い方が間違っているのだろうか)。</p>
<ul>
<li>XEAD Modeler をMac で動かす手順メモ</li>
</ul>
<blockquote>
<p>https://github.com/xead/XeadModeler
を git clone する。</p>
<p>Modeler.javaと
Res_ja.java
に日本語があるのであらかじめUTF-8に変換しておく。</p>
<p>EclipseでJavaプロジェクトを作成してインポートする。</p>
<p>poi-3.10-FINAL-20140208.jar
xerces-2_10_0-xml-schema-1.1-beta
jaxp-ri-1.4.jar</p>
<p>をWebから落としてきて、プロジェクトに追加し、右クリックでビルドパスを追加設定。
[Javaアプリケーション]として実行。</p>
</blockquote>
<p>OSSなので、<a href="https://github.com/xead/XeadModeler/pull/1" target="_blank">PullRequest</a>もしました。面識のないフランス人にプルリクした時と同じくらい緊張しました。</p>
</content>
</entry>
<entry>
<title>大阪DDD読書会vol.5振り返り</title>
<link href="http://kumamidori.github.io/ddd/2014/04/19/ddd_osaka_vol5"/>
<updated>2014-04-19T00:00:00Z</updated>
<id>http://kumamidori.github.io/ddd/2014/04/19/ddd_osaka_vol5</id>
<content type="html">
<p>4/19に大阪DDD読書会vol.5を行いました。内容については、どこかで別途書きたいと思います。
(今回の公式レポートWikiは @sugimoto_kei さんがまとめて下さいました。<a href="https://github.com/dddosaka/reading_ddd_report/wiki/vol5_20140419">こちら</a>です)。
2/22に初回を行ったこの読書会、次回でいったん一区切りとなるのでした。全体を通して、スタッフとしての振り返りをメモします。</p>
<h2 id="keep">Keep</h2>
<ul>
<li>着実に理解しながら読んでいく、というスタイルが良かった</li>
<li>ある程度参加メンバーが固定化されていることにより、落ち着いて議論が深められた</li>
<li>レポートWikiを復習に活用させてもらった</li>
<li>定期的に継続開催することで集中できた</li>
<li>参加可能な人数は最大20人程度</li>
<li>運営を私がやったことにより、自分のやりたい形でやらせて頂くことができた(カジュアルトーク枠で発表をしたり)</li>
</ul>
<h3 id="section">個人的に良かったこと</h3>
<ul>
<li>(後藤さん懇親会があったことがきっかけで、)渡辺幸三さんの本「<a href="http://www.amazon.co.jp/%E6%A5%AD%E5%8B%99%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%83%A2%E3%83%87%E3%83%AA%E3%83%B3%E3%82%B0%E7%B7%B4%E7%BF%92%E5%B8%B3-%E6%A5%AD%E5%8B%99%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%92%E5%8A%B9%E6%9E%9C%E7%9A%84%E3%81%AB%E8%A8%AD%E8%A8%88%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E7%B2%BE%E9%81%B845%E9%A1%8C-%E6%B8%A1%E8%BE%BA-%E5%B9%B8%E4%B8%89/dp/4822282856">業務システムモデリング練習帳</a>」に取り組めた</li>
<li>会社で日々やっている要件ヒアリングや名前付けの作業が以前よりも改善できた(ドメインとそうでないものを分けて考える、ドメインモデリングと実装)</li>
</ul>
<h2 id="problem">Problem</h2>
<h3 id="section-1">運営のこと</h3>
<ul>
<li>会場調整に苦しんだ(産創館の空き枠が少ないことによる)</li>
<li>会場手配や予習を考えて、開催ペースを落としたい</li>
<li>プロジェクタとネットにつながるノート1台は毎回あった方が良い</li>
<li>会計記録はWikiではなくて表形式でつけた方が良かった</li>
<li>開催告知は、数回分先まで済ませてしまう方がスムーズかも</li>
</ul>
<h3 id="section-2">個人的なこと</h3>
<ul>
<li>【重要】予習をできていない回がたびたびあった(初学者の場合はやる意味が半減してしまうのでもったいなかった)</li>
<li>質問したり議論に参加したりができていなかった(これも理解度の問題)</li>
</ul>
<h2 id="try">Try</h2>
<ul>
<li>(案)レポートWikiを事後に作るのではなくて、事前に予習から使う。不明点や調べたことを誰でも自由に書く欄を作る。疑問はディスカッション時に各自解決するようにする。</li>
<li>今後やりたいことのメモ:ワークショップ、メンターズ道場でやったことを実装まで進めて共有等。</li>
<li>新シリーズ企画(当初第6回までおしまい、という約束で最初に始めたので、いったん終了、解散にして、DDD本読書の続きを、残る人と新メンバーで引き続きやる)。</li>
<li>参加者数名で振り返りMTGをして、新シリーズに活かす(ただいま日程調整中)</li>
</ul>
<h3 id="section-3">運営面</h3>
<ul>
<li>会場は、安くてほど良い <a href="http://www.skc-higashiyodogawa.jp/index.html">市民交流センターひがしよどがわ</a> を最近見つけたので、悩みが一気に解決した</li>
<li>スタッフ業(会場手配、告知)の一部分担を川辺さんへご相談する</li>
<li>会計記録をGoogleドライブへ移行</li>
<li>プロジェクタは使わなくても毎回用意することにする</li>
</ul>
</content>
</entry>
<entry>
<title>「extract till you drop」/PhpStormショートカット</title>
<link href="http://kumamidori.github.io/php/2014/02/09/from-extract-till-you-drop"/>
<updated>2014-02-09T00:00:00Z</updated>
<id>http://kumamidori.github.io/php/2014/02/09/from-extract-till-you-drop</id>
<content type="html">
<p>今さらだけれど、extract-till-you-drop(「限界まで抽出せよ」) の screencast を見た。</p>
<p><a href="http://verraes.net/2013/09/extract-till-you-drop/">extract-till-you-drop</a></p>
<p>最後は、コードが自然言語みたい。
抽象でわかりやすく。
知識をまとめるとシンプルに。</p>
<p><a href="http://phpmentors.jp/post/63422732564/symfony-meetup-tokyo">道場生レポートブログ</a>も読みました。</p>
<p>私もPhpStorm使っているのに、無知過ぎたので、反省メモ。。。</p>
<ul>
<li>phpunit、コンソール(手 or grunt-phpunit)で見ていたけれど、エディタも試してみる。エディタでカバレッジも見れるんだ・・・。</li>
<li>Ctrl + T は [Rename] 以外も便利(namespace、定数、メソッド、シグネチャ)</li>
<li>Overrideメソッドは、 Cmd + N -&gt; Override… でインクリメンタル検索すると1秒で</li>
<li>ワード選択後に [Alt] + [Enter] -&gt; [Add field]、[Add import] で自動挿入。</li>
<li>Cmd + Shift + T でテストクラス作成</li>
<li>Ctrl + N でphpunitテストメソッド追加もできる</li>
<li>一括インデントは [Reformat Code] で</li>
</ul>
<p>英語が全然分からなかったけれど、モックtestについて、 small and fast だと言っていた。</p>
</content>
</entry>
<entry>
<title>はじめてのSymfony2 - 2.4でファイルアップロード -</title>
<link href="http://kumamidori.github.io/php/2014/01/02/symfony-01-basic"/>
<updated>2014-01-02T00:00:00Z</updated>
<id>http://kumamidori.github.io/php/2014/01/02/symfony-01-basic</id>
<content type="html">
<p>こういう自分専用のメモは、ブログじゃなくてローカルに保存した方が良いかな、と悩みつつ。</p>
<p>Symfony2を使ったことが一度も無い。それだと何かと困る(仕事じゃなくて、個人学習上)。入門することにした。</p>
<p>プルリク歓迎の日本語訳プロジェクトもあるのでした(内容が一部古いけれども)。<a href="http://docs.symfony.gr.jp/" target="_blank">Symfony2 books 日本語訳</a>。
オリジナルのブログチュートリアルもあって勉強になります。</p>
<h3 id="section">サンプルコード仕様</h3>
<h4 id="section-1">ファイルアップロード</h4>
<ul>
<li>ファイルをアップロードできる</li>
<li>ファイル一覧ページ(ホーム)が見られる</li>
</ul>
<p>※そのうちコレをやりたいけど、今日はできなかった→<a href="http://rosylilly.hatenablog.com/entry/2013/10/21/190019" target="_blank">鳩舎「ファイルアップローダを作ろう」</a></p>
<h3 id="section-2">作ったサンプルコード置き場はこちら</h3>
<p><a href="https://github.com/kumamidori/SymfonyMinimamFileUpload" target="_blank">https://github.com/kumamidori/SymfonyMinimamFileUpload</a></p>
<p><a href="http://symfony.com/doc/current/cookbook/doctrine/file_uploads.html" target="_blank">公式クックブック「How to handle File Uploads with Doctrine」</a>ママです</p>
<h3 id="section-3">メモ</h3>
<ul>
<li>このフレームワークで作った結果、自分が仕事で作っている/作ってきた様々なコードよりも、明らかに読みやすいものができた。考えていきたいところ。</li>
<li>マニュアルと同梱デモコードが充実している。</li>
<li>マニュアル中のコードは、読みやすさのため、細かいところは端折ってある。そのまま動くコードっていうわけでもない。</li>
<li>フォームがエンティティとタイプから成る作りは分かりやすかった。エンティティのメソッドをTwigでそのまま使えて感動。これってsmartyでもできるのかな。。。</li>
<li>フォームの validation.yml は、配置しただけで自動ロードされる</li>
<li>TODO:Doctrine、DBAL も初めて使ったので学習</li>
</ul>
<h3 id="section-4">参考リンク</h3>
<ul>
<li><a href="http://www.slideshare.net/fivestar/symfony2-8203873" title="2011年のスライド ">2011年スライド「Symfony2のフォームフレームワーク」(@fivestr)</a></li>
<li><a href="https://groups.google.com/forum/#!topic/symfony-users-ja/J_I1kr_jP_k">Symfonyユーザ会Googleグループに投稿されていた、実務的なファイルアップロード設計例(@brtriver)</a></li>
</ul>
</content>
</entry>
<entry>
<title>Aura for PHP をさわってみる - vol1. DI -</title>
<link href="http://kumamidori.github.io/php/2013/12/23/auraphp-01-di"/>
<updated>2013-12-23T00:00:00Z</updated>
<id>http://kumamidori.github.io/php/2013/12/23/auraphp-01-di</id>
<content type="html">
<p>Aura はどういうフレームワークか?については、<a href="http://kumamidori.github.io/php/2013/12/22/auraphp-kansai-php-study/" target="_blank">こちら</a>にすでに書きました。
今日は、サンプルコードを書いてみて、DIの初歩的なところを理解するところまでです。</p>
<h3 id="di">DIについて、予備知識</h3>
<p>下記を読む。</p>
<ul>
<li><a href="http://kakutani.com/trans/fowler/injection.html" target="_blank">Inversion of Control コンテナと Dependency Injection パターン</a></li>
</ul>
<p>すみません。正直、議論の詳細はちゃんと読めてないです。
だんなが、「ファウラーは難しいよ、最初に考えすぎて何も完成しないのは良くない」って言ってるので、今日は先に進みます。</p>
<h3 id="section">これから作ろうとしているサンプルコードの仕様</h3>
<h4 id="section-1">海上輸送の予約アプリケーション</h4>
<ul>
<li>貨物船には積載量(キャパシティ)がある</li>
<li>[基本機能] 輸送詳細ページ:船に載せる貨物のCRUD</li>
<li>[基本機能] 輸送詳細ページ:貨物の追加時に、船のキャパシティと付きあわせて、輸送予約の可否を判定</li>
</ul>
<p>なのだけど、今日は単に一覧を表示するところまでです。</p>
<h3 id="section-2">作ったサンプルコード置き場はこちら!</h3>
<p><a href="https://github.com/kumamidori/HelloAura" target="_blank">https://github.com/kumamidori/HelloAura</a></p>
<h3 id="section-3">パッケージ構成について</h3>
<p>Auraではすべてのコードは「パッケージ」として分類されます。「Library First, Framework Second」とうたわれているように、
機能 = 独立パッケージなわけです。</p>
<p><a href="http://auraphp.com/manuals/v1/ja/package-organization/">http://auraphp.com/manuals/v1/ja/package-organization/</a></p>
<h3 id="section-4">まずは初期スケルトン作成</h3>
<p>以下、プロジェクトパス{$PROJECT_PATH} = ~/HelloAura とした場合。</p>
<div><div class="CodeRay">
<div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span># まずは下準備...
<span class="line-numbers"> <a href="#n2" name="n2">2</a></span>
<span class="line-numbers"> <a href="#n3" name="n3">3</a></span># プロジェクトスケルトン作成
<span class="line-numbers"> <a href="#n4" name="n4">4</a></span>% composer create-project aura/system ~/HelloAura
<span class="line-numbers"> <a href="#n5" name="n5">5</a></span>% cd ~/HelloAura
<span class="line-numbers"> <a href="#n6" name="n6">6</a></span>
<span class="line-numbers"> <a href="#n7" name="n7">7</a></span># ビルトインサーバ起動でHelloWorld が出ることを確認
<span class="line-numbers"> <a href="#n8" name="n8">8</a></span>% php package/Aura.Framework/cli/server
<span class="line-numbers"> <a href="#n9" name="n9">9</a></span>
<span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span># テストが通ることを確認
<span class="line-numbers"><a href="#n11" name="n11">11</a></span>% cd tests
<span class="line-numbers"><a href="#n12" name="n12">12</a></span>% phpunit
</pre></div>
</div>
</div>
<h3 id="section-5">パッケージを作る</h3>
<ul>
<li>自分が作るアプリケーションコードも、なんでも「パッケージ」にすべきなの?</li>
</ul>
<p>公式のデモコードを見ると、パッケージ化されていない「include」というフォルダがプロジェクトの直下にあるから、
別に全部パッケージ化しなくても良いのかも・・・。</p>
<p>→ でも、パッケージで作る方が、詰まることなくマニュアル通りに進めそうなので、今回はそうする!</p>
<ul>
<li>ベンダー名: <code>Kumamidori</code></li>
<li>アプリケーション名:<code>Transportation</code>(輸送アプリケーションなので)</li>
</ul>
<p>で作る。</p>
<div><div class="CodeRay">
<div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span>% cd ~/HelloAura
<span class="line-numbers"><a href="#n2" name="n2">2</a></span>% mkdir -p package/Kumamidori.Transportation/src/Kumamidori/Transportation/Web/Home/views
<span class="line-numbers"><a href="#n3" name="n3">3</a></span>% mkdir package/Kumamidori.Transportation/config
</pre></div>
</div>
</div>
<h3 id="section-6">作ったパッケージをロード</h3>
<p><code>HelloAura/config/_packages</code>に<code>Kumamidori.Transportation</code>の一行を追記。</p>
<h3 id="section-7">パッケージの初期設定ファイル</h3>
<p><code>HelloAura/package/Kumamidori.Transportation/config/default.php</code></p>
<p>に、アプリケーションコードのパッケージに対するオートローダを追加、ルーティング指定も書いた。</p>
<div><div class="CodeRay">
<div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span><span style="font-weight:bold;color:#666">&lt;?php</span>
<span class="line-numbers"> <a href="#n2" name="n2">2</a></span><span style="color:#777">// add the package to the autoloader</span>
<span class="line-numbers"> <a href="#n3" name="n3">3</a></span><span style="color:#963">$loader</span>-&gt;add(<span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">Kumamidori</span><span style="color:#D20">\T</span><span style="color:#D20">ransportation</span><span style="color:#b0b">\\</span><span style="color:#710">'</span></span>, <span style="color:#369;font-weight:bold">dirname</span>(<span style="color:#069">__DIR__</span>) . <span style="color:#069">DIRECTORY_SEPARATOR</span> . <span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">src</span><span style="color:#710">'</span></span>);
<span class="line-numbers"> <a href="#n4" name="n4">4</a></span>
<span class="line-numbers"> <a href="#n5" name="n5">5</a></span><span style="color:#777">// add a route to the page and action</span>
<span class="line-numbers"> <a href="#n6" name="n6">6</a></span><span style="color:#963">$di</span>-&gt;get(<span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">router_map</span><span style="color:#710">'</span></span>)-&gt;add(<span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">home</span><span style="color:#710">'</span></span>, <span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">/</span><span style="color:#710">'</span></span>, [
<span class="line-numbers"> <a href="#n7" name="n7">7</a></span> <span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">values</span><span style="color:#710">'</span></span> =&gt; [
<span class="line-numbers"> <a href="#n8" name="n8">8</a></span> <span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">controller</span><span style="color:#710">'</span></span> =&gt; <span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">home</span><span style="color:#710">'</span></span>,
<span class="line-numbers"> <a href="#n9" name="n9">9</a></span> <span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">action</span><span style="color:#710">'</span></span> =&gt; <span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">index</span><span style="color:#710">'</span></span>,
<span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span> ],
<span class="line-numbers"><a href="#n11" name="n11">11</a></span>]);
<span class="line-numbers"><a href="#n12" name="n12">12</a></span>
<span class="line-numbers"><a href="#n13" name="n13">13</a></span><span style="color:#777">// map the 'greet' controller value to a page controller class</span>
<span class="line-numbers"><a href="#n14" name="n14">14</a></span><span style="color:#963">$di</span>-&gt;params[<span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">Aura</span><span style="color:#D20">\F</span><span style="color:#D20">ramework</span><span style="color:#D20">\W</span><span style="color:#D20">eb</span><span style="color:#D20">\C</span><span style="color:#D20">ontroller</span><span style="color:#D20">\F</span><span style="color:#D20">actory</span><span style="color:#710">'</span></span>][<span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">map</span><span style="color:#710">'</span></span>][<span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">home</span><span style="color:#710">'</span></span>] = <span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">Kumamidori</span><span style="color:#D20">\T</span><span style="color:#D20">ransportation</span><span style="color:#D20">\W</span><span style="color:#D20">eb</span><span style="color:#D20">\H</span><span style="color:#D20">ome</span><span style="color:#D20">\H</span><span style="color:#D20">omePage</span><span style="color:#710">'</span></span>;
</pre></div>
</div>
</div>
<p>これでビルトインサーバを起動すれば、とりあえずホームが表示される。OK。</p>
<ul>
<li>疑問:この、↑ <code>$loader</code> と <code>$di</code> は、どこから来たの?</li>
</ul>
<p><code>/package/Aura.Framework/src/Aura/Framework/Bootstrap/Factory.php</code>
に該当コードがあった。</p>
<div><div class="CodeRay">
<div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span> <span style="color:#080;font-weight:bold">public</span> <span style="color:#080;font-weight:bold">function</span> <span style="color:#06B;font-weight:bold">prep</span>(<span style="color:#963">$mode</span> = <span style="color:#069">null</span>, <span style="color:#963">$silent_loader</span> = <span style="color:#069">false</span>)
<span class="line-numbers"> <a href="#n2" name="n2">2</a></span> {
<span class="line-numbers"> <a href="#n3" name="n3">3</a></span> <span style="color:#777">// ・・・略</span>
<span class="line-numbers"> <a href="#n4" name="n4">4</a></span> <span style="color:#777">// create the autoloader</span>
<span class="line-numbers"> <a href="#n5" name="n5">5</a></span> <span style="color:#963">$system</span> = <span style="color:#080;font-weight:bold">new</span> <span style="color:#369;font-weight:bold">System</span>(<span style="color:#963">$this</span>-&gt;root);
<span class="line-numbers"> <a href="#n6" name="n6">6</a></span> <span style="color:#777">// ・・・略</span>
<span class="line-numbers"> <a href="#n7" name="n7">7</a></span> <span style="color:#963">$loader</span> = <span style="color:#080;font-weight:bold">new</span> <span style="color:#036;font-weight:bold">Loader</span>;
<span class="line-numbers"> <a href="#n8" name="n8">8</a></span> <span style="color:#963">$loader</span>-&gt;prep(<span style="color:#963">$system</span>);
<span class="line-numbers"> <a href="#n9" name="n9">9</a></span> <span style="color:#080;font-weight:bold">if</span> (<span style="color:#963">$silent_loader</span>) {
<span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span> <span style="color:#963">$loader</span>-&gt;setMode(<span style="color:#963">$loader</span>::<span style="color:#036;font-weight:bold">MODE_SILENT</span>);
<span class="line-numbers"><a href="#n11" name="n11">11</a></span> }
<span class="line-numbers"><a href="#n12" name="n12">12</a></span> <span style="color:#963">$loader</span>-&gt;register();
<span class="line-numbers"><a href="#n13" name="n13">13</a></span>
<span class="line-numbers"><a href="#n14" name="n14">14</a></span> <span style="color:#777">// create the DI container</span>
<span class="line-numbers"><a href="#n15" name="n15">15</a></span> <span style="color:#963">$di</span> = <span style="color:#080;font-weight:bold">new</span> <span style="color:#036;font-weight:bold">Container</span>(<span style="color:#080;font-weight:bold">new</span> <span style="color:#036;font-weight:bold">Forge</span>(<span style="color:#080;font-weight:bold">new</span> <span style="color:#036;font-weight:bold">Config</span>));
<span class="line-numbers"><a href="#n16" name="n16">16</a></span>
<span class="line-numbers"><a href="#n17" name="n17">17</a></span> <span style="color:#777">// ・・・略</span>
<span class="line-numbers"><a href="#n18" name="n18">18</a></span>
<span class="line-numbers"><a href="#n19" name="n19">19</a></span> <span style="color:#080;font-weight:bold">if</span> (! <span style="color:#963">$mode</span>) {
<span class="line-numbers"><strong><a href="#n20" name="n20">20</a></strong></span> <span style="color:#963">$file</span> = <span style="color:#963">$system</span>-&gt;getConfigPath(<span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">_mode</span><span style="color:#710">'</span></span>);
<span class="line-numbers"><a href="#n21" name="n21">21</a></span> <span style="color:#080;font-weight:bold">if</span> (<span style="color:#369;font-weight:bold">is_readable</span>(<span style="color:#963">$file</span>)) {
<span class="line-numbers"><a href="#n22" name="n22">22</a></span> <span style="color:#963">$mode</span> = <span style="color:#369;font-weight:bold">trim</span>(<span style="color:#369;font-weight:bold">file_get_contents</span>(<span style="color:#963">$file</span>));
<span class="line-numbers"><a href="#n23" name="n23">23</a></span> } <span style="color:#080;font-weight:bold">else</span> {
<span class="line-numbers"><a href="#n24" name="n24">24</a></span> <span style="color:#963">$mode</span> = <span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">default</span><span style="color:#710">'</span></span>; <span style="color:#777">// <※ここでconfig/default が出てくる</span>
<span class="line-numbers"><a href="#n25" name="n25">25</a></span> }
<span class="line-numbers"><a href="#n26" name="n26">26</a></span> }
<span class="line-numbers"><a href="#n27" name="n27">27</a></span>
<span class="line-numbers"><a href="#n28" name="n28">28</a></span> <span style="color:#963">$read</span> = <span style="color:#080;font-weight:bold">function</span> (<span style="color:#963">$file</span>) <span style="color:#080;font-weight:bold">use</span> (<span style="color:#963">$di</span>, <span style="color:#963">$system</span>, <span style="color:#963">$loader</span>) {
<span class="line-numbers"><a href="#n29" name="n29">29</a></span> <span style="color:#369;font-weight:bold">require</span> <span style="color:#963">$file</span>;
<span class="line-numbers"><strong><a href="#n30" name="n30">30</a></strong></span> };
<span class="line-numbers"><a href="#n31" name="n31">31</a></span>
<span class="line-numbers"><a href="#n32" name="n32">32</a></span> <span style="color:#963">$cache</span> = <span style="color:#963">$this</span>-&gt;readCacheConfig(<span style="color:#963">$system</span>, <span style="color:#963">$read</span>, <span style="color:#963">$mode</span>);
<span class="line-numbers"><a href="#n33" name="n33">33</a></span> <span style="color:#080;font-weight:bold">if</span> (! <span style="color:#963">$cache</span>) {
<span class="line-numbers"><a href="#n34" name="n34">34</a></span> <span style="color:#963">$this</span>-&gt;readPackageConfig(<span style="color:#963">$system</span>, <span style="color:#963">$read</span>, <span style="color:#963">$mode</span>);
<span class="line-numbers"><a href="#n35" name="n35">35</a></span> }
<span class="line-numbers"><a href="#n36" name="n36">36</a></span>
<span class="line-numbers"><a href="#n37" name="n37">37</a></span> <span style="color:#963">$this</span>-&gt;readSystemConfig(<span style="color:#963">$system</span>, <span style="color:#963">$read</span>, <span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">default</span><span style="color:#710">'</span></span>);
<span class="line-numbers"><a href="#n38" name="n38">38</a></span> <span style="color:#080;font-weight:bold">if</span> (<span style="color:#963">$mode</span> != <span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">default</span><span style="color:#710">'</span></span>) {
<span class="line-numbers"><a href="#n39" name="n39">39</a></span> <span style="color:#963">$this</span>-&gt;readSystemConfig(<span style="color:#963">$system</span>, <span style="color:#963">$read</span>, <span style="color:#963">$mode</span>);
<span class="line-numbers"><strong><a href="#n40" name="n40">40</a></strong></span> }
<span class="line-numbers"><a href="#n41" name="n41">41</a></span>
<span class="line-numbers"><a href="#n42" name="n42">42</a></span> <span style="color:#963">$di</span>-&gt;lock();
<span class="line-numbers"><a href="#n43" name="n43">43</a></span>
<span class="line-numbers"><a href="#n44" name="n44">44</a></span> <span style="color:#080;font-weight:bold">return</span> <span style="color:#963">$di</span>;
<span class="line-numbers"><a href="#n45" name="n45">45</a></span> }
</pre></div>
</div>
</div>
<ul>
<li>疑問:<code>$di</code> で使えるメソッドは何なの?</li>
</ul>
<p><code>HelloAura/package/Aura.Di/src/Aura/Di/Container.php</code> に定義があった</p>
<p>(その1) メソッド定義</p>
<div><div class="CodeRay">
<div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span> <span style="color:#777">/**</span>
<span class="line-numbers"> <a href="#n2" name="n2">2</a></span><span style="color:#777"> * Sets a service object by name.</span>
<span class="line-numbers"> <a href="#n3" name="n3">3</a></span><span style="color:#777"> */</span>
<span class="line-numbers"> <a href="#n4" name="n4">4</a></span> <span style="color:#080;font-weight:bold">public</span> <span style="color:#080;font-weight:bold">function</span> <span style="color:#06B;font-weight:bold">set</span>(<span style="color:#963">$key</span>, <span style="color:#963">$val</span>);
<span class="line-numbers"> <a href="#n5" name="n5">5</a></span>
<span class="line-numbers"> <a href="#n6" name="n6">6</a></span> <span style="color:#777">/**</span>
<span class="line-numbers"> <a href="#n7" name="n7">7</a></span><span style="color:#777"> * Gets a service object by key, lazy-loading it as needed.</span>
<span class="line-numbers"> <a href="#n8" name="n8">8</a></span><span style="color:#777"> */</span>
<span class="line-numbers"> <a href="#n9" name="n9">9</a></span> <span style="color:#080;font-weight:bold">public</span> <span style="color:#080;font-weight:bold">function</span> <span style="color:#06B;font-weight:bold">get</span>(<span style="color:#963">$key</span>);
<span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span>
<span class="line-numbers"><a href="#n11" name="n11">11</a></span> <span style="color:#777">/**</span>
<span class="line-numbers"><a href="#n12" name="n12">12</a></span><span style="color:#777"> * Returns a Lazy that gets a service.</span>
<span class="line-numbers"><a href="#n13" name="n13">13</a></span><span style="color:#777"> *</span>
<span class="line-numbers"><a href="#n14" name="n14">14</a></span><span style="color:#777"> * @param string $key The service name; it does not need to exist yet.</span>
<span class="line-numbers"><a href="#n15" name="n15">15</a></span><span style="color:#777"> * @return Lazy A lazy-load object that gets the named service.</span>
<span class="line-numbers"><a href="#n16" name="n16">16</a></span><span style="color:#777"> */</span>
<span class="line-numbers"><a href="#n17" name="n17">17</a></span> <span style="color:#080;font-weight:bold">public</span> <span style="color:#080;font-weight:bold">function</span> <span style="color:#06B;font-weight:bold">lazyGet</span>(<span style="color:#963">$key</span>);
<span class="line-numbers"><a href="#n18" name="n18">18</a></span>
<span class="line-numbers"><a href="#n19" name="n19">19</a></span> <span style="color:#777">/**</span>
<span class="line-numbers"><strong><a href="#n20" name="n20">20</a></strong></span><span style="color:#777"> * Returns a new instance of the specified class, optionally</span>
<span class="line-numbers"><a href="#n21" name="n21">21</a></span><span style="color:#777"> * with additional override parameters.</span>
<span class="line-numbers"><a href="#n22" name="n22">22</a></span><span style="color:#777"> */</span>
<span class="line-numbers"><a href="#n23" name="n23">23</a></span> <span style="color:#080;font-weight:bold">public</span> <span style="color:#080;font-weight:bold">function</span> <span style="color:#06B;font-weight:bold">newInstance</span>(<span style="color:#963">$class</span>, <span style="color:#369;font-weight:bold">array</span> <span style="color:#963">$params</span> = [], <span style="color:#369;font-weight:bold">array</span> <span style="color:#963">$setters</span> = []);
<span class="line-numbers"><a href="#n24" name="n24">24</a></span>
<span class="line-numbers"><a href="#n25" name="n25">25</a></span> <span style="color:#777">/**</span>
<span class="line-numbers"><a href="#n26" name="n26">26</a></span><span style="color:#777"> * Returns a Lazy that creates a new instance.</span>
<span class="line-numbers"><a href="#n27" name="n27">27</a></span><span style="color:#777"> */</span>
<span class="line-numbers"><a href="#n28" name="n28">28</a></span> <span style="color:#080;font-weight:bold">public</span> <span style="color:#080;font-weight:bold">function</span> <span style="color:#06B;font-weight:bold">lazyNew</span>(<span style="color:#963">$class</span>, <span style="color:#369;font-weight:bold">array</span> <span style="color:#963">$params</span> = [], <span style="color:#369;font-weight:bold">array</span> <span style="color:#963">$setters</span> = []);
<span class="line-numbers"><a href="#n29" name="n29">29</a></span>
<span class="line-numbers"><strong><a href="#n30" name="n30">30</a></strong></span> <span style="color:#777">/**</span>
<span class="line-numbers"><a href="#n31" name="n31">31</a></span><span style="color:#777"> * Returns a Factory that creates an object over and over again (as vs</span>
<span class="line-numbers"><a href="#n32" name="n32">32</a></span><span style="color:#777"> * creating it one time like the lazyNew() or newInstance() methods).</span>
<span class="line-numbers"><a href="#n33" name="n33">33</a></span><span style="color:#777"> */</span>
<span class="line-numbers"><a href="#n34" name="n34">34</a></span> <span style="color:#080;font-weight:bold">public</span> <span style="color:#080;font-weight:bold">function</span> <span style="color:#06B;font-weight:bold">newFactory</span>(<span style="color:#963">$class</span>, <span style="color:#369;font-weight:bold">array</span> <span style="color:#963">$params</span> = [], <span style="color:#369;font-weight:bold">array</span> <span style="color:#963">$setters</span> = [])
<span class="line-numbers"><a href="#n35" name="n35">35</a></span> {
<span class="line-numbers"><a href="#n36" name="n36">36</a></span> <span style="color:#080;font-weight:bold">return</span> <span style="color:#080;font-weight:bold">new</span> <span style="color:#036;font-weight:bold">Factory</span>(<span style="color:#963">$this</span>-&gt;forge, <span style="color:#963">$class</span>, <span style="color:#963">$params</span>, <span style="color:#963">$setters</span>);
<span class="line-numbers"><a href="#n37" name="n37">37</a></span> }
</pre></div>
</div>
</div>
<p>(その2) マジックメソッドでパラメータとセッター定義</p>
<div><div class="CodeRay">
<div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> <span style="color:#080;font-weight:bold">public</span> <span style="color:#080;font-weight:bold">function</span> <span style="color:#06B;font-weight:bold">__get</span>(<span style="color:#963">$key</span>)
<span class="line-numbers"><a href="#n2" name="n2">2</a></span> {
<span class="line-numbers"><a href="#n3" name="n3">3</a></span> <span style="color:#777">// ・・・略</span>
<span class="line-numbers"><a href="#n4" name="n4">4</a></span> <span style="color:#080;font-weight:bold">if</span> (<span style="color:#963">$key</span> == <span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">params</span><span style="color:#710">'</span></span> || <span style="color:#963">$key</span> == <span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">setter</span><span style="color:#710">'</span></span>) {
<span class="line-numbers"><a href="#n5" name="n5">5</a></span> <span style="color:#080;font-weight:bold">return</span> <span style="color:#963">$this</span>-&gt;<span style="color:#963">$key</span>;
<span class="line-numbers"><a href="#n6" name="n6">6</a></span> }
<span class="line-numbers"><a href="#n7" name="n7">7</a></span> <span style="color:#777">// ・・・略</span>
<span class="line-numbers"><a href="#n8" name="n8">8</a></span> }
</pre></div>
</div>
</div>
<h3 id="dbdi">DB接続に、DIの「コンストラクトインジェクション」を使う話</h3>
<p><a href="http://auraphp.com/manuals/v1/ja/di/" target="_blank">Aura DI -ディペンデンシーインジェクション</a>
を読む。</p>
<ul>
<li>サンプルコードのクラス設計:</li>
</ul>
<pre><code>Kumamidori\Transportation\
\Database: DBクラス(DB接続そのもの)
\Model\AbstractRecord: DBアクセスするモデル系のスーパークラス(DB接続を持っていて利用する)
</code></pre>
<p>にしてみた。DB名は「transportation」。</p>
<h4 id="section-8">サービスの設定</h4>
<ul>
<li>データベース接続を返すサービスの定義</li>
</ul>
<p><code>Kumamidori\Transportation\Database</code></p>
<div><div class="CodeRay">
<div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span><span style="font-weight:bold;color:#666">&lt;?php</span>
<span class="line-numbers"> <a href="#n2" name="n2">2</a></span><span style="color:#777">// ・・・略</span>
<span class="line-numbers"> <a href="#n3" name="n3">3</a></span><span style="color:#080;font-weight:bold">class</span> <span style="color:#B06;font-weight:bold">Database</span>
<span class="line-numbers"> <a href="#n4" name="n4">4</a></span>{
<span class="line-numbers"> <a href="#n5" name="n5">5</a></span> <span style="color:#080;font-weight:bold">private</span> <span style="color:#963">$connection</span>;
<span class="line-numbers"> <a href="#n6" name="n6">6</a></span>
<span class="line-numbers"> <a href="#n7" name="n7">7</a></span> <span style="color:#080;font-weight:bold">public</span> <span style="color:#080;font-weight:bold">function</span> <span style="color:#06B;font-weight:bold">__construct</span>(<span style="color:#963">$hostname</span>, <span style="color:#963">$dbname</span>, <span style="color:#963">$username</span>, <span style="color:#963">$password</span>)
<span class="line-numbers"> <a href="#n8" name="n8">8</a></span> {
<span class="line-numbers"> <a href="#n9" name="n9">9</a></span> <span style="color:#963">$connection_factory</span> = <span style="color:#080;font-weight:bold">new</span> <span style="color:#036;font-weight:bold">ConnectionFactory</span>;
<span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span> <span style="color:#963">$dsn</span> = <span style="color:#369;font-weight:bold">sprintf</span>(<span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">mysql:host=%s;dbname=%s</span><span style="color:#710">'</span></span>, <span style="color:#963">$hostname</span>, <span style="color:#963">$dbname</span>);
<span class="line-numbers"><a href="#n11" name="n11">11</a></span> <span style="color:#963">$this</span>-&gt;connection = <span style="color:#963">$connection_factory</span>-&gt;newInstance(
<span class="line-numbers"><a href="#n12" name="n12">12</a></span> <span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">mysql</span><span style="color:#710">'</span></span>,
<span class="line-numbers"><a href="#n13" name="n13">13</a></span> <span style="color:#963">$dsn</span>,
<span class="line-numbers"><a href="#n14" name="n14">14</a></span> <span style="color:#963">$username</span>,
<span class="line-numbers"><a href="#n15" name="n15">15</a></span> <span style="color:#963">$password</span>
<span class="line-numbers"><a href="#n16" name="n16">16</a></span> );
<span class="line-numbers"><a href="#n17" name="n17">17</a></span> }
<span class="line-numbers"><a href="#n18" name="n18">18</a></span>
<span class="line-numbers"><a href="#n19" name="n19">19</a></span> <span style="color:#080;font-weight:bold">public</span> <span style="color:#080;font-weight:bold">function</span> <span style="color:#06B;font-weight:bold">getConnection</span>()
<span class="line-numbers"><strong><a href="#n20" name="n20">20</a></strong></span> {
<span class="line-numbers"><a href="#n21" name="n21">21</a></span> <span style="color:#080;font-weight:bold">return</span> <span style="color:#963">$this</span>-&gt;connection;
<span class="line-numbers"><a href="#n22" name="n22">22</a></span> }
<span class="line-numbers"><a href="#n23" name="n23">23</a></span>}
</pre></div>
</div>
</div>
<ul>
<li>データベース接続サービスの利用側</li>
</ul>
<div><div class="CodeRay">
<div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span><span style="font-weight:bold;color:#666">&lt;?php</span>
<span class="line-numbers"> <a href="#n2" name="n2">2</a></span><span style="color:#777">// ・・・略</span>
<span class="line-numbers"> <a href="#n3" name="n3">3</a></span><span style="color:#080;font-weight:bold">abstract</span> <span style="color:#080;font-weight:bold">class</span> <span style="color:#B06;font-weight:bold">AbstractRecord</span> <span style="color:#080;font-weight:bold">extends</span> <span style="color:#036;font-weight:bold">AbstractModel</span>
<span class="line-numbers"> <a href="#n4" name="n4">4</a></span>{
<span class="line-numbers"> <a href="#n5" name="n5">5</a></span> <span style="color:#080;font-weight:bold">protected</span> <span style="color:#963">$connection</span>;
<span class="line-numbers"> <a href="#n6" name="n6">6</a></span>
<span class="line-numbers"> <a href="#n7" name="n7">7</a></span> <span style="color:#080;font-weight:bold">public</span> <span style="color:#080;font-weight:bold">function</span> <span style="color:#06B;font-weight:bold">__construct</span>(<span style="color:#036;font-weight:bold">Database</span> <span style="color:#963">$db</span>)
<span class="line-numbers"> <a href="#n8" name="n8">8</a></span> {
<span class="line-numbers"> <a href="#n9" name="n9">9</a></span> <span style="color:#963">$this</span>-&gt;connection = <span style="color:#963">$db</span>-&gt;getConnection();
<span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span> }
<span class="line-numbers"><a href="#n11" name="n11">11</a></span>}
</pre></div>
</div>
</div>
<ul>
<li>サービスの設定</li>
</ul>
<p><code>HelloAura/package/Kumamidori.Transportation/config/default.php</code></p>
<div><div class="CodeRay">
<div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span><span style="color:#777">// http://auraphp.com/manuals/v1/ja/di/</span>
<span class="line-numbers"> <a href="#n2" name="n2">2</a></span><span style="color:#777">// 方法 5: lazyNew() メソッドのコール(クロージャを使って新しいインスタンスを返す、と同様)</span>
<span class="line-numbers"> <a href="#n3" name="n3">3</a></span><span style="color:#777">// この1行だけで、この params がそのまま、Database クラスの __construct の引数になる。引数の順番は関係無いところがGoodですね。</span>
<span class="line-numbers"> <a href="#n4" name="n4">4</a></span><span style="color:#963">$di</span>-&gt;params[<span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">Kumamidori</span><span style="color:#D20">\T</span><span style="color:#D20">ransportation</span><span style="color:#D20">\D</span><span style="color:#D20">atabase</span><span style="color:#710">'</span></span>] = [
<span class="line-numbers"> <a href="#n5" name="n5">5</a></span> <span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">hostname</span><span style="color:#710">'</span></span> =&gt; <span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">localhost</span><span style="color:#710">'</span></span>,
<span class="line-numbers"> <a href="#n6" name="n6">6</a></span> <span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">dbname</span><span style="color:#710">'</span></span> =&gt; <span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">transportation</span><span style="color:#710">'</span></span>,
<span class="line-numbers"> <a href="#n7" name="n7">7</a></span> <span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">username</span><span style="color:#710">'</span></span> =&gt; <span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">root</span><span style="color:#710">'</span></span>,
<span class="line-numbers"> <a href="#n8" name="n8">8</a></span> <span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">password</span><span style="color:#710">'</span></span> =&gt; <span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#710">'</span></span>,
<span class="line-numbers"> <a href="#n9" name="n9">9</a></span>];
<span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span>
<span class="line-numbers"><a href="#n11" name="n11">11</a></span><span style="color:#777">// default params for the AbstractRecord class</span>
<span class="line-numbers"><a href="#n12" name="n12">12</a></span><span style="color:#777">// この1行だけで、この params がそのまま、AbstractRecord クラスの __construct の引数になる。</span>
<span class="line-numbers"><a href="#n13" name="n13">13</a></span><span style="color:#963">$di</span>-&gt;params[<span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">Kumamidori</span><span style="color:#D20">\T</span><span style="color:#D20">ransportation</span><span style="color:#D20">\M</span><span style="color:#D20">odel</span><span style="color:#D20">\A</span><span style="color:#D20">bstractRecord</span><span style="color:#710">'</span></span>] = [
<span class="line-numbers"><a href="#n14" name="n14">14</a></span> <span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">db</span><span style="color:#710">'</span></span> =&gt; <span style="color:#963">$di</span>-&gt;lazyGet(<span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">database</span><span style="color:#710">'</span></span>),
<span class="line-numbers"><a href="#n15" name="n15">15</a></span>];
<span class="line-numbers"><a href="#n16" name="n16">16</a></span>
<span class="line-numbers"><a href="#n17" name="n17">17</a></span><span style="color:#777">// define the database service</span>
<span class="line-numbers"><a href="#n18" name="n18">18</a></span><span style="color:#963">$di</span>-&gt;set(<span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">database</span><span style="color:#710">'</span></span>, <span style="color:#963">$di</span>-&gt;lazyNew(<span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">Kumamidori</span><span style="color:#D20">\T</span><span style="color:#D20">ransportation</span><span style="color:#D20">\D</span><span style="color:#D20">atabase</span><span style="color:#710">'</span></span>));
</pre></div>
</div>
</div>
<ul>
<li>
<p>疑問:こういう設定を書く「順番」は関係あるの? → 無い。設定ファイルのどこかに書いてあれば正しく解決される。</p>
</li>
<li>
<p>疑問:ここで言う「サービス」って何?オブジェクトなの?処理なの?</p>
</li>
<li>
<p>→ DIコンテナで取得、設定できるモノ。
Aura だと、$di-&gt;get()/ $di-&gt;set() で、任意のキー名を使ってアクセスされる。
<code>$di-&gt;set('database', $di-&gt;lazyNew('Kumamidori\Transportation\Database'));</code>
データベースサービス、具体的には、「コンテナがDatabaseオブジェクトをlazyNewする」というサービスを設定したら、
<code>$di-&gt;lazyGet('database')</code> でそれを取得することができるようになる。
言い換えるとなんだろう・・・「組み立てにより生成されるインスタンスが提供する動的な機能のこと」を指すのかな?・・・自信なし。</p>
</li>
</ul>
<h3 id="di-1">モデルオブジェクトのファクトリに、DI「セッターインジェクション」を使う</h3>
<p>気力が尽きてきたので省きます。コードだけ抜粋。クロージャってPHP実務で使った記憶ほとんど無いけど、便利そう。</p>
<ul>
<li>ファクトリの定義</li>
</ul>
<div><div class="CodeRay">
<div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span><span style="font-weight:bold;color:#666">&lt;?php</span>
<span class="line-numbers"> <a href="#n2" name="n2">2</a></span><span style="color:#777">// 略</span>
<span class="line-numbers"> <a href="#n3" name="n3">3</a></span><span style="color:#080;font-weight:bold">class</span> <span style="color:#B06;font-weight:bold">ModelFactory</span>
<span class="line-numbers"> <a href="#n4" name="n4">4</a></span>{
<span class="line-numbers"> <a href="#n5" name="n5">5</a></span> <span style="color:#777">// a map of model names to factory closures</span>
<span class="line-numbers"> <a href="#n6" name="n6">6</a></span> <span style="color:#080;font-weight:bold">protected</span> <span style="color:#963">$map</span> = [];
<span class="line-numbers"> <a href="#n7" name="n7">7</a></span>
<span class="line-numbers"> <a href="#n8" name="n8">8</a></span> <span style="color:#080;font-weight:bold">public</span> <span style="color:#080;font-weight:bold">function</span> <span style="color:#06B;font-weight:bold">__construct</span>(<span style="color:#963">$map</span> = [])
<span class="line-numbers"> <a href="#n9" name="n9">9</a></span> {
<span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span> <span style="color:#963">$this</span>-&gt;map = <span style="color:#963">$map</span>;
<span class="line-numbers"><a href="#n11" name="n11">11</a></span> }
<span class="line-numbers"><a href="#n12" name="n12">12</a></span>
<span class="line-numbers"><a href="#n13" name="n13">13</a></span> <span style="color:#080;font-weight:bold">public</span> <span style="color:#080;font-weight:bold">function</span> <span style="color:#06B;font-weight:bold">newInstance</span>(<span style="color:#963">$model_name</span>)
<span class="line-numbers"><a href="#n14" name="n14">14</a></span> {
<span class="line-numbers"><a href="#n15" name="n15">15</a></span> <span style="color:#963">$factory</span> = <span style="color:#963">$this</span>-&gt;map[<span style="color:#963">$model_name</span>];
<span class="line-numbers"><a href="#n16" name="n16">16</a></span> <span style="color:#963">$model</span> = <span style="color:#963">$factory</span>();
<span class="line-numbers"><a href="#n17" name="n17">17</a></span> <span style="color:#080;font-weight:bold">return</span> <span style="color:#963">$model</span>;
<span class="line-numbers"><a href="#n18" name="n18">18</a></span> }
<span class="line-numbers"><a href="#n19" name="n19">19</a></span>}
</pre></div>
</div>
</div>
<ul>
<li>ファクトリを利用する(セッターインジェクトされる)側</li>
</ul>
<div><div class="CodeRay">
<div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span><span style="font-weight:bold;color:#666">&lt;?php</span>
<span class="line-numbers"> <a href="#n2" name="n2">2</a></span><span style="color:#777">//・・・略</span>
<span class="line-numbers"> <a href="#n3" name="n3">3</a></span><span style="color:#080;font-weight:bold">use</span> <span style="color:#036;font-weight:bold">Kumamidori</span>\<span style="color:#036;font-weight:bold">Transportation</span>\<span style="color:#036;font-weight:bold">Model</span>\<span style="color:#036;font-weight:bold">ModelFactory</span>;
<span class="line-numbers"> <a href="#n4" name="n4">4</a></span>
<span class="line-numbers"> <a href="#n5" name="n5">5</a></span><span style="color:#080;font-weight:bold">class</span> <span style="color:#B06;font-weight:bold">ApplicationPage</span> <span style="color:#080;font-weight:bold">extends</span> <span style="color:#036;font-weight:bold">AbstractPage</span>
<span class="line-numbers"> <a href="#n6" name="n6">6</a></span>{
<span class="line-numbers"> <a href="#n7" name="n7">7</a></span> <span style="color:#080;font-weight:bold">protected</span> <span style="color:#963">$model_factory</span>;
<span class="line-numbers"> <a href="#n8" name="n8">8</a></span>
<span class="line-numbers"> <a href="#n9" name="n9">9</a></span> <span style="color:#080;font-weight:bold">public</span> <span style="color:#080;font-weight:bold">function</span> <span style="color:#06B;font-weight:bold">setModelFactory</span>(<span style="color:#036;font-weight:bold">ModelFactory</span> <span style="color:#963">$model_factory</span>)
<span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span> {
<span class="line-numbers"><a href="#n11" name="n11">11</a></span> <span style="color:#963">$this</span>-&gt;model_factory = <span style="color:#963">$model_factory</span>;
<span class="line-numbers"><a href="#n12" name="n12">12</a></span> }
<span class="line-numbers"><a href="#n13" name="n13">13</a></span>}
</pre></div>
</div>
</div>
<ul>
<li>設定</li>
</ul>
<div><div class="CodeRay">
<div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span><span style="color:#777">// default params for the model factory</span>
<span class="line-numbers"> <a href="#n2" name="n2">2</a></span><span style="color:#963">$di</span>-&gt;params[<span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">Kumamidori</span><span style="color:#D20">\T</span><span style="color:#D20">ransportation</span><span style="color:#D20">\M</span><span style="color:#D20">odel</span><span style="color:#D20">\M</span><span style="color:#D20">odelFactory</span><span style="color:#710">'</span></span>] = [
<span class="line-numbers"> <a href="#n3" name="n3">3</a></span> <span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">map</span><span style="color:#710">'</span></span> =&gt; [
<span class="line-numbers"> <a href="#n4" name="n4">4</a></span> <span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">transportation</span><span style="color:#710">'</span></span> =&gt; <span style="color:#963">$di</span>-&gt;newFactory(<span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">Kumamidori</span><span style="color:#D20">\T</span><span style="color:#D20">ransportation</span><span style="color:#D20">\M</span><span style="color:#D20">odel</span><span style="color:#D20">\T</span><span style="color:#D20">ransportation</span><span style="color:#D20">\T</span><span style="color:#D20">ransportationRecord</span><span style="color:#710">'</span></span>),
<span class="line-numbers"> <a href="#n5" name="n5">5</a></span> ]
<span class="line-numbers"> <a href="#n6" name="n6">6</a></span>];
<span class="line-numbers"> <a href="#n7" name="n7">7</a></span><span style="color:#777">// define the model factory service</span>
<span class="line-numbers"> <a href="#n8" name="n8">8</a></span><span style="color:#963">$di</span>-&gt;set(<span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">model_factory</span><span style="color:#710">'</span></span>, <span style="color:#963">$di</span>-&gt;lazyNew(<span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">Kumamidori</span><span style="color:#D20">\T</span><span style="color:#D20">ransportation</span><span style="color:#D20">\M</span><span style="color:#D20">odel</span><span style="color:#D20">\M</span><span style="color:#D20">odelFactory</span><span style="color:#710">'</span></span>));
<span class="line-numbers"> <a href="#n9" name="n9">9</a></span><span style="color:#777">// after construction, the Forge will call ApplicationPage::setModelFactory()</span>
<span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span><span style="color:#777">// and inject the 'model_factory' service object</span>
<span class="line-numbers"><a href="#n11" name="n11">11</a></span><span style="color:#963">$di</span>-&gt;setter[<span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">Kumamidori</span><span style="color:#D20">\T</span><span style="color:#D20">ransportation</span><span style="color:#D20">\W</span><span style="color:#D20">eb</span><span style="color:#D20">\A</span><span style="color:#D20">pplicationPage</span><span style="color:#710">'</span></span>][<span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">setModelFactory</span><span style="color:#710">'</span></span>] = <span style="color:#963">$di</span>-&gt;lazyGet(<span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">model_factory</span><span style="color:#710">'</span></span>);
</pre></div>
</div>
</div>
<h3 id="section-9">コントローラ</h3>
<p><code>HelloAura/src/Kumamidori/Transportation/Web/Home/HomePage.php</code></p>
<div><div class="CodeRay">
<div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span><span style="font-weight:bold;color:#666">&lt;?php</span>
<span class="line-numbers"> <a href="#n2" name="n2">2</a></span><span style="color:#777">//略</span>
<span class="line-numbers"> <a href="#n3" name="n3">3</a></span><span style="color:#080;font-weight:bold">class</span> <span style="color:#B06;font-weight:bold">HomePage</span> <span style="color:#080;font-weight:bold">extends</span> <span style="color:#036;font-weight:bold">ApplicationPage</span>
<span class="line-numbers"> <a href="#n4" name="n4">4</a></span>{
<span class="line-numbers"> <a href="#n5" name="n5">5</a></span> <span style="color:#080;font-weight:bold">public</span> <span style="color:#080;font-weight:bold">function</span> <span style="color:#06B;font-weight:bold">actionIndex</span>()
<span class="line-numbers"> <a href="#n6" name="n6">6</a></span> {
<span class="line-numbers"> <a href="#n7" name="n7">7</a></span> <span style="color:#963">$transportation</span> = <span style="color:#963">$this</span>-&gt;model_factory-&gt;newInstance(<span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">transportation</span><span style="color:#710">'</span></span>); <span style="color:#777">//<※自分でnewしないでファクトリで取得</span>
<span class="line-numbers"> <a href="#n8" name="n8">8</a></span> <span style="color:#963">$total</span> = <span style="color:#963">$transportation</span>-&gt;getTotal();
<span class="line-numbers"> <a href="#n9" name="n9">9</a></span> <span style="color:#963">$cargoList</span> = <span style="color:#963">$transportation</span>-&gt;getCargoList();
<span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span>
<span class="line-numbers"><a href="#n11" name="n11">11</a></span> <span style="color:#963">$this</span>-&gt;data = [
<span class="line-numbers"><a href="#n12" name="n12">12</a></span> <span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">total</span><span style="color:#710">'</span></span> =&gt; <span style="color:#963">$total</span>,
<span class="line-numbers"><a href="#n13" name="n13">13</a></span> <span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">cargo_list</span><span style="color:#710">'</span></span> =&gt; <span style="color:#963">$cargoList</span>
<span class="line-numbers"><a href="#n14" name="n14">14</a></span> ];
<span class="line-numbers"><a href="#n15" name="n15">15</a></span> <span style="color:#963">$this</span>-&gt;view = <span style="background-color:hsla(0,100%,50%,0.05)"><span style="color:#710">'</span><span style="color:#D20">index</span><span style="color:#710">'</span></span>;
<span class="line-numbers"><a href="#n16" name="n16">16</a></span> }
<span class="line-numbers"><a href="#n17" name="n17">17</a></span>}
</pre></div>
</div>
</div>
<h3 id="section-10">今日はここまで</h3>
<p>DIコンテナでできること、よく出てくる基本用語については、これでちょっとイメージがついてきた気がします。
設計としての特質については分かっていないので、勉強していきたいなと。</p>
<p>分かっていないこと、素朴な疑問をメモ。</p>
<ul>
<li>LL(動的型付け言語)において、PHPだけが(違う?)DI/ServiceLocator主流になったのはなぜ?</li>
<li>→ モックテストができるようになり、Trait がついても、DIが良いとされたのはなぜ?</li>
<li>Rubyの人たちはオープンクラスがあるからそうならなかったの?<全然わかってなくて書いてます</li>
</ul>
<h3 id="section-11">関連情報リンクメモ</h3>
<ul>
<li><a href="http://www.bear-project.net/blog/first-di-framework" target="_blank">初めてのDIフレームワーク</a></li>
<li><a href="http://blog.tojiru.net/article/304867046.html" target="_blank">PHPのDIで動的にオブジェクトを確保する考察</a></li>
<li><a href="http://www.bear-project.net/blog/2011/10/ray-di-on-aura-di/" target="_blank">Ray.Di on Aura.Di</a></li>
</ul>
<h3 id="section-12">追記</h3>
<p>アドバイスを頂いたので貼らせて頂きます(ありがとうございます)。</p>
<ul>
<li>
<p><a href="https://twitter.com/ktz_alias/status/416426298018238464" target="_blank">@ktz_alias さんより:@kuma_nana さっきRTで流れてきたので、亀レスになりますが、疑問点のtraitかDIかについて。どちらも依存を解決する手法で、乱暴に分類すると、traitは静的解決。DIは動的(実行時)解決。</a></p>
</li>
<li>
<p><a href="https://twitter.com/ktz_alias/status/416426966330245120" target="_blank">たとえばデータベース接続。開発用、単体テスト用、結合テスト用などで使い分けようとすると、接続先を動的に解決する必要が出てきます。この用途にはDIが適しているでしょう。</a></p>
</li>
<li>
<p><a href="https://twitter.com/ktz_alias/status/416427188791934976" target="_blank">一方、貨物を輸送するというコンテキストは、貨物と輸送ロールが静的に結びついているため、traitが適していると思います。</a></p>
</li>
</ul>
</content>
</entry>
<entry>
<title>Aura for PHP で Hello World(第12回関西PHP勉強会に参加してきた)</title>
<link href="http://kumamidori.github.io/php/2013/12/22/auraphp-kansai-php-study"/>
<updated>2013-12-22T00:00:00Z</updated>
<id>http://kumamidori.github.io/php/2013/12/22/auraphp-kansai-php-study</id>
<content type="html">
<p>第12回関西PHP勉強会に参加しました。もくもく会でした。</p>
<p>各自、好きな作業をする、という趣旨で、私は「フレームワーク、<a href="http://auraphp.com/" target="_blank">Aura for PHP</a>をさわってみる」というテーマにしました。</p>
<h3 id="section">このテーマを選んだ理由</h3>
<p>これのマニュアル翻訳を一部やったので、実際にさわってみようと思って。
<a href="http://auraphp.com/manuals/v1/ja/" target="_blank">http://auraphp.com/manuals/v1/ja/</a></p>
<h3 id="aura-for-php-">Aura for PHP の特徴</h3>
<ul>
<li><a href="http://auraphp.com/" target="_blank">公式マニュアル</a>より引用:</li>
</ul>
<blockquote>
<p>Auraの主な目標は、標準に準拠し、どのコードベースでも使うことができて、
高品質にテストされた、疎結合なライブラリを提供することです。</p>
</blockquote>
<ul>
<li>「疎結合なライブラリ」とは?</li>
</ul>
<p>Auraのドキュメントに、「Library First, Framework Second」とあります。
独立したパッケージの集合なので、開発者の好きなように、プロジェクト全体で使うこともできれば、
一部だけを取り入れて使うということもできます。</p>
<p>Composerの流れを受けて出てきたコンポーネント志向、ということかなと思います。</p>
<ul>
<li>リードは、Zendのコミッタ等された、PHP-FIG策定メンバー、<a href="http://paul-m-jones.com/" target="_blank">pmjones</a>さん。</li>
</ul>
<h3 id="hello-world-">とりあえず Hello World するには?</h3>
<p><a href="http://auraphp.com/framework" target="_blank">http://auraphp.com/framework</a></p>
<p>↑この手順ママで即動くので省きます。
注意点は、「Remove the Demo Package」というセクションの手順を飛ばさないでやることくらい。</p>
<h3 id="section-1">作ったもの</h3>
<p><a href="https://github.com/kumamidori/HelloAura" target="_blank">https://github.com/kumamidori/HelloAura</a></p>
<strike>ちょっとしか動かせていない!ので、コードの説明は省きます。もうちょっと理解が進んだら、また別記事として書きたいところ。</strike>
<p>→ 後日ちょっと進められたので、別記事を<a href="http://kumamidori.github.io/php/2013/12/23/auraphp-01-di" target="_blank">こちら</a>に書きました。</p>
<p>もくもく会の当日お世話になった皆様、ありがとうございました!</p>
<h3 id="section-2">関連リンク:イベント参加者レポート</h3>
<ul>
<li><a href="http://www.1x1.jp/blog/2013/12/phpdbg.html">PHP 5.6 に採用されるデバッガ phpdbg を使ってみた</a></li>
<li><a href="http://tanakahisateru.hatenablog.jp/entry/2013/12/22/030817">PHP関西勉強会でYii2-alphaを試しました</a></li>
</ul>
<h4 id="aura-for-php">関連リンク:Aura for PHPの紹介記事</h4>
<ul>
<li><a href="http://yuubiseiharukana.blog.shinobi.jp/Entry/1168/" target="_blank">http://yuubiseiharukana.blog.shinobi.jp/Entry/1168/</a></li>
</ul>
</content>
</entry>
<entry>
<title>大阪でIT系勉強会ができる会議室</title>
<link href="http://kumamidori.github.io/diary/2013/12/19/osaka-study-space"/>
<updated>2013-12-19T00:00:00Z</updated>
<id>http://kumamidori.github.io/diary/2013/12/19/osaka-study-space</id>
<content type="html">
<p>会社の先輩方や @atakig さんから、大阪市内で借りられる会議室のことを教えてもらったのでメモ。</p>
<p>条件:</p>
<ul>
<li>会議室スペースを希望(他の人の会話が聞こえてこない方が良い)</li>
<li>プロジェクターあると良い。</li>
<li>土日利用可</li>
</ul>
<h4 id="section">大阪市立市民交流センター</h4>
<ul>
<li><a href="http://www.skc-higashiyodogawa.jp/html/chinshitu.html">市民交流センターひがしよどがわ</a>
<ul>
<li>Ruby関西で使ったことがあると聞いて。安くてプロジェクタもあるのが良い。</li>
</ul>
</li>
<li><a href="http://www.creo-osaka.or.jp/north/">クレオ大阪北 大阪市立男女共同参画センター</a>
<ul>
<li>新大阪Ruby が使っていると聞いて。 </li>
</ul>
</li>
</ul>
<h4 id="section-1">無料スペースのリンク集</h4>
<ul>
<li>