symfony1.4.9でのテンプレートコード リファクタリング

突貫で作業していると、案外車輪を何度も作ってます。

ある程度作業が進むと、リファクタリングを心がけてはいますが、テンプレートコードの再利用に関しては、なかなか複雑。

そこで、一旦まとめてみることにしました。

 

  • インクルード(include)
  • パーシャル(partial)
  • コンポーネント(component)
  • コンポーネントスロット(component_slot)
  • スロット(slot)

インクルード(include)

  • 対象:
    • 共通化された静的なHTMLや、
    • actionなどに依存しないPHPコード
  • 例:
    • 静的メニュー
    • フッター

<?php include(sfConfig::get('sf_app_template_dir'). '/footer.php')) ?>

 

パーシャル(partial)

  • 対象:
    • 上記、インクルードにactionから引数を渡せる
  • 例:
    • ヘッダー(タイトルの動的変更など)
  • 保存先例:
    • apps/<<appname>>/templates/_title.php

// apps/&lt;&lt;appname&gt;&gt;/templates/layout.php

&lt;?php include_partial('global/title', array('title' =&gt; $title)) ?&gt;

 

コンポーネント(component)

  • 対象:
    • パーシャルよりもさらに独立したロジックが必要な場合に利用
    • ログインフォームを含むようなサイドバーや、actionとロジックを分けて表示させるような場合に利用
    • テンプレートの他、actions/components.class.phpが必要になる
  • 対象:
    • サイドバー
    • ログインフォームなど
  • 保存先例:
    • apps/<<appname>>/modules/<<modulename>>/templates/<<componentname>>
    • apps/<<appname>>modules/<<modulename>>/actions/components.class.php

// apps/&lt;&lt;appname&gt;&gt;/modules/&lt;&lt;modulename&gt;&gt;/templates/&lt;&lt;componentname&gt;&gt;

&lt;?php include_component('&lt;&lt;modulename&gt;&gt;', '&lt;&lt;componentname&gt;&gt;', array('user' =&gt; $user)) ?&gt;

 


&lt;?php

class &lt;&lt;modulename&gt;&gt;Components extends sfComponents
{

public function execute&lt;&lt;componentname&gt;&gt;

{

...

}

}

?&gt;

 

コンポーネントスロット(component_slot)

  • 対象:
    • コンポーネントに呼び出しのたびに変化するような場合に利用
    • 呼び出し側は同じ場合でも、view.ymlによって呼び出すロジックを変更する

&lt;? php include_component_slot('sidebar') ?&gt;

 


// apps/&lt;&lt;appname&gt;&gt;/config/view.yml

default:

components:

sidebar: [ menu, default ]

&nbsp;

default:

components:

sidebar: [menu, user ]

 

スロット(slot)

対象:

  • 1回のレスポンスで部品化したい場合に、2度目以降をスロットとして利用できる

&lt;?php slot('hoge') ?&gt;

hogehoge

&lt;?php end_slot() ?&gt;

&nbsp;

&lt;?php include_stlot('hoge') ?&gt;

 

 

ややこしいが、テンプレートの部品化、リファクタリングを行っていくには必要な知識なので、習得しておきたいところ。