CakePHP 1 to 2 Migration tips 100

5,565 views

Published on

Migration tips of CakePHP 1.2 to 2.3

Published in: Technology

CakePHP 1 to 2 Migration tips 100

  1. 1. CakePHP 1->2Migration Tips 100 2013/2/14 Cake Beer Talk
  2. 2. Yasushi Ichikawa@cakephper / @ichikawayhttp://d.hatena.ne.jp/cakephperFrom 福岡Fukuoka.php 主催
  3. 3. 発売中!! CakePHP2 実践入門  @cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
  4. 4. Upgrade Shell
  5. 5. Upgrade Shell●Cake1.3 のコードを自動変換● 全自動ではありません @ichikaway http://cake.eizoku.com/blog/
  6. 6. Upgrade Shell$ cd 13/cake/app$ lib/Cake/Console/cake upgrade @ichikaway http://cake.eizoku.com/blog/
  7. 7. Upgrade Shelldry-run オプションcake upgrade all --dry-run実行ログのみ表示コードは書き換えない @ichikaway http://cake.eizoku.com/blog/
  8. 8. Upgrade Shellバージョン管理git など @ichikaway http://cake.eizoku.com/blog/
  9. 9. Upgrade Shell●all ●全てのオプションを実行●tests ●テスト名の変更など●locations ●ファイル / フォルダ名変更 @ichikaway http://cake.eizoku.com/blog/
  10. 10. Upgrade Shell●i18n ●__() 関係の変更 ●true 廃止、 echo 追加●helpers ●ヘルパー呼出し $this 経由●basics ●廃止 Global 関数置換 @ichikaway http://cake.eizoku.com/blog/
  11. 11. Upgrade Shell●request ● $this->request->xxx() ● data,params,here,action●configure ● Configure::read() 置換●constants ●定数の変更 @ichikaway http://cake.eizoku.com/blog/
  12. 12. Upgrade Shell●components ●Component クラスを継承するように●exceptions ●cakeError を例外に置換 ●error400, error404, error500 @ichikaway http://cake.eizoku.com/blog/
  13. 13. Upgrade Shell●cake upgrade all の後に ...● webroot 入替え● database.php 書き換え ●//driver => mysql, ● datasource => Database/Mysql,● core.php 入替え (APC off ?)● routes.php 入替え● tmp キャッシュ消去 @ichikaway http://cake.eizoku.com/blog/
  14. 14. CakePHP1.2 → 2.3 移行中
  15. 15. ● 1.2 のバリデーション廃止 ● VALID_NOT_EMPTY, VALID_NUMBER cd Model sed -i -e "s/VALID_NOT_EMPTY/notEmpty/g" *.php @cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
  16. 16. ● 極力 App::uses() を使う ( パフォーマンス向上 ) ● App::import() は最低限にとどめる例 : Vendor の読込みの置換sed -i -e"s#App::import(Vendor, (.*))#App::uses(1, Vendor)#g" *.php@cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
  17. 17. ● Controller で AppController を App::uses()● Model で AppModel を App::uses()例 : AppModel の読込み ( 階層構造対応)find ./ -name "*.php" |xargs sed -i"s/class (.*) extends AppModel/ App::uses(AppModel, Model);nclass 1 extends AppModel/g"@cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
  18. 18. ● upgrade shell ● [ 注意 ] コンポーネント内の $this->data まで置換される● $this->controller のような持ち方をしているものを 置換する必要あり● 例: $this->controller->data $this->controller->request->data @cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
  19. 19. ● e() や a() が廃止● upgrade shell は最長マッチで置換 ● 1 行に e() が複数個ある場合は注意 ● 例 : e(foo); e(bar); @cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
  20. 20. ● 移行作業は常に Syntax check しながら進む● find . -type f -name "*.php" -exec php -l {} ; @cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
  21. 21. ● upgrade shell はコントローラなどがディレクトリ階 層化されていると、それをフラットにするため注意 ● controller/foo/bar.php → Controller/Bar.php ● 自力でリネーム● 階層化は Cake2 から自動探索しない ● App::build() で定義 (Config/bootstrap.php) AutoAppBuildPlugin  ● – https://github.com/ichikaway/AutoAppBuild@cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
  22. 22. ● upgarde shell のファイルリネームは、中のクラス 定義を見てファイル名にする 1 ファイルに複数クラスある場合は要注意 ● ● 最初のクラス定義のクラス名をファイル名にしてしまう //FooControllerTest.php なのに TestFooController.php に置換される <?php class TestFooController extends FooController {  } class FooControllerTest extends CakeTestCase{ }@cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
  23. 23. ● 古い find() の定義 ● findAll, findCount, findList 廃止 ● find($conditions,xxx,xxx) 廃止● 探す ● grep find -R ./* | egrep -v "find(first|find(all|find(list| find(count|findById"● 置き換える ● find(all, $params); //all は全て小文字! ●find($conditions,xxx,xxx) ● デフォルトが first 指定されている ● find(first,$params) に変える@cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
  24. 24. ● JavascriptHelper 廃止 (JsHelper にする) ● helpers = array(Js);View での呼び出し方法 (foo.js)$this->Html->script(foo, array(inline=>false));Javascript コードのべた書き方法も変更  旧 : $this->addScript($javascript->codeBlock()) 新 : $this->addScript($this->Html->scriptBlock())@cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
  25. 25. Behavior の beforeFind メソッドで戻り値を必ず返すことhttp://php-tips.com/php/cakephp-php/2012/02 @cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
  26. 26. Set クラスは Hash クラスに(しなくても動くけど)Set::extract(/Model/id, $dataArray);  ↓ Hash::extract($dataArray, {n}.Model.id);@cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
  27. 27. ● Form::select() の API 変更旧$this->Form->select( "month", $month, $month, array(), –);新$this->Form->select(  "month", $month, array(value => $month, empty => –));@cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
  28. 28. ● view の renderElement を element に置換find ./ -name "*.ctp" | xargs sed -i s/renderElement(/element(/g @cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
  29. 29. ● Controller の __construct() に手を入れている場合function __construct($request, $response){ parent::__construct($request, $response);} @cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
  30. 30. テストの移行
  31. 31. ● 廃止メソッド ● start(), startTest(), end(), endTest()● 置き換え ● setUp(), tearDown() @cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
  32. 32. ● 移行 Tips ではないが。。。。 ● テストモデルの生成時に alias セット ● ClassRegistry::init(array( class => TestHogeModel, alias => HogeModel) ); @cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
  33. 33. ● dbConfig が勝手に test になってしまう問題 ● Model::useDbConfig には test_xxx という規約 ● wordpress のような文字列を指定していると test という dbConfig に強制的に変更されてしまう – test_wordpress で対応 @cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
  34. 34. ● phpunit と web の test.php が tmp の cache を共 有して権限の取り合いになってしまう問題 ● tmp フォルダをそれぞれ分ける – tmp/consoletest, tmp/webtest ● app/Console/cake.php に TMP 定数を追加 – ShellDispatcher::run() の前に @cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
  35. 35. $app_dir = dirname(dirname(__FILE__)); define(TMP, $app_dir . /tmp/console/); unset($app_dir); if(!is_dir(TMP)) { mkdir(TMP, 0777); } if(!is_dir(TMP . /cache)) { mkdir(TMP . /cache, 0777); } if(!is_dir(TMP . /cache/persistent)) { mkdir(TMP . /cache/persistent, 0777); } if(!is_dir(TMP . /cache/models)) { mkdir(TMP . /cache/models, 0777); } if(!is_dir(TMP . /cache/views)) { mkdir(TMP . /cache/views, 0777); } if(!is_dir(TMP . /logs)) { mkdir(TMP . /logs, 0777); } if(!is_dir(TMP . /tests)) { mkdir(TMP . /tests, 0777); }@cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
  36. 36. ● Component 単体テスト ● Component オブジェクト生成 $this->Foo = new BarComponent(new ComponentCollection()); @cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
  37. 37. ● コントローラのオブジェクト生成、コンポーネント利用$this->Con= new TestFooController(new CakeRequest(), new CakeResponse());$this->Con->constructClasses();$this->Con->Components->init($this->Con);$this->Con->MyHogeComponent->startup($this->Con);  @cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
  38. 38. ● CakeTestCase::testAction() 廃止 ● ControllerTestCase を継承すること 継承できない場合 App::uses(ControllerTestCase, TestSuite); class MyControllerTestCase extends ControllerTestCase { }  $this->ControllerTestCase = new MyControllerTestCase(); $this->ControllerTestCase->testAction(/foo/bar);@cakephper / @ichikaway http://d.hatena.ne.jp/cakephper
  39. 39. CakePHP 1->2Migration Tips 31/100 ありがとうございました!

×