Drupal 8と名前空間について


7

私は名前空間を初めて使用し、Drupal 8を使用しています。カスタムモジュールを作成し、contrib、develをインストールしました。

私のモジュール内で、私はブロックを定義しました、これが私のコードです:

名前空間Drupal \ twitter_pull \ Plugin \ Block;
Drupal \ block \ BlockBaseを使用します。

/ **
 * PHPコードを実行するためのブロックを提供します。
 *
 * @ブロック(
 * id = "twitter_pull_tweets_block"、
 * admin_label = @Translation( "Twitterツイート")
 *)
 * /
クラスTweetsBlockはBlockBaseを拡張します{

  / **
   *このブロックプラグインのレンダリング可能な配列を作成して返します。
   *
   * @return配列
   *ブロックのコンテンツを表すレンダリング可能な配列。
   *
   * @Drupal \ block \ BlockViewBuilderを参照
   * /
  public function build(){
    dpm(配列( 'これ'、 'is'、 'a'、 'テスト'));
    「これはブロックです」を返します。
  }
}

そしてそれはうまく働きます。しかし、私が理解していないのは、なぜdevel関数にアクセスできるのですか?私のコードのどこに、dpm()にアクセスする必要があるdevelの名前空間を含めますか?

回答:


7

PHP グローバルスペースのドキュメントから直接:

名前空間の定義がない場合、すべてのクラスと関数の定義は、名前空間がサポートされる前のPHPと同様に、グローバルスペースに配置されます。名前の前に\を付けると、名前空間のコンテキストであっても、その名前がグローバルスペースから要求されることを指定します。

Devel dpm()は「グローバルスペース」でdpm()宣言されており、ネームスペースで他の関数が宣言されていないため、「グローバル」関数が使用されます(前のは必要ありません\)。


3
さらに、関数は特別であり、クラスとは異なります。グローバル名前空間のクラスは、 先頭に\を付けて参照する必要がありますが、関数は自動的にグローバル名前空間にフォールバックします。ただし、混乱しているのは、関数が見つからない場合(グローバル名前空間も現在の名前空間もない場合)、エラーには現在の名前空間が含まれることです。
Berdir 14

とても興味深い。名前空間はdrupal 8の要件であると思いましたが、devel.moduleファイルには名前空間がなく、dpm関数が配置されている場所があることがわかりました。名前空間は、.moduleファイルに配置されている場合のみ要件ではありませんか?
user1015214 14

2
「必須」おそらくDrupalは、厳密な命名規則に基づいてクラスを発見するPSR-4オートローダーを使用しています...右の単語ではありません(PHPは探しように言われますDrupal\my_module\SomeClass/path/to/my_module/src/SomeClass.php、たとえば)。(プラグインのように)アノテーションによって自動検出されないクラスの場合、理論的には名前空間を設定する必要はありません。PHP / Drupalは、クラス名がグローバルスペース内で一意である限り、問題になりません。もちろん、グローバルスペースを汚染することは悪いことであり、コードをモジュール化することは常に良いことなので、常にクラスに使用します...
Clive

1
...関数に関する限り、関数に名前空間を付けるフレームワークにまだ出会っていません。それには有効なエッジケースがあると確信していますが、OOアーキテクチャーでは、あまり意味がありません。D8はまだ手続き型コードとオブジェクト指向コードのマッシュであるため、グローバルスコープの関数が多数あります。フックシステムはスコープ付き関数にもあまり適していません。グローバル関数を使用すると全体がはるかに簡単になるので、D8には関数に名前空間を使用しないという要件があると言えるかもしれません
Clive
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.