忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2024/11/24 18:38 |
Symfony1.4 11日目その4
前回の続き

さて、ブラウザから投稿してみると、投稿後は編集画面に移動します。
この時点ではまだjobeet_job.is_activated=0なので、フロントには表示されていません。
Publishリンクを踏んで公開するようにしてみましょう。

/test/functional/frontend/jobActionsTest.php
1
2
3
4
5
6
7
8
9
10
11
<?php
$browser->info('  3.3 - On the preview page, you can publish the job')->
  createJob(array('position' => 'FOO1'))->
  click('Publish', array(), array('method' => 'put', '_with_csrf' => true))->
  with('doctrine')->begin()->
    check('JobeetJob', array(
      'position'     => 'FOO1',
      'is_activated' => true,
    ))->
  end()
;

>php test/functional/frontend/jobActionsTest.php
>   3.3 - On the preview page, you can publish the job
# get /job/new
# post /job
# put /job/e83769f22dcaf47b37b3b1c22b8e2d4586f6e6d8/publish
ok 1 - JobeetJob objects that matches the criteria have been found

click()の第三引数にはクリックする際の付加情報を記述します。
この場合はメソッドをPUTに、CSRFプロテクションを有効にしています。
ということらしいのですが意味がわかりません。
該当のリンクをブラウザで見てみましょう。

1
2
3
4
5
6
7
8
9
10
11
12
13
<a onclick="var f = document.createElement('form'); 
  f.style.display = 'none'; this.parentNode.appendChild(f); 
  f.method = 'post';
  f.action = this.href;
  var m = document.createElement('input');
  m.setAttribute('type', 'hidden');
  m.setAttribute('name', 'sf_method');
  m.setAttribute('value', 'put');
  f.appendChild(m);
  f.submit();
  return false;"
  href="/frontend_dev.php/job/
  151bef1f9cf92b7b561752e4ad35cfe932a92f4b/publish"&gt;Publish&lt;/a>

なんだこれ。

実はルーティングによって投稿記事の編集はPUTメソッドを使えということになっています。
勿論対応ブラウザやサーバなんて無いのでSymfonyではPOSTで擬似的に実現しています。
その疑似PUTを指定するのが'method' => 'put'です。
これを外してしまうとデフォルトのメソッド(GETかPOSTか不明)で送信されてしまい、エラーになります。

>php test/functional/frontend/jobActionsTest.php
# get /job/new
# post /job
# get /job/700cf9ac61d7abdd35e88720cf13be6b9d3584d2/publish
not ok 1 - JobeetJob objects that matches the criteria have been found
#     Failed test (symfony/plugins/sfDoctrinePlugin/lib/test/sfTesterDoctrine.class.php at line 90)

次の_with_csrfについては全く意味がわかりません。
CSRFがどうこうと言ってますが別に外しても普通に動くし一体何の意味があるんだ。
リクエストのクエリを見るメソッドとか無いのかね?

PublishのかわりにDeleteリンクを押せば削除できますが、その流れもPublishとほぼ一緒です。
DeleteリンクはDELETEメソッドを使用することになっていますが、こちらも無論擬似的実現です。

/test/functional/frontend/jobActionsTest.php
1
2
3
4
5
6
7
8
9
10
<?php
$browser->info('  3.3 - On the preview page, you can publish the job')->
  createJob(array('position' => 'FOO2'))->
  click('Delete', array(), array('method' => 'delete', '_with_csrf' => true))->
  with('doctrine')->begin()->
    check('JobeetJob', array(
      'position'     => 'FOO2',
    ), false)->
  end()
;

Deleteリンクを踏むと投稿が削除され、position='F002'の投稿が見つからないよ、という状態になることを確認できます。

>php test/functional/frontend/jobActionsTest.php
>   3.3 - On the preview page, you can publish the job
# get /job/new
# post /job
# delete /job/34b28d5f5d5f3a7bc32c8b91ff61ea3e6ee8123f
ok 1 - no JobeetJob object that matches the criteria has been found
PR


2011/01/10 21:15 | Comments(0) | TrackBack() | PHP

トラックバック

トラックバックURL:

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<ノムリッシュ VS EOE | HOME | 買ったものリスト 2011/01/09>>
忍者ブログ[PR]