<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>