ビュー
ビューは、単なる Web ページ、またはヘッダー、フッター、サイドバーなどのページの断片です。実際、ビューは、このタイプの階層が必要な場合、他のビュー(他のビュー内など)に柔軟に埋め込むことができます。
ビューは直接呼び出されることはなく、コントローラーまたは ビュールート によってロードされる必要があります。
MVC フレームワークでは、コントローラーが交通整理の役割を果たすため、特定のビューを取得する役割を担っていることに注意してください。コントローラー のページを読んでいない場合は、先に進む前に読んでください。
コントローラーのページで作成したコントローラーの例を使用して、ビューを追加してみましょう。
ビューの作成
テキストエディターを使用して、**blog_view.php** という名前のファイルを作成し、次の内容を記述します。
<html>
<head>
<title>My Blog</title>
</head>
<body>
<h1>Welcome to my Blog!</h1>
</body>
</html>
次に、ファイルを **app/Views** ディレクトリに保存します。
ビューの表示
特定のビューファイルを読み込んで表示するには、コントローラーで次のコードを使用します。
return view('name');
ここで、*name* はビューファイルの名前です。
重要
ファイル拡張子が省略されている場合、ビューは **.php** 拡張子で終わることが想定されます。
次に、**app/Controllers** ディレクトリに **Blog.php** という名前のファイルを作成し、次の内容を記述します。
<?php
namespace App\Controllers;
class Blog extends BaseController
{
public function index()
{
return view('blog_view');
}
}
**app/Config/Routes.php** にあるルーティングファイルを開き、「ルート定義」を探します。次のコードを追加します。
use App\Controllers\Blog;
$routes->get('blog', [Blog::class, 'index']);
サイトにアクセスすると、新しいビューが表示されます。URL は次のようになります。
example.com/index.php/blog/
複数のビューの読み込み
CodeIgniter は、コントローラー内からの複数の view()
呼び出しをインテリジェントに処理します.複数の呼び出しが発生した場合、それらは連結されます.たとえば、ヘッダービュー、メニュービュー、コンテンツビュー、フッタービューが必要になる場合があります.これは次のようになります.
<?php
namespace App\Controllers;
use CodeIgniter\Controller;
class Page extends Controller
{
public function index()
{
$data = [
'page_title' => 'Your title',
];
return view('header')
. view('menu')
. view('content', $data)
. view('footer');
}
}
上記の例では、「動的に追加されたデータ」を使用しています。これは以下で説明します.
サブディレクトリ内へのビューの保存
ビューファイルは、そのような構成を好む場合は、サブディレクトリ内に保存することもできます.その場合は、ビューを読み込むときにディレクトリ名を含める必要があります.例:
return view('directory_name/file_name');
名前空間付きビュー
ビューを名前空間化された **View** ディレクトリに保存し、名前空間化されたかのようにそのビューを読み込むことができます.PHP は名前空間からの非クラスファイルの読み込みをサポートしていませんが、CodeIgniter はこの機能を提供することで、ビューをモジュールのようにまとめて再利用または配布しやすくしています.
オートローダー に PSR-4 マッピングが設定されている **example/blog** ディレクトリがあり、名前空間 Example\Blog
の下に存在する場合、名前空間化されたかのようにビューファイルを取得できます.
この例に従って、名前空間をビューの名前に付加することにより、**example/blog/Views** から **blog_view.php** ファイルを読み込むことができます.
<?php
return view('Example\Blog\Views\blog_view');
ビューのキャッシュ
3 番目のパラメーターでビューをキャッシュする秒数を指定した cache
オプションを渡すことにより、view()
関数でビューをキャッシュできます.
// Cache the view for 60 seconds
return view('file_name', $data, ['cache' => 60]);
デフォルトでは、ビューはビューファイル自体と同じ名前を使用してキャッシュされます.cache_name
と使用するキャッシュ ID を渡すことで、これをカスタマイズできます.
// Cache the view for 60 seconds
return view('file_name', $data, ['cache' => 60, 'cache_name' => 'my_cached_view']);
ビューへの動的データの追加
データは、view()
関数の 2 番目のパラメーターにある配列によって、コントローラーからビューに渡されます.次に例を示します.
$data = [
'title' => 'My title',
'heading' => 'My Heading',
'message' => 'My Message',
];
return view('blog_view', $data);
コントローラーファイルで試してみましょう.開いて、次のコードを追加します.
<?php
namespace App\Controllers;
class Blog extends BaseController
{
public function index()
{
$data['title'] = 'My Real Title';
$data['heading'] = 'My Real Heading';
return view('blog_view', $data);
}
}
次に、ビューファイルを開き、テキストをデータ内の配列キーに対応する変数に変更します.
<html>
<head>
<title><?= esc($title) ?></title>
</head>
<body>
<h1><?= esc($heading) ?></h1>
</body>
</html>
次に、使用している URL でページを読み込むと、変数が置き換えられているのがわかります.
saveData オプション
渡されたデータは、後続の view()
の呼び出しのために保持されます.1 つのリクエストで関数を複数回呼び出す場合、目的のデータを各 view()
に渡す必要はありません.
ただし、これでは他のビューにデータが「ブリード」して問題が発生する可能性があるのを防ぐことはできません.1 回の呼び出し後にデータを消去したい場合は、3 番目のパラメーターの $option
配列に saveData
オプションを渡すことができます.
$data = [
'title' => 'My title',
'heading' => 'My Heading',
'message' => 'My Message',
];
return view('blog_view', $data, ['saveData' => false]);
さらに、view()
関数のデフォルトの機能として、呼び出し間でデータをクリアするようにしたい場合は、**app/Config/Views.php** で $saveData
を false
に設定できます.
ループの作成
ビューファイルに渡すデータ配列は、単純な変数に限定されません.多次元配列を渡すことができ、それをループして複数の行を生成できます.たとえば、データベースからデータを取得する場合、通常は多次元配列の形式になります.
簡単な例を次に示します.これをコントローラーに追加します.
<?php
namespace App\Controllers;
class Blog extends BaseController
{
public function index()
{
$data = [
'todo_list' => ['Clean House', 'Call Mom', 'Run Errands'],
'title' => 'My Real Title',
'heading' => 'My Real Heading',
];
return view('blog_view', $data);
}
}
次に、ビューファイルを開いてループを作成します.
<html>
<head>
<title><?= esc($title) ?></title>
</head>
<body>
<h1><?= esc($heading) ?></h1>
<h2>My Todo List</h2>
<ul>
<?php foreach ($todo_list as $item): ?>
<li><?= esc($item) ?></li>
<?php endforeach ?>
</ul>
</body>
</html>