よしかわーるど

プログラミングで世界を変える

2018-06-29

CakePHP 入門 2日目

前回の記事

CakePHP 入門 1 日目

名前空間について

「namespace」文

namespace App\Controller;

「名前空間」というのは、クラス類の配置場所を階層内に整理する仕組み。

namespace を使って特定の場所に配置しておくことで、同じ名前のクラスがあってもトラブルを起こしたりすることがなくなる。

CakePHP では、クラス類はすべて特定の名前空間に配置されている。名前空間が指定されていないクラスは、基本的にない。作成するコントローラなどのクラスも、このルールに従い、名前空間を指定して作成。

この名前空間は、クラスの種類によって「どの名前空間に配置するか」が決まっている。コントローラクラスの場合、App\Controller という名前空間に配置しなければいけない。コントローラの基底クラスである AppController クラスが App\Controller 名前空間に配置されているので、同じ場所に配置しておくのが基本と考えてよい。

メンバ変数と index メソッド

コントローラクラスには、「コントローラで利用される値を保管するメンバ変数」と「必要に応じて CakePHP のシステムから呼び出されるメソッド」が用意されている。

コントローラの名前を指定する public $name = 'Hello'; 「$name に名前を保管しておく」というのは、コントローラクラス定義の基本。

ビューの自動レンダリングを指定する public $autoRender = false; CakePHP では、様々なビューテンプレートと、それを組み合わせる「レイアウト」というものを使ってページを構成。ビュー関係のオブジェクトを使って自動的にページをレンダリングする機能に関する設定が「$autoRender」というメンバ関数。

デフォルトページの処理メソッドを定義する

public function index() {
  echo "Hello, World!";
}

1 つだけ定義されているうメソッドは、デフォルトページが呼び出された際の処理を定義。 http://localhost/cakephp3/hello/ にアクセスをしたが、多くのサーバでは、ファイル名を省略してアクセスした場合には、http://localhost/cakephp3/hello/index.html というように index というファイル名のファイルが自動的に呼び出されるようになっている。これは CakePHP についても同様である。

アクセス修飾子について

メンバ変数もメソッドも「public」というアクセス修飾子をつけて宣言されている。

index 以外にアクセス

public function other()
{
    echo "Other Page";
}

アクションとアクションメソッドについて

「other」というページを作る。この「other」は、一般に「アクション」と呼ばれます。つまり、ここでは「hello」コントローラの「other」アクションを呼び出していたということ。また、アクションによって呼び出されるメソッドを「アクションメソッド」と呼びます。

アクション間の移動について

あるアクションのページから別のアクションのページへと移動するには、<a>タグなどのリンクを用意して、移動先のアクションのアドレスを href に設定しておけば可能。

<a href="/hello/other">otherへ移動</a>

アクションの設定とリダイレクト

2 通りのやり方がある。「アクションの設定」と「リダイレクト」。 アクションの設定(ファワード) $this->setAction(アクション名); $this というのは、インスタンス自身(すなわち、このコントローラ)のこと。setAction は、コントローラのスーパークラスである AppController クラスに用意されているメソッドで、指定のアクションにフォワード(移動)するためのもの。これにより、別のアクションのメソッドが呼び出され、そのページが表示されるようになります。

リダイレクトの実行 $this->redirect(移動先アドレス); これは、リダイレクト(表示アドレスを移動)するためのものです。やはり AppController クラスのメソッドとして用意されています。引数には移動先のアドレスを指定します。これにより、別のアクションのページへと移動させることが出来ます。

フォワードとリダイレクトの違い

どちらも表示させるページを変更するものには違いはない。しかし、動作は秒に異なる。 「ファワード」というのは、サーバ側のプログラム内で別のページに移動させるものであり、「リダイレクト」というのはブラウザに対して別のページにジャンプするよう要求して移動させるものです。フォワードはサーバ側のプログラム内で処理が完結しているものであるのに対し、リダイレクトはサーバとブラウザのやり取りによって実行される。

ビューテンプレートを作る

「ビューテンプレート」と「レイアウト」

ビューには、大きく分けて「ビューテンプレート」と「レイアウト」があります。ビューテンプレートというのは、実際にページの表示のテンプレートとなるものです。そして、レイアウトは、このビューテンプレートの他、ヘッダーやフッターなどをまとめてページ全体をレイアウトする仕組みです。 「レイアウトを用意し、その中にビューテンプレートをはめ込んで表示する」という方式は、1 つのウィンドウだけでは面倒になる。 複数のページかたなる Web サイトを作成するとき、すべてのページを統一したデザインでまとめることが簡単になります。面倒な時は、レイアウト機能を OFF にし、ビューテンプレートだけでページをデザインすることも可能。

  1. まず、CakePHP の「src」内にある「Template」フォルダを開きます。そして、ここに「Hello」というフォルダを作成する。「Hello」コントローラで用いられるビューテンプレートは、ここに作成。
  2. 次のソースコードを作成し、「Hello」フォルダの中に「index.ctp」というファイル名で保存します。
<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="content-type" content="text/html;
      charset=utf-8">
    <title>Hello Page</title>
  </head>
  <body>
    <h1>サンプル見出し</h1>
    <p>こんにちは! これは、CakePHPのサンプルです!</p>
  </body>
</html>
  1. 最後に、コントローラを修正します。HelloController.php を次のように修正して保存。
<?php
namespace App\Controller;

/**
 * ビューテンプレートの反映
 * http://localhost:8765/hello
 */
class HelloController extends AppController
{
  public $name = 'Hello';
  public $autoRender = true;

  public function index()
  {
    $this->viewBuilder()->autoLayout(false);
  }
}
 ?>

ビューテンプレートの仕組み

今回は、ビューテンプレートだけを使ってページを表示させています。 自動レンダリングに関する設定。 public $autoRender = true; これで、hello にアクセスしたとき、「Hello」フォルダの中にあるテンプレートファイルを読み込んでページのレイアウトを作成し、画面に表示するようになります。
index メソッドでは、レイアウト機能を使った自動レイアウトを OFF にするためのものです。 $this->$viewBulder()->autoLayout(false); CakePHP のでは、表示されるページ全体のレイアウトを記述したレイアウトファイルが用意されており、その中にそれぞれのアクション用のテンプレートがはめ込まれるようにして表示されます。 今回は、「レイアウト機能は使わず、アクションに用意されたテンプレートだけをレンダリングして表示する」というやり方を考えているので、自動レンダリングを ON に、なおかつ自動レイアウトは OFF に、という設定をしなければいけない。 レンダリングはメンバ関数として設定が用意されていましたが、自動レイアウトは Controller に用意されている「_ViewBuilder_」というオブジェクトの中の「_autoLayout_」メソッドを呼び出して行います。「viewBuilder」が、$this に組み込まれている ViewBuilder インスタンスを取得するメソッドです。そして、「autoLayout」が自動レイアウト機能を設定するメソッドです。これは引数に真偽値を指定し、true ならば自動レイアウトが ON に、false ならば OFF になります。

自動レンダリングとテンプレートの関係

index に必要な処理は、これだけ。「index.ctp を読み込んでレンダリングする処理はいらないか?」と疑問に思うけど、処理はいらない。 $autoRender が true になっていて自動レンダリングが ON の場合、CakePHP はアクションメソッドを実行すると、「Template」フォルダ内からそのコントローラ名のフォルダを探し、その中からアクション名のテンプレートファイルを読み込んで自動的にレンダリングします。 <?=date('Y/m/d',time()) ?> 「レンダリングする」ということ。

次回の記事

CakePHP 入門 3 日目