Zend-framework-view-layer
Zend Framework-ビューレイヤー
ビューレイヤーは、MVCアプリケーションのプレゼンテーションレイヤーです。 プレゼンテーションロジックからアプリケーションロジックを分離します。 典型的なPHP Webアプリケーションでは、すべてのビジネスロジックとデザインが混在しています。 混合により、小規模プロジェクトでの開発を高速化できます。 しかし、多くの高レベルのアーキテクチャが関係する大規模なプロジェクトでは、惨めな失敗に終わります。 Webアプリケーションのデザインを変更するには、開発者もビジネスロジックで作業する必要があります。 これは壊滅的な結果となり、ビジネスロジックが破壊される可能性があります。
Zend Frameworkは、よく考えられた、クリーンで、柔軟で拡張可能なビューレイヤーを提供します。 Viewレイヤーは別のモジュール Zend/View として利用可能で、 Zend/Mvc モジュールとうまく統合されます。 Zend View Layerは、互いにうまくやり取りする複数のコンポーネントに分離されています。
そのさまざまなコンポーネントは次のとおりです-
- 変数コンテナ-ビューレイヤーのデータを保持します。
- モデルの表示-可変コンテナとデザインテンプレートを保持します。
- レンダラー-ビューモデルのデータとテンプレートを処理し、デザイン表現を出力します。おそらく最終的なHTML出力です。
- Resolvers -Rendererが使用できるように、View Modelで利用可能なテンプレートを解決します。
- * View(Zend \ View \ View)*-リクエストをレンダラーにマッピングし、レンダラーをレスポンスにマッピングします。
- レンダリング戦略-ビューがリクエストをレンダラーにマッピングするために使用します。
- 応答戦略-Viewがレンダラーを応答にマッピングするために使用します。
ビューレイヤー View は ViewModel を処理し、 Resolver を使用してテンプレートを解決し、 Rendering Strategy を使用してレンダリングし、最後に Response Renderer を使用して出力します。
レイヤー構成の表示
コントローラーと同様に、Viewレイヤーは、- module.config.php と呼ばれるモジュールの構成ファイルで構成できます。 主な構成は、テンプレートを配置する場所を指定することです。 これは、「module.config.php」に次の構成を追加することで実現できます。
'view_manager' => [
'template_path_stack' => ['tutorial' => __DIR__ . '/../view',],
]
デフォルトでは、ビューレイヤーには、そのすべてのコンポーネントのデフォルトの動作があります。 たとえば、 ViewModel は、「小文字のモジュール名/小文字のコントローラー名/小文字のアクション名」ルールによって、テンプレートルート内のコントローラーのアクションのテンプレート名を解決します。 ただし、これはViewModelの* setTemplate()*メソッドによってオーバーライドできます。
コントローラーとビューレイヤー
デフォルトでは、コントローラーはビューレイヤーにデータを送信する必要はありません。 適切な場所にテンプレートを書くだけで十分です。
たとえば、 TutorialController の例では、テンプレートを myapp/module/Tutorial/view/tutorial/tutorial/index.phtml に配置する必要があります。 index.phtml はPHPベースのテンプレートを参照し、PHPRendererによってレンダリングされます。 json 出力には JsonRenderer 、 rss および atom 出力には FeedRenderer など、他のレンダラーがあります。
完全なリストは次のとおりです-
<?php
namespace Tutorial\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
class TutorialController extends AbstractActionController {
public function indexAction() {
}
}
Zendアプリケーションテンプレート
<div class = "row content">
<h3>This is my first Zend application</h3>
</div>
最後に、 Tutorial モジュールが正常に完成しました。URLを使用してアクセスできます。
ビューレイヤーへのデータの受け渡し
データをビューレイヤーに送信する最も簡単な方法は、 ViewModel 引数を使用することです。 変更された indexAction メソッドは次のとおりです-
public function indexAction() {
$view = new ViewModel([
'message' => 'Hello, Tutorial'
]);
return $view;
}
今、次のように index.phtml ファイルを変更します-
<div class = "row content">
<h3>This is my first Zend application</h3>
<h4><?php echo $this->message?></h4>
</div>
ヘルパーを表示
ビューヘルパーは、テンプレートで使用される小さなアトミック関数を作成するために使用されます。 Zendフレームワークは、標準のビューヘルパーを作成するためのインターフェイスZend \ View \ Helper \ HelperInterfaceを提供します。
HelperInterfaceには2つのメソッドしかありません。
* setView()*-このメソッドは、Zend \ View \ Renderer \ RendererInterfaceインスタンス/実装を受け入れます。
* getView()*-そのインスタンスを取得するために使用されます。
*HelperInterface* の完全なコードリストは次のとおりです-
namespace Zend\View\Helper;
use Zend\View\Renderer\RendererInterface as Renderer;
interface HelperInterface {
/* *
* Set the View object
*
* @param Renderer $view
*@return HelperInterface
*/
public function setView(Renderer $view);
/* *
* Get the View object
*
* @return Renderer
*/
public function getView();
}
ビュースクリプトでヘルパーを使用するには、* $ this→ helperName()*を使用してアクセスします。
組み込みヘルパー
Zend Frameworkは、さまざまな目的のために多くの組み込みヘルパー関数を提供します。 zend-mvc で利用可能なビューヘルパーの一部は次のとおりです-
URL
URLヘルパーは、アプリケーションで定義されたルートに一致するURLを生成するために使用されます。
URLヘルパーの定義は次のとおりです-
$this->url($name, $params, $options, $reuseMatchedParameters)
たとえば、チュートリアルモジュールでは、ルートの名前は tutorial であり、2つのパラメーター action および id があります。 以下に示すように、URLヘルパーを使用して2つの異なるURLを生成できます-
<a href = "<? = $this->url('tutorial'); ?>">Tutorial Index</a>
<a href = "<? = $this->url('tutorial', ['action' => 'show', 'id' =>10]); ?>">
Details of Tutorial #10
</a>
結果は次のようになります-
<a href = "/tutorial">Tutorial Index</a>
<a href = "/tutorial/show/10"> Details of Tutorial #10</a>
プレースホルダー
プレースホルダーヘルパーは、ビュースクリプトとビューインスタンス間でコンテンツを保持するために使用されます。 最初にデータを設定し、それを後の段階で使用するオプションを提供します。
たとえば、*会社名*を設定して、他のすべての場所で使用できます。
<?php $this->placeholder('companyname')->set("finddevguides") ?>
<?= $this->placeholder('companyname'); ?>
プレースホルダーは、PHPの配列とオブジェクトから複雑なコンテンツを生成するための高度なオプションを提供します。 テンプレート自体の特定のセクションをキャプチャするオプションもあります。
たとえば、次のコードは、間にあるテンプレートの結果をキャプチャし、 productlist プレースホルダーに保存します。
クラス-製品
class Product {
public $name;
public $description;
}
コントローラ
$p1 = new Product();
$p1->name = 'Car';
$p1->description = 'Car';
$p2 = new Product();
$p2->name = 'Cycle';
$p2->description = 'Cycle';
$view = new ViewModel(['products' => $products]);
テンプレート
<!-- start capture -->
<?php $this->placeholder('productlist')->captureStart();
foreach ($this->products as $product): ?>
<div>
<h2><?= $product->name ?></h2>
<p><?= $product->description ?></p>
</div>
<?php endforeach; ?>
<?php $this->placeholder('productlist')->captureEnd() ?>
<!-- end capture -->
<?= $this->placeholder('productlist') ?>
- 結果 *
<div class = "foo">
<h2>Car</h2>
<p>Car</p>
</div>
<div class = "foo">
<h2>Cycle</h2>
<p>Cycle</p>
</div>
文書型
Doctypeヘルパーは、さまざまなhtml doctypeを生成するために使用されます。* Placeholder *ヘルパーの具体的な実装です。 Doctypeは、ブートストラップファイルと設定ファイルで設定できます。
基本的な使用法を以下に示します-
アプリケーションブートストラップファイル
use Zend\View\Helper\Doctype;
$doctypeHelper = new Doctype();
$doctypeHelper->doctype('XHTML5');
モジュール構成
//module/Application/config/module.config.php:
return [
/*...*/
'view_manager' => [
'doctype' => 'html5',
/*...*/
],
];
- テンプレート *
<?php echo $this->doctype() ?>
HeadTitle
HeadTitleヘルパーは、htmlタイトル要素を生成するために使用されます。* Placeholder *ヘルパーの具体的な実装です。 Zendには、モジュール構成ファイルにタイトルを設定するオプションがあり、サイト、モジュール、コントローラー、アクションなどの任意のレベルで設定できます。 HeadTitleの部分的なコードは次のとおりです-
モジュール
headTitleHelper->append($action);
$headTitleHelper->append($controller);
$headTitleHelper->append($module);
$headTitleHelper->append($siteName);
テンプレート
<?= $this->headTitle() ?>
結果
action - controller - module - Zend Framework
HeadMeta
HeadMetaヘルパーは、htmlメタタグを生成するために使用されます。 これは、プレースホルダーヘルパーの具体的な実装です。
テンプレート-
<?php
$this->headMeta()->appendName('keywords', 'turorialspoint, zend framework, php');
echo $this->headMeta()
?>
結果
<meta name = "keywords" content = "finddevguides, zend framework, php"/>
HeadLink
HeadLinkヘルパーは、外部リソースを含めるHTMLリンクを生成するために使用されます。 これは、プレースホルダーヘルパーの具体的な実装です。
テンプレート
<?php
//setting links in a view script:
$this->headLink(['rel' => 'icon', 'href' => '/img/favicon.ico'], 'PREPEND')
->appendStylesheet('/styles/site.css')
->prependStylesheet('/styles/mystyle.css', 'screen', true, ['id' => 'mystyle']);
//rendering the links from the layout:
echo $this->headLink();
?>
結果
<link href = "/styles/mystyle.css" media = "screen" rel = "stylesheet"
type = "text/css" id = "mystyle">
<link href = "/img/favicon.ico" rel = "icon">
<link href = "/styles/site.css" media = "screen" rel = "stylesheet" type = "text/css">
HeadStyle
HeadStyleヘルパーは、インラインCSSスタイルを生成するために使用されます。 これは、プレースホルダーヘルパーの具体的な実装です。
テンプレート
<?php $this->headStyle()->appendStyle($styles); ?>
<?php echo $this->headStyle() ?>
HeadScript
HeadScriptは、インラインスクリプトを生成したり、外部スクリプトを含めるために使用されます。 これは、プレースホルダーヘルパーの具体的な実装です。
テンプレート
<? $this->headScript()->appendFile(‘/js/sample.js’);?>
<?php echo $this->headScript() ?>
InlineScript
InlineScriptは、htmlテンプレートのheadセクションとbodyセクションの両方でスクリプトを生成するために使用されます。 HeadScriptから派生しています。
HTMLList
HTMLListは、順序付きリストと順序なしリストを生成するために使用されます。 HTMLListの定義は次のとおりです-
定義
htmlList($items, $ordered, $attribs, $escape)
テンプレート
$items = [
'2015',
['March', 'November'],
'2016',
];
echo $this->htmlList($items);
結果
<ul>
<li>2015
<ul>
<li>March</li>
<li>November</li>
</ul>
</li>
<li>2016</li>
</ul>
サイクル
サイクルは、ループ環境で代替を生成するために使用されます。 assign、next、prev機能があります。
コントローラ
$view = new ViewModel(['message' => 'Hello, Tutorial', 'data' => array('One', 'Two')]);
テンプレート
<?php $this->cycle()->assign(['#F0F0F0', '#FFF'], 'colors'); ?>
<table>
<?php foreach ($this->data as $datum): ?>
<tr style = "background-color: <?= $this->cycle()->setName('colors')>next() ?>">
<td><?= $this->escapeHtml($datum) ?></td>
</tr>
<?php endforeach ?>
</table>
結果
<table>
<tr style = "background-color: #F0F0F0">
<td>One</td>
</tr>
<tr style = "background-color: #FFF">
<td>Two</td>
</tr>
</table>
他のいくつかの重要な組み込みヘルパーは次のとおりです-
- BasePath -BasePathは、アプリケーションのルートのパブリックフォルダーのパスを生成するために使用されます。
- Partial -Partialは、独自の変数スコープで特定のテンプレートをレンダリングするために使用されます。
- PartialLoop -PartialLoopはPartialに似ていますが、ループ環境で使用されます。
- Identity -Identityは、認証サービスからログインしているユーザーのIDを取得するために使用されます。
- JSON -JSONは、出力がJSON形式である落ち着いた環境で使用されます。 適切なHTTPヘッダーを発行し、レイアウトの概念を無効にします。
Zend Frameworkには、* i18nヘルパー、フォームヘルパー、ページネーションヘルパー、ナビゲーションヘルパー*など、まだ多くのヘルパーがあります。
ビューヘルパーの作成
Zend Frameworkは、ビューヘルパーを記述するための HelperInterface を実装する組み込みの AbstractHelper を提供します。
新しいヘルパーの作成に必要な手順は次のとおりです-
*ステップ1 *-クラスZend \ View \ Helper \ AbstractHelperを拡張します。
ステップ2 *- __ invoke()*関数をオーバーライドします。
ステップ3 *- module.config.phpファイルで構成を設定します*。
*ステップ4 *-ビュースクリプトでビューヘルパーを使用します。
*TestHelper* を作成しましょう
myapp/module/Tutorial/src/ViewディレクトリにHelperフォルダーを作成します*。 ヘルパーディレクトリ TestHelper.php 内に TestHelper を記述します。
完全なリストは次のとおりです-
<?php
namespace Tutorial\View\Helper;
use Zend\View\Helper\AbstractHelper;
class TestHelper extends AbstractHelper {
public function __invoke() {
$output = "I am from test helper";
return htmlspecialchars($output, ENT_QUOTES, 'UTF-8');
}
}
*module.config.php* で構成を設定します。
'view_helpers' => [
'aliases' => [
'testHelper' => View\Helper\TestHelper::class,
],
'factories' => [
View\Helper\TestHelper::class => InvokableFactory::class,
],
],
*about* ビュースクリプトで新しく作成された *TestHelper* を使用します。
<?= $this->testHelper() ?>