Download the PHP package ryunosuke/night-dragon without Composer

On this page you can find all versions of the php package ryunosuke/night-dragon. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.

FAQ

After the download, you have to make one include require_once('vendor/autoload.php');. After that you have to import the classes with use statements.

Example:
If you use only one package a project is not needed. But if you use more then one package, without a project it is not possible to import the classes with use statements.

In general, it is recommended to use always a project to download your libraries. In an application normally there is more than one library needed.
Some PHP packages are not free to download and because of that hosted in private repositories. In this case some credentials are needed to access such packages. Please use the auth.json textarea to insert credentials, if a package is coming from a private repository. You can look here for more information.

  • Some hosting areas are not accessible by a terminal or SSH. Then it is not possible to use Composer.
  • To use Composer is sometimes complicated. Especially for beginners.
  • Composer needs much resources. Sometimes they are not available on a simple webspace.
  • If you are using private repositories you don't need to share your credentials. You can set up everything on our site and then you provide a simple download link to your team member.
  • Simplify your Composer build process. Use our own command line tool to download the vendor folder as binary. This makes your build process faster and you don't need to expose your credentials for private repositories.
Please rate this library. Is it a good library?

Informations about the package night-dragon

Night Dragon (simple php template engine)

Description

php の素材の味を生かしたシンプルなテンプレートエンジンです。 下記の機能・特徴があります。

逆に巷にあるテンプレートエンジンにある下記のような機能はありません。

Install

Specification

下記は全機能こみこみのテンプレートです。継承機能を使っています。

layout.phtml
action.phtml

一見すると意味不明なコードですが、これは完全に valid な php コードであり、IDE の支援をフルに受けることができます。

これをレンダリングするとソースコードが内部的に下記のように書き換えられます。

layout.phtml
action.phtml

なお、 `` というコメントがあると、テンプレート自体にも手が加わります(後述)。 具体的には「使用している変数情報」「定数情報」などがメタ情報として書き込まれます。 これにより phpstorm のジャンプや補完を最大限に活かすことができます。

さらに上記が include されて最終的に下記のようなレンダリング結果となります。

レンダリング結果

Feature

原則として <?= ?> を対象に書き換えます。 また、一部の利便性のため <? ?> タグも書き換え対象です。

`` を書き換えることはありません。

<? ?> は具体的には <? foreach ($array->member as $key => $value): ?><? if ($array->flag): ?> が記述できるようになります。 ただし、実験的な機能であり、今のところこのような配列アクセス機能だけが有効です(修飾子は使えない)。

さらに <? ?> は非推奨の機能でもあります。 というのも <? ?> 自体が php 本体側で非推奨になるような傾向があり、処理は token_get_all に頼っているため、いざ廃止されたときにまともに動かなくなるためです。 また、 token_get_all は ini の short_open_tag 設定の影響を受けるため、環境により動作が異なることになります。

後述のオプションで short_open_tag の設定によらずにショートタグを使えるようにすることもできますが、かなりドラスティックな機能です。

access key

<?= $array->key > という形式で配列やオブジェクトにアクセスできます。 これはネスト可能で、配列・オブジェクトの混在もできます。

key 部分に使用できるのはリテラル文字列、リテラル数値、単一変数だけです。式や通常の [] によるアクセスは混在できません。

?? 演算子も混ぜることが出来ます。 ただし後述の defaultGetter を指定している場合は関数ベースでのアクセスとなるため、 @ によるエラー抑制にフォールバックされます(関数ベースで構文レベルの ?? を模倣するのが不可能だからです。動作自体は変わりません)。

modifier

<?= $value | funcname ?> という形式でパイプライン風に関数適用できます。 これはネスト可能で、適用する引数位置なども制御できます。

引数位置には $_ というレシーバ変数を用います。 $_ は左の値が代入されるような挙動を示します。

$_ がない場合は第1引数に適用されます。 第1引数への適用だけであれば関数呼び出しの () は省略できます。

原則として修飾子に使用できるのは単一の関数だけです。制限付きですが名前空間関数や静的メソッドも一応サポートしています。 文字列以外の callable 形式は使用できません。

| の代わりに & を使うこともできます。 & を使うと値が null だった場合に適用されず、null のまま次のパイプラインへ進みます。 例えば <?= $null | number_format ?? "null です" ?> すると出力は「0」となります。これは望まれない場合が多いでしょう。 代わりに <?= $null & number_format ?? "null です" ?> とすると出力は「null です」となります。

