Drupal8コントローラー入門

今年(2016年)5月に入社した小林です。 弊社ブログの投稿は初めてになります。 今後も定期的に投稿していきますのでよろしくお願いします。

Drupal7ではhook_menu()として定義されているページの定義がDrupal8はcontrollerとして定義されています。

Drupal7とDrupal8でページ定義をどのように作成するのかそれぞれ記載します。

Drupal 7

Drupal7の場合sample.moduleに以下のコードを定義します。

/**
 * Implement hook_menu().
 */
function sample_menu() {
  $items['hello'] = array(
    'title' => 'hello',
    'page callback' => 'sample_say_hello',
    'access callback' => TRUE,
  );

  return $items;
}

/**
 * callback function for /hello.
 */
function sample_say_hello() {
  return 'world';
}

Drupal 8

では、Drupal8ではどう定義するのか記載します。 ※ Drupal Consoleを使用します。

drupalconsoleでコントローラを作成します。 大枠はコマンドだけで作成できるので簡単ですね!

[d8] drupal generate:controller                                                                                                                                                                                                                                                11:27:14
 モジュール名を入力してください [devel]:
 > sample

 Enter the Controller class name [DefaultController]:
 > Hello

 Enter the Controller method title (to stop adding more methods, leave this empty) [ ]:
 > hello

 Enter the action method name [hello]:
 >

 Enter the route path [/sample/hello/{name}]:
 > /hello

 Enter the Controller method title (to stop adding more methods, leave this empty) [ ]:
 >

 Do you want to generate a unit test class (yes/no) [yes]:
 >


 サービスをコンテナからロードしますか? (yes/no) [no]:
 >


 本当に生成しますか? (yes/no) [yes]:
 >

生成または更新されたファイル
 サイトのパス: /xxx/d8
 1 - modules/custom/sample/src/Controller/Hello.php
 2 - modules/custom/sample/sample.routing.yml
 3 - modules/custom/sample/Tests/Controller/HelloTest.php
 // router:rebuild

 ルートを再構築しています、少々お待ち下さい。

 [OK] ルートの再構築が完了しました。

では、実際に作成されたコードを見てみましょう。

modules/custom/sample/sample.routing.yml このファイルにD7のhook_menu()に書いていたようなコードが記載されていますね! ルーティングとアクセス制御に関する定義を記載します。

sample.hello_hello:
  path: '/hello'
  defaults:
    _controller: '\Drupal\sample\Controller\Hello::hello'
    _title: 'hello'
  requirements:
    _access: 'TRUE'

modules/custom/sample/src/Controller/Hello.php このファイルにはD7のpage callback()で指定された関数と同内容のコードを記載します! D7までは同一ファイルに記載していましたが(別ファイルへの定義も可能ですが…)、D8からは完全に分離されています。 また、Controllerもクラス化されているので他モジュールとの名前が重複して関数を上書いてしまうリスクは減ったのではないでしょうか。

<?php

namespace Drupal\sample\Controller;

use Drupal\Core\Controller\ControllerBase;

/**
 * Class Hello.
 *
 * @package Drupal\sample\Controller
 */
class Hello extends ControllerBase {

  /**
   * Hello.
   *
   * @return string
   *   Return Hello string.
   */
  public function hello() {
    return [
      '#type' => 'markup',
      '#markup' => $this->t('world')
    ];
  }

}

定義したページヘアクセスした結果は以下の通りです。 どちらも/helloへアクセスするとタイトルが「hello」本文に「world」と書かれたページが表示されます。

Drupal 7

D7_hello

Drupal 8

D8_hello

Drupal 8の場合、Drupal 7と比較し書き方は複雑になりますが、どのファイルをみればどのようなコードが定義されているのかが
明確になっているのでコードの見やすさや保守性は上がっているように感じます。

このような感じでDrupal 8でのコードの書き方等をお伝えしていければと思います!


共に働く新しい仲間を
募集しています

スタジオ・ウミは「Drupal」に特化したサービスを提供する Drupal のエキスパートチーム。
フルリモート&フレックス制だから、働く場所を選ばず時間の使い方も自由です。
そんなワークライフバランスの整った環境で、当ブログに書かれているような
様々な技術を共に学びながら、Drupalサイト開発に携わってみたい方を募集しています。
まずはお話だけでも大歓迎!ぜひお気軽にご連絡ください。