<div class="view-body think-editor-content"><p>為了配合所使用的URL模式,我們需要能夠動態的根據當前的URL設置生成對應的URL地址,為此,ThinkPHP內置提供了<span class="e-search-highlight" rel="mark">U方法</span>,用于URL的動態生成,可以確保項目在移植過程中不受環境的影響。</p>
<h2 id="u5B9Au4E49u89C4u5219">定義規則</h2>
<p><span class="e-search-highlight" rel="mark">U方法</span>的定義規則如下(方括號內參數根據實際應用決定):</p>
<p><strong>U('地址表達式',['參數'],['偽靜態后綴'],['顯示域名'])</strong></p>
<h5 id="u5730u5740u8868u8FBEu5F0F">地址表達式</h5>
<p>地址表達式的格式定義如下:</p>
<pre><code class="hljs cpp">[模塊/控制器/操作<span class="hljs-preprocessor">#錨點@域名]?參數<span class="hljs-number">1</span>=值<span class="hljs-number">1</span>&參數<span class="hljs-number">2</span>=值<span class="hljs-number">2.</span>..</span></code></pre>
<p>如果不定義模塊的話 就表示當前模塊名稱,下面是一些簡單的例子:</p>
<pre><code class="hljs go">U(<span class="hljs-string">'User/add'</span>) <span class="hljs-comment">// 生成User控制器的add操作的URL地址</span>
U(<span class="hljs-string">'Blog/read?id=1'</span>) <span class="hljs-comment">// 生成Blog控制器的read操作 并且id為1的URL地址</span>
U(<span class="hljs-string">'Admin/User/select'</span>) <span class="hljs-comment">// 生成Admin模塊的User控制器的select操作的URL地址</span></code></pre>
<h5 id="u53C2u6570">參數</h5>
<p><span class="e-search-highlight" rel="mark">U方法</span>的第二個參數支持數組和字符串兩種定義方式,如果只是字符串方式的參數可以在第一個參數中定義,例如:</p>
<pre><code class="hljs php">U(<span class="hljs-string">'Blog/cate'</span>,<span class="hljs-keyword">array</span>(<span class="hljs-string">'cate_id'</span>=><span class="hljs-number">1</span>,<span class="hljs-string">'status'</span>=><span class="hljs-number">1</span>))
U(<span class="hljs-string">'Blog/cate'</span>,<span class="hljs-string">'cate_id=1&status=1'</span>)
U(<span class="hljs-string">'Blog/cate?cate_id=1&status=1'</span>)</code></pre>
<p>三種方式是等效的,都是生成Blog控制器的cate操作 并且<code>cate_id</code>為1 <code>status</code>為1的URL地址。</p>
<p>但是不允許使用下面的定義方式來傳參數</p>
<pre><code class="hljs bash">U(<span class="hljs-string">'Blog/cate/cate_id/1/status/1'</span>);</code></pre>
<h5 id="u4F2Au9759u6001u540Eu7F00">偽靜態后綴</h5>
<p>U函數會自動識別當前配置的偽靜態后綴,如果你需要指定后綴生成URL地址的話,可以顯式傳入,例如:</p>
<pre><code class="hljs bash">U(<span class="hljs-string">'Blog/cate'</span>,<span class="hljs-string">'cate_id=1&status=1'</span>,<span class="hljs-string">'xml'</span>);</code></pre>
<h2 id="u81EAu52A8u8BC6u522B">自動識別</h2>
<p>根據項目的不同URL設置,同樣的<span class="e-search-highlight" rel="mark">U方法</span>調用可以智能地對應產生不同的URL地址效果,例如針對:</p>
<pre><code class="hljs bash">U(<span class="hljs-string">'Blog/read?id=1'</span>);</code></pre>
<p>這個定義為例。</p>
<p>如果當前URL設置為普通模式的話,最后生成的URL地址是:</p>
<pre><code class="hljs groovy"><span class="hljs-string">http:</span><span class="hljs-comment">//serverName/index.php?m=Blog&a=read&id=1</span></code></pre>
<p>如果當前URL設置為PATHINFO模式的話,同樣的方法最后生成的URL地址是:</p>
<pre><code class="hljs bash">http://serverName/index.php/Home/B<span class="hljs-built_in">log</span>/<span class="hljs-built_in">read</span>/id/<span class="hljs-number">1</span></code></pre>
<p>如果當前URL設置為REWRITE模式的話,同樣的方法最后生成的URL地址是:</p>
<pre><code class="hljs bash">http://serverName/Home/B<span class="hljs-built_in">log</span>/<span class="hljs-built_in">read</span>/id/<span class="hljs-number">1</span></code></pre>
<p>如果當前URL設置為REWRITE模式,并且設置了偽靜態后綴為.html的話,同樣的方法最后生成的URL地址是:</p>
<pre><code class="hljs bash">http://serverName/Home/B<span class="hljs-built_in">log</span>/<span class="hljs-built_in">read</span>/id/<span class="hljs-number">1</span>.html</code></pre>
<blockquote class="default">
<p>如果開啟了<code>URL_CASE_INSENSITIVE</code>,則會統一生成小寫的URL地址。</p>
</blockquote>
<h2 id="u751Fu6210u8DEFu7531u5730u5740">生成路由地址</h2>
<p><span class="e-search-highlight" rel="mark">U方法</span>還可以支持路由,如果我們定義了一個路由規則為:</p>
<pre><code class="hljs php"> <span class="hljs-string">'news/:id\d'</span>=><span class="hljs-string">'News/read'</span></code></pre>
<p>那么可以使用</p>
<pre><code class="hljs bash">U(<span class="hljs-string">'/news/1'</span>);</code></pre>
<p>最終生成的URL地址是:</p>
<pre><code class="hljs groovy"><span class="hljs-string">http:</span><span class="hljs-comment">//serverName/index.php/Home/news/1</span></code></pre>
<blockquote class="default">
<p>注意:如果你是在模板文件中直接使用<span class="e-search-highlight" rel="mark">U方法</span>的話,需要采用 {:U('參數1', '參數2'…)} 的方式,具體參考模板的<a href="#">使用函數</a>內容。</p>
</blockquote>
<h2 id="u57DFu540Du652Fu6301">域名支持</h2>
<p>如果你的應用涉及到多個子域名的操作地址,那么也可以在<span class="e-search-highlight" rel="mark">U方法</span>里面指定需要生成地址的域名,例如:</p>
<pre><code class="hljs scala"><span class="hljs-type">U</span>(<span class="hljs-symbol">'Blog</span>/read<span class="hljs-annotation">@blog</span>.thinkphp.cn',<span class="hljs-symbol">'id</span>=<span class="hljs-number">1</span>');</code></pre>
<p>@后面傳入需要指定的域名即可。</p>
<p>系統會自動判斷當前是否SSL協議,生成<code>https://</code>。</p>
<p>此外,<span class="e-search-highlight" rel="mark">U方法</span>的第4個參數如果設置為true,表示自動識別當前的域名,并且會自動根據子域名部署設置<code>APP_SUB_DOMAIN_DEPLOY</code>和<code>APP_SUB_DOMAIN_RULES</code>自動匹配生成當前地址的子域名。</p>
<h2 id="u951Au70B9u652Fu6301">錨點支持</h2>
<p>U函數可以直接生成URL地址中的錨點,例如:</p>
<pre><code class="hljs bash">U(<span class="hljs-string">'Blog/read#comment?id=1'</span>);</code></pre>
<p>生成的URL地址可能是:</p>
<pre><code class="hljs bash">http://serverName/index.php/Home/B<span class="hljs-built_in">log</span>/<span class="hljs-built_in">read</span>/id/<span class="hljs-number">1</span><span class="hljs-comment">#comment</span></code></pre></div>