auto filter

<?= $string ?> で自動で html エスケープが施されます。 これはショート echo タグだけが対象です。 後述の nofilter オプションで「エスケープしない」ショートタグも表現できます。

なお、 <?= ?> の直後の改行は維持されます(php の標準の動作だと改行は削除される(正確には終了タグに改行が含まれてしまう))。

expand variable

` 内では ${} で埋め込み構文が使えます。

php の変数展開はかなりいろいろなことができるんですが、「式の結果を出力する」ではなく「式の結果の変数名の値を出力する」という謎仕様があります。 多くの場合この仕様は邪魔(というか不便)でしかないためそれを抑制することができます。 さらに ${} の中は上記の修飾子や配列アクセス記法が全て使用できます。

もっとも、このような表示するだけの用法なら単にリテラル部分を php タグの外に出すだけでもっと気軽に実現できます。 真価を発揮するのは下記のような変数宣言や引数のときでしょう。

なお、この機能はショートエコータグだけではなく <? ?> も書き換え対象になります。 テンプレートファイル内でバッククオート(シェル呼び出し)を使うような状況は限りなくゼロに近く、「バッククオートがあったら式展開構文」という前提がほぼ成り立つためです。

Usage

Options

基本的には上記の使用法しかありません。 ここでは使い方の記述に留めるので、細々とした機能はソースを参照してください。

debug

デバッグフラグです。 影響は結構多岐にわたるので、詳細はソースコードを参照してください。 原則として、「開発時は true, 運用時は false」にしてください。

errorHandling

テンプレート内でエラーや例外が起こった場合にハンドリングするかを bool で指定します。 ハンドリングを有効にするとテンプレートの前後行が表示されたり見やすくなります。

gatherVariable, gatherModifier, gatherAccessor

テンプレートファイルの書き換えオプションです。 テンプレート内に `` というコメントを入れるとその位置に下記のようなメタ情報が挿入されます。

用語がバラけていて勘違いしやすいですが、挿入対象は テンプレートファイルです。リライト後のファイルや compileDir に吐き出されるファイルではありません。

gatherVariable を true にすると、テンプレート内で使用している変数を「実際にアサインされた型」を見て動的に /** @var Hoge $hoge */ を挿入します。 型が活きるので IDE の補完やジャンプを活用することができます。 挿入されるのはアサインされていてかつ使用されている変数のみです(勝手に定義したものや、未使用変数は挿入されない)。 true ではなく Renderer に定義されている定数のビット和を渡すとカテゴリを指定して埋め込むことができます(これの詳細は控えます)。

gatherModifier を true にすると <?= $string | strtoupper ?>strtoupper が定数・関数宣言されます。 これは phpstorm の警告を抑止と定義ジャンプのためです(実際に呼び出しているシンタックスなのでジャンプできます)。 定義すること自体に具体的な意味はありません。

gatherAccessor を true にすると <?= $array->key ?>key が定数宣言されます。 これは phpstorm の警告を抑止するためです。 定義すること自体に具体的な意味はありません。

constFilename

ここにファイル名を指定すると gatherModifier, gatherAccessor で吐き出されるような定数宣言が指定したファイルに書き出されます。 前述の通り、定数宣言は phpstorm の警告を抑止するためのものであり、同一ファイルである必要はありませんし true or といえど活きたコードとして埋め込むのは気持ち悪いです。 このオプションを使用するとすべての定数定義を一つのファイルにまとめることができます。

内容は実行ごとに追記型です。 プロジェクト内のすべてのテンプレートファイルをレンダリングし終わったとき、未定義定数の警告がでるテンプレートファイルは存在しなくなるはずです。 また、埋込み型と違って全く関係のないファイルに出力されるため、実行される恐れがありません。

用途は主にデバッグ用です。 プロジェクトメンバー間で差異が生まれやすいファイルなので、プロジェクト内のどこかに配置して gitignore で無視すると良いかもしれません。

typeMapping

ここで [original => alias] という配列を指定すると、 gatherVariable で挿入される型情報を上書きすることができます。 「実際は array なんだけど、深遠な理由で ArrayObject として扱いたい」のようなかなり特殊な状況で使用します。

specialVariable

ここで [$varname => typename] という配列を指定すると、 テンプレートにアサインされた型に関わらず強制的にその変数名は指定した型として出力されます。 共通的なテンプレートでアサインされる型が場合によって異なる、といった状況で型を固定することができます。

wrapperProtocol

php ソース書き換え用のカスタムストリームラッパー名を指定します。 デフォルトは RewriteWrapper です。基本的に指定する必要はありません(被ったときとかに指定してください)。

templateClass

テンプレートクラスを外部から注入できます。 …が、おまけのようなものであり、実用性は考慮してません。

どうしても拡張したいような抜き差しならない状況で使ってください。

compileDir

書き換えられたソースが格納されるコンパイル済みディレクトリです。 別に必須ではありません。未指定の場合は sys_get_temp_dir が設定されます。

存在しない場合は自動で作成されます。

customTagHandler

html ソース書き換えのオプションです。

[タグ名 => callable] のような配列を指定しておくと、文字列的にそのタグ(配列のキー)に出くわしたときにコールバックが実行されます。 コールバックは (タグコンテンツ, タグ属性オブジェクト) が引数として渡ってきます。

デフォルトで strip が登録されています。 これは html 中の空白を削除して(基本的に)1行化するコールバックです。

他に例えば haml や markdown のようなタグを登録しておけば html 中で部分的に haml や markdown で記述できるようになります。 FAQ やガイドなど、静的な部分が多くなるページでかなり有用です。

compatibleShortTag

ソース書き換えのオプションです。

このキーを true に設定すると ini の short_open_tag の設定に関わらず <? ?> タグが有効になります。 ini の変更ができなかったり、 short_open_tag が廃止されたりした状況を想定してますが、気休め程度のオプションなので原則的に false にしてください。

defaultNamespace, defaultClass

同じくソース書き換えのオプションです。

defaultNamespace はテンプレート内で名前解決が行われる際に探索・付与する名前空間を指定します。ファイルの名前空間宣言は常に探索されます。 現在のところ <?= $array | hoge ?>hoge を探索する際に使用されるのみです。 defaultNamespace が指定されてかつその名前空間に hoge 関数が定義されているとこれは <?= $array | \namespace\hoge ?> と解釈されます。

defaultClass はテンプレート内で名前解決が行われる際に探索・付与するクラスを指定します。 現在のところ <?= $array | hoge ?>hoge を探索する際に使用されるのみです。 defaultClass が指定されてかつそのクラスに hoge 静的メソッドが定義されているとこれは <?= $array | \classname::hoge ?> と解釈されます。

これらはそれぞれ複数指定できます。その際の探索順は指定順です。 また、defaultNamespace と defaultClass の探索順は defaultClass -> defaultNamespace です。

defaultFilter, defaultGetter, defaultCloser

同じくソース書き換えのオプションです。

defaultFilter は <?= $string ?> で変換されるデフォルトフィルタを指定します。 可変引数を取る callable でかつ文字列である必要があります(クロージャは不可)。

defaultGetter は <?= $array->key ?> されたときにキーを引く変換関数名を指定します。 第1引数に array or object, 第2引数以降に [nullsafe-flag, キー文字列] を受け取る文字列 callable である必要があります。

defaultCloser は <?= $string ?> 時に挿入される改行文字を指定します。 あまり指定することはないでしょうが、改行差し込みを無効にしたい場合は空文字を指定するといいでしょう。

nofilter, varModifier, varReceiver, varAccessor, varExpander

同じくソース書き換えのオプションです。

nofilter は <?= $string ?> で変換されるデフォルトフィルタを無効化する文字を指定します。 例えば @ を指定すると <?= @$string ?> でデフォルトフィルタが無効になります。 空文字にすると無効機能が無効になり、常に変換されます。

varModifier は <?= $array | implode(',', $_) ?> における | を指定します。 例えば >> を指定するとこれを <?= $array >> implode(',', $_) ?> と記述できるようになります。 互換性維持のため現在のデフォルトは | ですが、本来は配列を指定します。 順番に「単純パイプ修飾子記号」「null ならパイプしない修飾子記号」です。 将来のバージョンでは ['|', '&'] がデフォルトになります。 空文字にすると修飾子機能が無効になり、変換自体が行われなくなります。

varReceiver は <?= $array | implode(',', $_) ?> における $_ を指定します。 例えば $__var を指定するとこれを <?= $array | implode(',', $__var) ?> と記述できるようになります。 変数名として有効な文字列である必要があります。

varAccessor は <?= $array->key ?> における -> を指定します。 例えば . を指定するとこれを <?= $array.key ?> と記述できるようになります。 空文字にするとキーアクセス機能が無効になり、変換自体が行われなくなります。

varExpander は <?= `${expression}` ?> における ` を指定します。 実装上の都合で指定できるのはバッククオートとダブルクオートのみです。 例えば " を指定するとこれを <?= "${expression}" ?> と記述できるようになります。 空文字にすると埋め込み機能が無効になり、変換自体が行われなくなります。

