<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # Latte:PHP的令人驚嘆的模板引擎 Latte是PHP的模板引擎,它簡化了您的工作,并確保輸出被保護免受漏洞,例如XSS。 Latte是快速的:它將模板編譯成平凡的優化PHP代碼。 Latte是安全的:它是第一個引入內容感知轉義的PHP引擎。 Latte語法:它有直觀的語法,并幫助您輕松地構建更好的網站。 雖然PHP最初是一種模板語言,但它不是特別適合編寫模板。 讓我們來看一個PHP模板的例子,它將一個數組$ items打印成一個列表: ~~~ <?php if ($items): ?> <?php $counter = 1 ?> <ul> <?php foreach ($items as $item): ?> <li id="item-<?php echo $counter++ ?>"><?php echo htmlSpecialChars(mb_convert_case($item, MB_CASE_TITLE)) ?> </li> <?php endforeach ?> </ul> <?php endif?> ~~~ 代碼相當混亂。 此外,我們不能忘記調用htmlSpecialChars函數。 這就是為什么有這么多不同的模板引擎PHP。 最好的模板引擎之一是Nette Framework的一部分,它被稱為Latte。 你會愛上它! 與上面相同的模板可以很容易地寫在Latte: ~~~ <ul n:if="$items"> {foreach $items as $item} <li id="item-{$iterator->counter}">{$item|capitalize}</li> {/foreach} </ul> ~~~ 正如你可以看到有兩種類型的宏: 大括號中的宏,例如{foreach ...} n:宏,例如n:if =“...” # 安裝和使用 如何安裝Latte的最好方法是下載最新的[軟件包](https://github.com/nette/latte/releases)或使用Composer: ~~~ php composer.phar require latte/latte ~~~ Latte需要PHP 5.3.1或更高版本。 如何渲染模板? 只需運行這段代碼: ~~~ $latte = new Latte\Engine; $latte->setTempDirectory('/path/to/tempdir'); $parameters['items'] = ['one', 'two', 'three']; //渲染輸出 $latte->render('template.latte', $parameters); // 或呈現為字符串 $html = $latte->renderToString('template.latte', $parameters); ~~~ # 宏命令 您可以在額外頁面上找到所有默認宏命令的詳細說明。 此外,您可以制作自己的宏命令。 每對宏命令,例如{if} ... {/ if},對單個HTML元素操作可以寫成n:宏命令符號。 因此,可以以相同的方式寫入{foreach}宏命令: ~~~ <ul n:if="$items"> <li n:foreach="$items as $item">{$item|capitalize}</li> </ul> ~~~ 使用n:宏命令你可以做更多的有趣的技巧,你會看到一會兒。 {$ item | capitalize}宏命令打印$ item變量包含所謂的過濾器,在這種情況下大寫字母過濾器使每個單詞的第一個字母大寫。 Latte的非常重要的特性是它默認轉義變量。 打印變量時需要轉義,因為我們必須將HTML中有特殊含義的所有字符轉換為其他序列。 如果我們忘記它可能導致一個嚴重的安全漏洞稱為跨站腳本(XSS)。 由于在不同文檔和頁面的不同部分需要不同的轉義功能,Latte提供了一種獨特的上下文感知轉義技術,它識別宏命令被放置的上下文,并選擇正確的轉義模式。 你不必擔心你的編碼器忘了它導致你出現一個安全漏洞。 這是偉大的! 你仍然可以使用PHP里面的宏命令,包括注釋。 但Latte還擴展了PHP語法有三個令人愉快的功能: 1、數組可以寫成[1,2,3],這與PHP中的[1,2,3]相同 2、我們可以省略由字母,數字和破折號組成的字符串周圍的引號 3、短條件符號$ a? 'b'與$ a相同? 'b':在PHP中為null 例如: ~~~ {foreach [a, b, c] as $id} ... {/foreach} {$cond ? hello} // 如果$ cond等于true,則打印'hello' ~~~ # n:宏命令 我們顯示n:宏命令應該直接寫入HTML標簽,作為他們的特殊屬性。 我們還說每對宏命令(例如{if} ... {/ if})可以用n:宏命令表示。 然后,宏對應于寫入它的HTML元素: ~~~ {var $items = ['I', '?', 'Nette Framework']} <p n:foreach="$items as $item">{$item}</p> ~~~ 打印: ~~~ <p>I</p> <p>?</p> <p>Nette Framework</p> ~~~ 通過使用內部前綴,我們可以改變行為,使宏命令只適用于元素的主體: ~~~ <div n:inner-foreach="$items as $item"> <p>{$item}</p> <hr> </div> ~~~ 打印: ~~~ <div> <p>I</p> <hr> <p>?</p> <hr> <p>Nette Framework</p> <hr> </div> ~~~ 或者通過使用標記前綴,宏命令僅應用于HTML標記: ~~~ <p><a href="{$url}" n:tag-if="$url">Title</a></p> ~~~ 根據$ url變量的值,這將打印: ~~~ // 當$ url是空的 <p>Title</p> // 當$ url等于'https://nette.org' <p><a href="https://nette.org">Title</a></p> ~~~ 然而,n:宏命令不僅是對宏的快捷方式,還有一些純n:宏,例如編碼器的最好的朋友n:類宏。 # 過濾器 Latte通過使用特殊符號調用過濾器(允許前面的有空格): ~~~ <h1>{$heading|upper}</h1> ~~~ 過濾器(或修飾符)可以一起使用,在這種情況下,它們從左到右依次應用: ~~~ <h1>{$heading|lower|capitalize}</h1> ~~~ 參數放在過濾器名稱后面,用冒號或逗號分隔: ~~~ <h1>{$heading|truncate:20,''}</h1> ~~~ 過濾器可以通過任何回調或lambda函數注冊: ~~~ $latte = new Latte\Engine; $latte->addFilter('shortify', function ($s) { return mb_substr($s, 0, 10); //將文本縮短為10個字符 }); ~~~ 在這種情況下,過濾器會得到一個額外的參數: ~~~ $latte->addFilter('shortify', function ($s, $len = 10) { return mb_substr($s, 0, $len); }); ~~~ 我們這樣的模板中調用它: ~~~ <p><?php echo $template->shortify($text, 100); ?></p> ~~~ Latte簡化了符號 - 過濾器由特殊符號表示,它們可以組合(它們從左到右依次應用)。 參數用冒號或逗號分隔: ~~~ <p>{$text|shortify:100}</p> ~~~ # 通用過濾器 手動注冊多個過濾器可以替換為單個通用注冊: ~~~ $template->addFilter(NULL, 'Filters::common'); ~~~ 過濾器:common將過濾器的名稱作為第一個參數。 ~~~ class Filters { public static function common($filter, $value) { if (method_exists(__CLASS__, $filter)) { $args = func_get_args(); array_shift($args); return call_user_func_array([__CLASS__, $filter], $args); } } public static function shortify($s, $len = 10) { return mb_substr($s, 0, $len); } } ~~~ # 性能 Latte?運行很快。 它將模板編譯為本機PHP代碼,并將它們存儲在磁盤的緩存中。 因此,它們就像用純PHP編寫的一樣快。 每次我們更改源文件時,模板都會自動重新編譯。 在開發時,您只需要編輯Latte中的模板,并且更改會立即顯示在瀏覽器中。 # 調試 每一個錯誤或打字錯誤,你將被告知Tracy所有的奢侈。 顯示模板源代碼,紅線標記顯示錯誤消息的錯誤。 只需單擊一下,您可以在您喜歡的編輯器中打開模板,并立即修復錯誤。 十分簡單! 如果您使用帶有代碼步進的IDE,您可以通過模板生成的PHP代碼。 # 可用性 Latte語法不是由工程師發明的,而是來自webdesigner的實際需求。 我們正在尋找最友好的語法,你甚至可以寫出最有問題的結構足夠舒服。 你會驚訝的是,Latte可以多少有一些幫助。 您可以找到用于高級布局管理,模板繼承,嵌套塊等的宏。 語法來自PHP本身,所以你不必學習任何新的,你可以利用你的專有技術。 # 上下文感知轉義 雖然跨站腳本(XSS)是利用網頁的一種簡單的方法,它是最常見的漏洞,但非常嚴重。 它可能導致身份盜竊等。 最好的防御是一致的逃脫打印數據,即。 轉換在給定上下文中具有特殊含義的字符。 如果編碼器省略了逃逸,則產生安全漏洞。 這就是為什么模板引擎實現自動轉義。 問題是網頁具有不同的上下文,并且每個具有用于轉義打印數據的不同規則。 如果使用錯誤的轉義函數,則會顯示安全漏洞。 但Latte是復雜的。 它具有上下文感知轉義的獨特技術,它識別宏命令被放置的上下文,并選擇正確的轉義模式。 這意味著什么? Latte不需要任何手動工作。 一切都是自動,一致和正確。 你不必擔心安全漏洞。 讓我們看看它是如何工作的: ~~~ <p onclick="alert({$movie})">{$movie}</p> <script>var movie = {$movie};</script> ~~~ 如果$ movie變量存儲'Amarcord&8 1/2'字符串,它將生成以下輸出。 注意在HTML和JavaScript以及onclick屬性中使用的不同轉義: ~~~ <p onclick="alert(&quot;Amarcord &amp; 8 1\/2&quot;)">Amarcord &amp; 8 1/2</p> <script>var movie = "Amarcord & 8 1\/2";</script> ~~~ 感謝上下文感知轉義模板很簡單,你的應用程序完全防止跨站點腳本。 你可以在JavaScript中使用PHP變量! # 一個漂亮的輸出 Stickers將享受Latte生成的HTML輸出的外觀。 所有標簽縮進為他們應該。 代碼看起來像它已經處理與某種類型的HTML代碼美化:-) # 用戶定義的宏命令 Latte提供API來創建自己的宏命令。 這根本不難。 宏命令是以集合的形式添加的(一個集合可以包含一個宏命令)。 ~~~ $latte = new Latte\Engine; //讓我們創建一個集合 $set = new Latte\Macros\MacroSet($latte->getCompiler()); // 添加一對對宏命令 {try}... {/try} $set->addMacro( 'try', // 宏命令名稱 'try {', // PHP代碼替換開始大括號 '} catch (\Exception $e) {}' // 代碼替代閉包 ); ~~~ 如果我們省略addMacro()方法的最后一個參數,我們表示宏命令未配對。 PHP代碼中的第二和第三個參數可以包含標簽: ~~~ %node.word – 插入第一個宏參數 %node.array – 插入格式化為PHP數組的宏參數 %node.args – 插入格式化為PHP代碼的宏參數 %escape(...) –替換為當前的逃逸函數 %modify(...) – 替換為一系列修飾符 ~~~ 例如: ~~~ $set->addMacro('if', 'if (%node.args):', 'endif'); ~~~ 如果宏邏輯更復雜,我們可以使用回調或lambda函數,而不是字符串。 在第一個參數中,它們將獲得代表當前宏的MacroNode對象,第二個參數是幫助生成輸出代碼的PhpWriter對象。 ~~~ $set->addMacro('if', function($node, $writer) { return $writer->write('if (%node.args):'); }, 'endif'); ~~~ # 從字符串加載到模板 您可以使用loader從字符串加載模板: ~~~ $latte->setLoader(new Latte\Loaders\StringLoader); $template = ' {if true} {$var} {/if} '; $latte->render($template, $parameters); ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看