Methods

テンプレート内での $this は自身のテンプレートオブジェクトを指します。

テンプレート内で $this->extend("parent/template/file") を呼ぶとテンプレート継承を行うことができます。 テンプレート継承では親コンテンツの内容を参照しつつ部分部分の書き換えが可能になります(よくある機能なので概念の説明は省略します)。

子テンプレートにおいてブロック以外のトップレベルの記述はすべて無視されます。

下記の記述はかなり簡易なものであり、具体的には実際に見たほうが分かりやすいと思うので、冒頭の layout.phtml, action.phtml を参照してください。

$this->extend(string $filename[, array $vars])

親を指定してテンプレート継承を宣言します。 親は1つだけであり、同じテンプレートで継承を複数行うことはできません。

ただし、「継承しているテンプレートを継承」することはできます。いわゆる「親->子->孫」の多段継承です。

$this->begin(string $blockname)

ブロックを定義します。 定義されたブロックは子テンプレート側で参照することができます。

$this->end()

ブロックの終了を宣言します。

$this->block(string $blockname[, string $contents])

ブロックの定義と終了を同時に行います。 「中身のない begin ~ end」と同義です。

ただし、文字列でコンテンツ内容を与えることはできます。

$this->parent()

子テンプレートにおいて親の内容を参照します。

$this->import(string $filename[, array $vars])

指定したテンプレートを読み込みます。 このメソッドはテンプレートファイルとしてレンダリングして読み込みます。

つまり「テンプレートファイルの結果」を取り込むメソッドです。

$this->include(string $filename[, array $vars])

指定したテンプレートを読み込みます。 このメソッドはテンプレートファイルとして埋め込みます。

つまり「テンプレートファイルをそのまま」取り込むメソッドです。 (極論すると「そこにファイルの中身をコピペ」したと同じ結果になります)。

$this->content(string $filename)

指定したファイルを読み込みます。 このメソッドはレンダリングされません(js, css などを埋め込みたいときに使います)。

$this->load(string $filename)

拡張子に基づいて指定したファイルを読み込みます。 例えば js ファイルを指定すれば <script> タグで囲まれて読み込まれ、 php であれば単純に require されます。 自身と同じ拡張子の場合は import と同じ動作になります。

$filename は glob 記法で指定でき、マッチしたものが全て読み込まれます。

Notes

Q&A

独り言

構文の書き換えなどが多少ありますが、思想として「IDE との親和性」があります。

例えば修飾子記号を | から |> に変えても動きはしますがおそらく phpstorm で警告が出るでしょう。 あるいは {} 構文にして開始・終了タグを書き換えるようにしても動きはするでしょうが、定義ジャンプなどの機能が全く活かせませんし、シンタックスエラーも検出できません(そもそもそんなことをするなら Smarty でいい)。

素の php の機能を活かしつつ、あまり独自構文を導入しないのが基本コンセプトです。

あと最近の php は元々テンプレートエンジンだったという過去を忘れつつあるので、アンチテーゼ的にこういうエンジンがあっても良いんじゃないかと思ったのが開発動機です。 具体的には

などです。

「Web 開発に適した言語」を謳っていて、それなりに平易なテンプレート構文があるならば <?- "html's string" ?> のような構文を導入してくれても良いと思っています。 逆に php 本体が自動エスケープやパイプライン演算子を導入したら本エンジンは不要になるでしょう(レイアウト機能は惜しいけど)。

また、巷の有名なテンプレートエンジンは非常に高機能ですが、「素の php に毛が生えた程度でいいのでちょろっとレンダリングしたい」という場合には少々オーバースペックです。 さらにそういう状況では往々にして view ファイル内にロジカルな php コードが書かれたりするので、独自構文だとちょっと使いにくいのです。

License

MIT


All versions of night-dragon with dependencies

PHP Build Version
Package Version
Requires php Version >=8.0
Composer command for our command line client (download client) This client runs in each environment. You don't need a specific PHP version etc. The first 20 API calls are free. Standard composer command

The package ryunosuke/night-dragon contains the following files

Loading the files please wait ....