Yao've done
Calm down, and keep on walking!
2016-06-30T09:16:29.202Z
http://yoursite.com/
dam叶
Hexo
Go学习笔记(二):tutorial学习
http://yoursite.com/2016/06/30/Go学习笔记(二):tutorial学习/
2016-06-30T08:26:22.000Z
2016-06-30T09:16:29.202Z
<h3 id="tour"><a href="#tour" class="headerlink" title="tour"></a>tour</h3><p>Go的基本语言及数据结构学习,可参照<a href="https://go-tour-zh.appspot.com" target="_blank" rel="external">Go 指南</a>。<br>其中有部分联系题,练习题答案参照<a href="http://xialingsc.github.io/home//go/Excericise-for-Tour-Golang/" target="_blank" rel="external">夏令blog</a></p>
<h3 id="安装tour包"><a href="#安装tour包" class="headerlink" title="安装tour包"></a>安装<code>tour</code>包</h3><p>其中部分练习题需要引用<code>tour</code>下的文件,如<a href="https://go-tour-zh.appspot.com/moretypes/19" target="_blank" rel="external">练习:map</a>该题中,官方给的参考代码为:<br><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line"> <span class="string">"code.google.com/p/go-tour/wc"</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="keyword">func</span> WordCount(s <span class="typename">string</span>) <span class="keyword">map</span>[<span class="typename">string</span>]<span class="typename">int</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">map</span>[<span class="typename">string</span>]<span class="typename">int</span>{<span class="string">"x"</span>: <span class="number">1</span>}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">func</span> main() {</span><br><span class="line"> wc.Test(WordCount)</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p>直接根据该参考代码无法运行,因为<code>“code.google.com/p/go-tour/wc”</code>为第三方包,需要先安装才能使用。</p>
<h4 id="官方安装"><a href="#官方安装" class="headerlink" title="官方安装"></a>官方安装</h4><p>在命令行中执行:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">go get code.google.com/p/go-tour/wc</span><br></pre></td></tr></table></figure></p>
<p>安装该<code>tour</code>包。<br>如果,你已经配置了VPN,可以成功,否则会被报错,如下:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">package code.google.com/p/go-tour/wc: Get https://code.google.com/p/go-tour/<span class="built_in">source</span>/checkout?repo=: dial tcp <span class="number">74</span>.</span><br><span class="line"><span class="number">125.204</span>.<span class="number">113</span>:<span class="number">443</span>: i/o timeout</span><br></pre></td></tr></table></figure></p>
<p>提示很明显,即timeout(超时),大陆访问code.google被墙了。</p>
<h4 id="github安装"><a href="#GitHub安装" class="headerlink" title="GitHub安装"></a>GitHub安装</h4><p>该tour同样托管在Github上,托管地址:<a href="https://github.com/golang/tour" target="_blank" rel="external">https://github.com/golang/tour</a><br>然后通过该托管源码安装tour。<br>该问题有部分issue讨论,地址为:<a href="https://github.com/golang/go/issues/9976" target="_blank" rel="external">https://github.com/golang/go/issues/9976</a><br>总结实验后,可行的方式(中国大陆,windows环境)为:</p>
<h5 id="安装tour"><a href="#安装tour" class="headerlink" title="安装tour"></a>安装tour</h5><p>在命令行中输入:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">go get github.com/golang/tour</span><br></pre></td></tr></table></figure></p>
<p>可在<code>$GOPATH</code>下看到一个<code>src</code>的文件夹,里面即为GitHub上的代码,目录结构也与GitHub上相同。</p>
<h5 id="使用tour"><a href="#使用tour" class="headerlink" title="使用tour"></a>使用tour</h5><p>当前可使用get的代码完成<a href="https://go-tour-zh.appspot.com/moretypes/19" target="_blank" rel="external">练习:map</a>,解答代码为:<br><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line"> <span class="string">"golang.org/x/tour/wc"</span></span><br><span class="line"> <span class="string">"strings"</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="keyword">func</span> WordCount(s <span class="typename">string</span>) <span class="keyword">map</span>[<span class="typename">string</span>]<span class="typename">int</span> {</span><br><span class="line"> result := <span class="keyword">map</span>[<span class="typename">string</span>]<span class="typename">int</span> {}</span><br><span class="line"> f := strings.Fields(s)</span><br><span class="line"> <span class="keyword">for</span> _, v := <span class="keyword">range</span> f {</span><br><span class="line"> result[v] += <span class="number">1</span> </span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> result</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">func</span> main(){</span><br><span class="line"> wc.Test(WordCount)</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p>运行该代码,提示:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">test.go:<span class="number">7</span>:<span class="number">2</span>: cannot find package <span class="string">"golang.org/x/tour/wc"</span> <span class="keyword">in</span> any of:</span><br><span class="line"> D:\Program Files (x86)\Go\src\golang.org\x\tour\wc (from <span class="variable">$GOROOT</span>)</span><br><span class="line"> D:\Go\repo\src\golang.org\x\tour\wc (from <span class="variable">$GOPATH</span>)</span><br></pre></td></tr></table></figure></p>
<p><code>“golang.org/x/tour/wc”</code>依旧不存在。由于我们使用GitHub上的代码,故import的路径也需要相应更改,更改之后的代码为:<br><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line"> <span class="string">"strings"</span></span><br><span class="line"> <span class="string">"github.com/golang/tour/wc"</span> <span class="comment">//更为真实路径</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="keyword">func</span> WordCount(s <span class="typename">string</span>) <span class="keyword">map</span>[<span class="typename">string</span>]<span class="typename">int</span> {</span><br><span class="line"> result := <span class="keyword">map</span>[<span class="typename">string</span>]<span class="typename">int</span> {}</span><br><span class="line"> f := strings.Fields(s)</span><br><span class="line"> <span class="keyword">for</span> _, v := <span class="keyword">range</span> f {</span><br><span class="line"> result[v] += <span class="number">1</span> </span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> result</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">func</span> main() {</span><br><span class="line"> wc.Test(WordCount)</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p>再次运行,依旧报错,提示:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">test.go:<span class="number">6</span>:<span class="number">2</span>: code <span class="keyword">in</span> directory D:\Go\repo\src\github.com\golang\tour\wc expects import <span class="string">"golang.org/x/tour/wc"</span></span><br></pre></td></tr></table></figure></p>
<p>我们查看<code>D:\Go\repo\src\github.com\golang\tour\wc.go</code>源代码,发现其源代码<code>package</code>后有个注释,代码为:<br><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// Copyright 2011 The Go Authors. All rights reserved.</span></span><br><span class="line"><span class="comment">// Use of this source code is governed by a BSD-style</span></span><br><span class="line"><span class="comment">// license that can be found in the LICENSE file.</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">package</span> wc <span class="comment">// import "golang.org/x/tour/wc"</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">"fmt"</span></span><br></pre></td></tr></table></figure></p>
<p>此处使用注释,规定了<code>import</code>的方式,由于我们的实际路径和此处不同,故此<code>import</code>建议应该被去除或换为我们自己的路径方式。<br>去除<code>// import “golang.org/x/tour/wc”</code>,然后再次运行代码:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">go run test.go</span><br></pre></td></tr></table></figure></p>
<p>得到正确结果,如下所示:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">PASS</span><br><span class="line"> f(<span class="string">"I am learning Go!"</span>) =</span><br><span class="line"> map[string]int{<span class="string">"I"</span>:<span class="number">1</span>, <span class="string">"am"</span>:<span class="number">1</span>, <span class="string">"learning"</span>:<span class="number">1</span>, <span class="string">"Go!"</span>:<span class="number">1</span>}</span><br><span class="line">PASS</span><br><span class="line"> f(<span class="string">"The quick brown fox jumped over the lazy dog."</span>) =</span><br><span class="line"> map[string]int{<span class="string">"quick"</span>:<span class="number">1</span>, <span class="string">"brown"</span>:<span class="number">1</span>, <span class="string">"the"</span>:<span class="number">1</span>, <span class="string">"dog."</span>:<span class="number">1</span>, <span class="string">"The"</span>:<span class="number">1</span>, <span class="string">"jumped"</span>:<span class="number">1</span>, <span class="string">"over"</span>:<span class="number">1</span>, <span class="string">"lazy"</span>:<span class="number">1</span>, <span class="string">"fox"</span>:<span class="number">1</span>}</span><br><span class="line">PASS</span><br><span class="line"> f(<span class="string">"I ate a donut. Then I ate another donut."</span>) =</span><br><span class="line"> map[string]int{<span class="string">"a"</span>:<span class="number">1</span>, <span class="string">"donut."</span>:<span class="number">2</span>, <span class="string">"Then"</span>:<span class="number">1</span>, <span class="string">"another"</span>:<span class="number">1</span>, <span class="string">"I"</span>:<span class="number">2</span>, <span class="string">"ate"</span>:<span class="number">2</span>}</span><br><span class="line">PASS</span><br><span class="line"> f(<span class="string">"A man a plan a canal panama."</span>) =</span><br><span class="line"> map[string]int{<span class="string">"A"</span>:<span class="number">1</span>, <span class="string">"man"</span>:<span class="number">1</span>, <span class="string">"a"</span>:<span class="number">2</span>, <span class="string">"plan"</span>:<span class="number">1</span>, <span class="string">"canal"</span>:<span class="number">1</span>, <span class="string">"panama."</span>:<span class="number">1</span>}</span><br></pre></td></tr></table></figure></p>
<p><strong>总结:</strong>此处应该属于google code的代码迁移到Github,但有的细节没更改完成导致的。</p>
<h3 id="tour"><a href="#tour" class="headerlink" title="tour"></a>tour</h3><p>Go的基本语言及数
Go学习笔记(一):环境配置
http://yoursite.com/2016/06/30/Go学习笔记(一):环境配置/
2016-06-30T04:25:07.000Z
2016-06-30T09:25:16.434Z
<p>Go Golang~</p>
<h3 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h3><p>从<a href="https://golang.org/dl/" target="_blank" rel="external">官网</a>下载安装文件,安装即可。<br>官网地址:<a href="https://golang.org/dl/" target="_blank" rel="external">https://golang.org/dl/</a><br>以windows为例,此文最新版本1.6.2,下载地址:<a href="https://golang.org/doc/install?download=go1.6.2.windows-amd64.msi" target="_blank" rel="external">https://golang.org/doc/install?download=go1.6.2.windows-amd64.msi</a><br>下载的.msi文件可直接安装,默认安装路径为:<code>c:\Go</code>,安装过程中可更改路径,如<code>D:\Program Files\Go\</code></p>
<h3 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h3><h4 id="加入path"><a href="#加入Path" class="headerlink" title="加入Path"></a>加入Path</h4><p>安装完成之后,需把Go加入环境变量中。<br>以Windows为例,如安装路径为<code>D:\Program Files\Go\</code>,则在系统的<code>Path</code>中添加<code>D:\Program Files\Go\bin</code>。</p>
<h4 id="配置goroot-gopath"><a href="#配置GOROOT-amp-GOPATH" class="headerlink" title="配置GOROOT & GOPATH"></a>配置<code>GOROOT</code> & <code>GOPATH</code></h4><p>安装完成后,默认会配置<code>GOROOT</code>,若没配置,可新建变量,其值为Go的安装目录,本文案例中为<code>D:\Program Files\Go</code>。<br><code>GOPATH</code>则与Go的workspace概念直接相关,且是<code>go install</code>、<code>go get</code>等命令的工作路径,若不配置该变量,使用以上命令时会报错。具体可参照下文:<a href="http://studygolang.com/articles/5936" target="_blank" rel="external">http://studygolang.com/articles/5936</a><br>此处,配置<code>GOPATH</code>。结果如截图所示:<br><img src="/images/src/Go_env.png" alt="Go配置"></p>
<h3 id="go工作空间浅析"><a href="#Go工作空间浅析" class="headerlink" title="Go工作空间浅析"></a>Go工作空间浅析</h3><p>Go的工作空间可参照博文:<a href="http://studygolang.com/articles/5936" target="_blank" rel="external">http://studygolang.com/articles/5936</a><br>该博文大多数都讲解得比较细致。但关于<code>bin</code>文件夹的讲解略有缺失,在此补充。<br>使用<code>go install</code>吧编译<code>.go</code>文件,可在<code>pkg</code>中得到二进制的包,但不一定会在<code>bin</code>中得到可执行的二进制文件。<br>只有编译的源文件中有<code>package</code>为<code>main</code>,且代码中有<code>main</code>函数的情况下,才会在<code>bin</code>中编译得到可执行二进制文件。</p>
<p>Go Golang~</p>
<h3 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h3
Brief Interview
http://yoursite.com/2016/06/27/Brief-Interview/
2016-06-27T01:33:58.000Z
2016-06-27T03:24:57.370Z
<p>此为Server端面试的一些常见知识点,仅做参考。</p>
<h3 id="introduction"><a href="#Introduction" class="headerlink" title="Introduction"></a>Introduction</h3><p>常见的面试过程,大概可分为基础知识+项目经验。其中项目经验各有差异,但若项目经验中与面试部门的业务相关,相对会有优势。<br>基础知识点可大概分为:语言、算法(部分需要讲出思路或者手写代码)、数据库、网络、Linux、操作系统等。<br>总结性的可参照<a href="https://github.com/taizilongxu/interview_python" target="_blank" rel="external">此python面试题</a></p>
<h3 id="语言"><a href="#语言" class="headerlink" title="语言"></a>语言</h3><p>语言面试与各个公司的招聘需求相关。</p>
<h4 id="php"><a href="#PHP" class="headerlink" title="PHP"></a>PHP</h4><p>PHP语言本身,学习的话,可参照<a href="http://www.runoob.com/php/php-restful.html" target="_blank" rel="external">菜鸟教程-PHP</a>,其核心在于字符串以及数组。<br>由于PHP是以web开发为主,且部分前端可能要PHP工程师自己完成,故PHP面试常与服务器、数据库、nginx。前端同时问,可参照网上常见面试题:<br><a href="http://my.oschina.net/u/574366/blog/64814" target="_blank" rel="external">oschina</a>、<a href="https://www.zhihu.com/question/19605013" target="_blank" rel="external">知乎</a>等。</p>
<h4 id="java"><a href="#Java" class="headerlink" title="Java"></a>Java</h4><p>Java可在牛客网上找些面经参考。<br>其中,Java虚拟机、垃圾回收、集合类型(Collection Utils)、线程等。Spring等Java框架也会有所涉及。<br>可参照<a href="https://dongchuan.gitbooks.io/java-interview-question/content/" target="_blank" rel="external">GitBook</a></p>
<h3 id="算法"><a href="#算法" class="headerlink" title="算法"></a>算法</h3><p>算法可大概归类为字符串操作、排序、树操作等。此方面准备可参照<a href="https://www.nowcoder.com/ta/coding-interviews?page=1" target="_blank" rel="external">《剑指offer》</a>、《编程之美》等书籍,以及网上的一些教程、面试题等,推荐:<br><a href="https://github.com/julycoding/The-Art-Of-Programming-By-July/blob/master/ebook/zh/Readme.md" target="_blank" rel="external">july算法讲解</a>、<a href="https://leetcode.com/" target="_blank" rel="external">Leetcode</a>(该题刷部分即可,主要找感觉,网上有大量讲解)</p>
<h3 id="数据库"><a href="#数据库" class="headerlink" title="数据库"></a>数据库</h3><p>数据库主要考察<a href="http://www.runoob.com/sql/sql-tutorial.html" target="_blank" rel="external">SQL语句</a>,<a href="http://tech.meituan.com/mysql-index.html" target="_blank" rel="external">数据库索引</a>等<br>另外,Redis、memcached等也会考察。<br>参照:<br>Redis面试题:<a href="http://www.100mian.com/mianshi/dba/37381.html" target="_blank" rel="external">http://www.100mian.com/mianshi/dba/37381.html</a></p>
<h3 id="网络"><a href="#网络" class="headerlink" title="网络"></a>网络</h3><p>网络部分,参见参照<a href="https://github.com/taizilongxu/interview_python" target="_blank" rel="external">此python面试题</a>中的网络部分</p>
<p>此为Server端面试的一些常见知识点,仅做&#x
Python3爬虫学习(一):糗百 & 百度贴吧
http://yoursite.com/2016/06/24/Python3爬虫学习(一):糗百-百度贴吧/
2016-06-24T03:57:08.000Z
2016-06-24T04:37:26.088Z
<h3 id="introduction"><a href="#Introduction" class="headerlink" title="Introduction"></a>Introduction</h3><p>爬虫接触很浅,但有时候自己折腾玩的时候,通过爬虫获取数据是一种比较好的方式。之前做项目的时候接触过PHP的爬虫,其本质是通过curl模拟网络请求,对爬虫有了个大概的认识。而Python爬虫最为火爆,因此想抽空折腾折腾。</p>
<h3 id="学习资料"><a href="#学习资料" class="headerlink" title="学习资料"></a>学习资料</h3><p>网上找了篇教程了解了下,Python爬虫主要在于:Python基本语法、urllib库应用、Python爬虫框架。其中,<br><strong>Python</strong>基础语法:参照了<a href="http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000" target="_blank" rel="external">廖雪峰</a><br><strong>urllib</strong>则以<a href="https://docs.python.org/3/library/urllib.html" target="_blank" rel="external">官方doc</a>为主<br><strong>爬虫框架及爬虫概念</strong>,参照了<a href="http://cuiqingcai.com/1052.html" target="_blank" rel="external">崔庆才的博客</a></p>
<p>比较Python2和Python3,想尝试用新的技术,故选用Python3作为工具。学习过程中,参照<a href="http://cuiqingcai.com/1052.html" target="_blank" rel="external">崔庆才的博客</a>做了些demo(原文基于Python2.7实现),可参照<a href="https://github.com/damye/pythonSpiderStudy" target="_blank" rel="external">github demo</a></p>
<h3 id="introduction"><a href="#Introduction" class="headerlink" title="Introduction"></a>Introduction</h3><p>爬虫接࢞
Laravel后台系统实战(四):中间件应用之侧边栏选中
http://yoursite.com/2016/03/30/Laravel后台系统实战(四):中间件应用之侧边栏选中/
2016-03-30T06:35:17.000Z
2016-03-31T02:07:39.830Z
<p>本文项目的GitHub地址为:<a href="https://github.com/damye/Laravel-dashboard-demo" target="_blank" rel="external">GitHub地址</a>,可参考。</p>
<h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><p>之前例子的页面中,无论点击“Users”还是“Tasks”,侧边栏相应的位置都未被选中,即无法直观地得知当前页面是点击那个侧边栏标签进入的。其中Bootstrap提供了css样式,可以显示选中,如:<br><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="title">li</span> <span class="attribute">class</span>=<span class="value">"active"</span>></span><span class="tag"><<span class="title">a</span> <span class="attribute">href</span>=<span class="value">"{{ url('/user') }}"</span>></span>Users<span class="tag"></<span class="title">a</span>></span><span class="tag"></<span class="title">li</span>></span></span><br></pre></td></tr></table></figure></p>
<p>但若将该以上语句写死,则无法动态切换,如选中“Tasks”时,就无法正常显示。因此,需要考虑动态显示的方案。<br>常见的处理方案可分为两种。<br>其一为动态生成网页的侧边栏,即根据配置及当前的选中,生成侧边栏、顶部栏,然后再和主体拼接得到完整的网页。可写个SideBar的类完成该操作,扩张性较好。<br>另外,可将当前的选中返回前台页面,然后前端通过逻辑处理选中,该方法实现上较简单,因此此处使用该方式。<br>Laravel中提供了<a href="https://laravel.com/docs/5.2/middleware" target="_blank" rel="external">中间件</a>,用于处理一些HTTP请求、身份验证等功能,同时还有用于运行各种任务。<br>本章此需求的思路为:</p>
<blockquote>
<p>解析URL中主机地址后的模块名<br>将该模块名返回到前端</p>
</blockquote>
<p>因此,此处使用中间件实现该功能。</p>
<h3 id="创建中间件"><a href="#创建中间件" class="headerlink" title="创建中间件"></a>创建中间件</h3><p>在<code>Artisan</code>命令行中创建中间件:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">php artisan make:middleware RequestRoute</span><br></pre></td></tr></table></figure></p>
<p>在该中间件中处理请求的URL。<br>中间件的处理可在基本逻辑之前或之后,由于要在视图中显示请求URL后的模块名,故此处使用<code>view</code>的<code>share</code>方法,在填充<code>view</code>层数据之前,将该数据共享给<code>view</code>,具体可参照<a href="https://laravel.com/docs/5.2/views#sharing-data-with-all-views" target="_blank" rel="external">sharing data with all views</a>。<br>该中间件参照代码:<br><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="preprocessor"><?php</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">App</span>\<span class="title">Http</span>\<span class="title">Middleware</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">use</span> <span class="title">Closure</span>;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">RequestRoute</span></span><br><span class="line"></span>{</span><br><span class="line"> <span class="comment">/**</span><br><span class="line"> * process url for selected</span><br><span class="line"> * this work must handle before fill view data</span><br><span class="line"> *</span><br><span class="line"> * <span class="doctag">@param</span> \Illuminate\Http\Request $request</span><br><span class="line"> * <span class="doctag">@param</span> \Closure $next</span><br><span class="line"> * <span class="doctag">@return</span> mixed</span><br><span class="line"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">handle</span><span class="params">(<span class="variable">$request</span>, Closure <span class="variable">$next</span>)</span></span><br><span class="line"> </span>{</span><br><span class="line"> <span class="comment">// parse url</span></span><br><span class="line"> preg_match(<span class="string">'/^http:\/\/([\w.]+)\/([\w]+)/i'</span>, <span class="variable">$request</span>->url(), <span class="variable">$matches</span>);</span><br><span class="line"></span><br><span class="line"> <span class="comment">// add share view</span></span><br><span class="line"> <span class="keyword">if</span>(!<span class="keyword">empty</span>(<span class="variable">$matches</span>[<span class="number">2</span>]))</span><br><span class="line"> {</span><br><span class="line"> view()->share(<span class="string">'requestRoute'</span>,<span class="variable">$matches</span>[<span class="number">2</span>]);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> <span class="variable">$next</span>(<span class="variable">$request</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p>此处需使用<code>share view</code>实现该功能。其中尝试过先填充<code>view</code>,然后再获取<code>response</code>,再重新在获取到的<code>content</code>里面赋值,重新封装为response,该种方式有问题,具体原因不详。以上方式测试通过。</p>
<h3 id="注册中间件"><a href="#注册中间件" class="headerlink" title="注册中间件"></a>注册中间件</h3><p>生成中间件之后,在<code>app/Http/Kernel.php</code>中注册注册中间件,如下所示:<br><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">protected</span> <span class="variable">$routeMiddleware</span> = [</span><br><span class="line"> <span class="string">'auth'</span> => \App\Http\Middleware\Authenticate::class,</span><br><span class="line"> <span class="string">'auth.basic'</span> => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,</span><br><span class="line"> <span class="string">'guest'</span> => \App\Http\Middleware\RedirectIfAuthenticated::class,</span><br><span class="line"> <span class="string">'throttle'</span> => \Illuminate\Routing\Middleware\ThrottleRequests::class,</span><br><span class="line"> <span class="string">'request.route'</span> => \App\Http\Middleware\RequestRoute::class,</span><br><span class="line">];</span><br></pre></td></tr></table></figure></p>
<p>注册的中间件为<code>request.route</code>。</p>
<h3 id="路由中添加中间件"><a href="#路由中添加中间件" class="headerlink" title="路由中添加中间件"></a>路由中添加中间件</h3><p>注册之后,在路由中添加,对需要的部分路由添加该中间件,添加如下为例:<br><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">Route::group([<span class="string">'middleware'</span> => [<span class="string">'web'</span>, <span class="string">'request.route'</span>]], <span class="function"><span class="keyword">function</span> <span class="params">()</span> </span>{</span><br><span class="line"></span><br><span class="line"> Route::resource(<span class="string">'task'</span>, <span class="string">'TaskController'</span>);</span><br><span class="line"> Route::resource(<span class="string">'user'</span>, <span class="string">'UserController'</span>);</span><br><span class="line"> Route::auth();</span><br><span class="line">});</span><br></pre></td></tr></table></figure></p>
<p>同时添加<code>web</code>、<code>request.route</code>。</p>
<h3 id="前端显示"><a href="#前端显示" class="headerlink" title="前端显示"></a>前端显示</h3><p>最后,在前端选中。此处使用了Laravel的blade模板,程序示例为:<br><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="title">ul</span> <span class="attribute">class</span>=<span class="value">"nav nav-sidebar"</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">li</span> @<span class="attribute">if</span>(<span class="attribute">isset</span>($<span class="attribute">requestRoute</span>)) @<span class="attribute">if</span>($<span class="attribute">requestRoute</span> =<span class="value">=</span> '<span class="attribute">user</span>') <span class="attribute">class</span>=<span class="value">"active"</span> @<span class="attribute">endif</span> @<span class="attribute">endif</span>></span><span class="tag"><<span class="title">a</span> <span class="attribute">href</span>=<span class="value">"{{ url('/user') }}"</span>></span>Users<span class="tag"></<span class="title">a</span>></span><span class="tag"></<span class="title">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">li</span> @<span class="attribute">if</span>(<span class="attribute">isset</span>($<span class="attribute">requestRoute</span>)) @<span class="attribute">if</span>($<span class="attribute">requestRoute</span> =<span class="value">=</span> '<span class="attribute">task</span>') <span class="attribute">class</span>=<span class="value">"active"</span> @<span class="attribute">endif</span> @<span class="attribute">endif</span>></span><span class="tag"><<span class="title">a</span> <span class="attribute">href</span>=<span class="value">"{{ url('/task') }}"</span>></span>Tasks<span class="tag"></<span class="title">a</span>></span><span class="tag"></<span class="title">li</span>></span></span><br><span class="line"><span class="tag"></<span class="title">ul</span>></span></span><br></pre></td></tr></table></figure></p>
<p>如此,即可完成侧边栏选中。</p>
<h3 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h3><p>本文中使用中间件实现了侧边栏的选中,简单介绍了中间件的使用。<br>但本文方案也有不少缺陷,如严重依赖于主机名之后的模块名。</p>
<p>本文项目的GitHub地址为:<a href="https://github.com/damye/Laravel-dashboard-demo" t
Laravel后台系统实战(三):任务创建及管理
http://yoursite.com/2016/03/30/Laravel后台系统实战(三):任务创建及管理/
2016-03-30T02:12:59.000Z
2016-03-31T02:03:12.948Z
<p>在实际应用中,订单类型的操作会很多,如订单操作中的订单创建、列表显示、删除、修改、分页等,本章以此为例,简要介绍其在Laravel中的应用。<br>此文借鉴了<a href="https://laravel.com/docs/5.2/quickstart-intermediate" target="_blank" rel="external">Laravel的quickshtart</a>。<br>本文项目的GitHub地址为:<a href="https://github.com/damye/Laravel-dashboard-demo" target="_blank" rel="external">GitHub地址</a>,可参考。</p>
<h3 id="基本mvc实例"><a href="#基本MVC实例" class="headerlink" title="基本MVC实例"></a>基本MVC实例</h3><h4 id="创建模型"><a href="#创建模型" class="headerlink" title="创建模型"></a>创建模型</h4><p>使用<code>Artisan</code>创建Model:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">php artisan make:model Task</span><br></pre></td></tr></table></figure></p>
<p>任务与任务的创建者相关,因此,默认只显示当前用户对应的任务,故<code>Task</code>Model为:<br><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="preprocessor"><?php</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">App</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">use</span> <span class="title">App</span>\<span class="title">User</span>;</span><br><span class="line"><span class="keyword">use</span> <span class="title">Illuminate</span>\<span class="title">Database</span>\<span class="title">Eloquent</span>\<span class="title">Model</span>;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Task</span> <span class="keyword">extends</span> <span class="title">Model</span></span><br><span class="line"></span>{</span><br><span class="line"> <span class="comment">/**</span><br><span class="line"> * The attributes that are mass assignable.</span><br><span class="line"> *</span><br><span class="line"> * <span class="doctag">@var</span> array</span><br><span class="line"> */</span></span><br><span class="line"> <span class="keyword">protected</span> <span class="variable">$fillable</span> = [<span class="string">'name'</span>];</span><br><span class="line"> </span><br><span class="line"> <span class="comment">/**</span><br><span class="line"> * The attributes that should be cast to native types.</span><br><span class="line"> *</span><br><span class="line"> * <span class="doctag">@var</span> array</span><br><span class="line"> */</span></span><br><span class="line"> <span class="keyword">protected</span> <span class="variable">$casts</span> = [</span><br><span class="line"> <span class="string">'user_id'</span> => <span class="string">'int'</span>,</span><br><span class="line"> ];</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span><br><span class="line"> * Get the user that owns the task.</span><br><span class="line"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">user</span><span class="params">()</span></span><br><span class="line"> </span>{</span><br><span class="line"> <span class="keyword">return</span> <span class="variable">$this</span>->belongsTo(User::class);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<h4 id="创建控制器"><a href="#创建控制器" class="headerlink" title="创建控制器"></a>创建控制器</h4><p>使用<code>Artisan</code>创建Controller:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">php artisan make:controller TaskController</span><br></pre></td></tr></table></figure></p>
<p>将task相关的所有请求路由到TaskController中,因此,在<code>routes.php</code>中增加task的resource:<br><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">Route::group([<span class="string">'middleware'</span> => [<span class="string">'web'</span>]], <span class="function"><span class="keyword">function</span> <span class="params">()</span> </span>{</span><br><span class="line"> Route::resource(<span class="string">'task'</span>, <span class="string">'TaskController'</span>);</span><br><span class="line"> Route::resource(<span class="string">'user'</span>, <span class="string">'UserController'</span>);</span><br><span class="line"> Route::auth();</span><br><span class="line">});</span><br></pre></td></tr></table></figure></p>
<p>在Controller中,定义获取list、创建、删除的方法,根据<a href="https://laravel.com/docs/5.2/controllers" target="_blank" rel="external">Laravel Controller定义</a>分别为<code>index</code>、<code>store</code>、<code>destroy</code>,实现如下:<br><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br></pre></td><td class="code"><pre><span class="line"><span class="preprocessor"><?php</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">App</span>\<span class="title">Http</span>\<span class="title">Controllers</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">use</span> <span class="title">Illuminate</span>\<span class="title">Http</span>\<span class="title">Request</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">use</span> <span class="title">App</span>\<span class="title">Http</span>\<span class="title">Requests</span>;</span><br><span class="line"><span class="keyword">use</span> <span class="title">App</span>\<span class="title">Http</span>\<span class="title">Controllers</span>\<span class="title">Controller</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">use</span> <span class="title">App</span>\<span class="title">Task</span>;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">TaskController</span> <span class="keyword">extends</span> <span class="title">Controller</span></span><br><span class="line"></span>{</span><br><span class="line"> <span class="comment">/**</span><br><span class="line"> * Display a list of all of the user's task.</span><br><span class="line"> *</span><br><span class="line"> * <span class="doctag">@param</span> Request $request</span><br><span class="line"> * <span class="doctag">@return</span> Response</span><br><span class="line"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">index</span><span class="params">(Request <span class="variable">$request</span>)</span></span><br><span class="line"> </span>{</span><br><span class="line"> <span class="keyword">return</span> view(<span class="string">'tasks.index'</span>, [</span><br><span class="line"> <span class="string">'tasks'</span> => Task::orderBy(<span class="string">'created_at'</span>, <span class="string">'asc'</span>)->get()</span><br><span class="line"> ]);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span><br><span class="line"> * Create a new task.</span><br><span class="line"> *</span><br><span class="line"> * <span class="doctag">@param</span> Request $request</span><br><span class="line"> * <span class="doctag">@return</span> Response</span><br><span class="line"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">store</span><span class="params">(Request <span class="variable">$request</span>)</span></span><br><span class="line"> </span>{</span><br><span class="line"> <span class="variable">$validator</span> = Validator::make(<span class="variable">$request</span>->all(), [</span><br><span class="line"> <span class="string">'name'</span> => <span class="string">'required|max:255'</span>,</span><br><span class="line"> ]);</span><br><span class="line"> <span class="keyword">if</span> (<span class="variable">$validator</span>->fails()) {</span><br><span class="line"> <span class="keyword">return</span> redirect(<span class="string">'/tasks'</span>)</span><br><span class="line"> ->withInput()</span><br><span class="line"> ->withErrors(<span class="variable">$validator</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="variable">$task</span> = <span class="keyword">new</span> Task;</span><br><span class="line"> <span class="variable">$task</span>->name = <span class="variable">$request</span>->name;</span><br><span class="line"> <span class="variable">$task</span>->save();</span><br><span class="line"> <span class="keyword">return</span> redirect(<span class="string">'/tasks'</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span><br><span class="line"> * Destroy the given task.</span><br><span class="line"> *</span><br><span class="line"> * <span class="doctag">@param</span> Request $request</span><br><span class="line"> * <span class="doctag">@param</span> Task $task</span><br><span class="line"> * <span class="doctag">@return</span> Response</span><br><span class="line"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">destroy</span><span class="params">(Request <span class="variable">$request</span>, Task <span class="variable">$task</span>)</span></span><br><span class="line"> </span>{</span><br><span class="line"> Task::findOrFail(<span class="variable">$id</span>)->delete();</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> redirect(<span class="string">'/tasks'</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<h4 id="创建视图"><a href="#创建视图" class="headerlink" title="创建视图"></a>创建视图</h4><p>根据Controller中的定义,定义默认task的视图。在<code>resources/views</code>下创建<code>tasks</code>的文件夹,然后在其中创建<code>index.blade.php</code>的文件,其内容为:<br><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br></pre></td><td class="code"><pre><span class="line">@extends('layouts.app')</span><br><span class="line"></span><br><span class="line">@section('content')</span><br><span class="line"> <span class="tag"><<span class="title">div</span> <span class="attribute">class</span>=<span class="value">"container"</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">div</span> <span class="attribute">class</span>=<span class="value">"col-sm-offset-2 col-sm-8"</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">div</span> <span class="attribute">class</span>=<span class="value">"panel panel-default"</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">div</span> <span class="attribute">class</span>=<span class="value">"panel-heading"</span>></span></span><br><span class="line"> New Task</span><br><span class="line"> <span class="tag"></<span class="title">div</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="title">div</span> <span class="attribute">class</span>=<span class="value">"panel-body"</span>></span></span><br><span class="line"> <span class="comment"><!-- Display Validation Errors --></span></span><br><span class="line"> @include('common.errors')</span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- New Task Form --></span></span><br><span class="line"> <span class="tag"><<span class="title">form</span> <span class="attribute">action</span>=<span class="value">"/task"</span> <span class="attribute">method</span>=<span class="value">"POST"</span> <span class="attribute">class</span>=<span class="value">"form-horizontal"</span>></span></span><br><span class="line"> {{ csrf_field() }}</span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- Task Name --></span></span><br><span class="line"> <span class="tag"><<span class="title">div</span> <span class="attribute">class</span>=<span class="value">"form-group"</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">label</span> <span class="attribute">for</span>=<span class="value">"task-name"</span> <span class="attribute">class</span>=<span class="value">"col-sm-3 control-label"</span>></span>Task<span class="tag"></<span class="title">label</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="title">div</span> <span class="attribute">class</span>=<span class="value">"col-sm-6"</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">input</span> <span class="attribute">type</span>=<span class="value">"text"</span> <span class="attribute">name</span>=<span class="value">"name"</span> <span class="attribute">id</span>=<span class="value">"task-name"</span> <span class="attribute">class</span>=<span class="value">"form-control"</span> <span class="attribute">value</span>=<span class="value">"{{ old('task') }}"</span>></span></span><br><span class="line"> <span class="tag"></<span class="title">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="title">div</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- Add Task Button --></span></span><br><span class="line"> <span class="tag"><<span class="title">div</span> <span class="attribute">class</span>=<span class="value">"form-group"</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">div</span> <span class="attribute">class</span>=<span class="value">"col-sm-offset-3 col-sm-6"</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">button</span> <span class="attribute">type</span>=<span class="value">"submit"</span> <span class="attribute">class</span>=<span class="value">"btn btn-default"</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">i</span> <span class="attribute">class</span>=<span class="value">"fa fa-btn fa-plus"</span>></span><span class="tag"></<span class="title">i</span>></span>Add Task</span><br><span class="line"> <span class="tag"></<span class="title">button</span>></span></span><br><span class="line"> <span class="tag"></<span class="title">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="title">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="title">form</span>></span></span><br><span class="line"> <span class="tag"></<span class="title">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="title">div</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- Current Tasks --></span></span><br><span class="line"> @if (count($tasks) > 0)</span><br><span class="line"> <span class="tag"><<span class="title">div</span> <span class="attribute">class</span>=<span class="value">"panel panel-default"</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">div</span> <span class="attribute">class</span>=<span class="value">"panel-heading"</span>></span></span><br><span class="line"> Current Tasks</span><br><span class="line"> <span class="tag"></<span class="title">div</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="title">div</span> <span class="attribute">class</span>=<span class="value">"panel-body"</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">table</span> <span class="attribute">class</span>=<span class="value">"table table-striped task-table"</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">thead</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">th</span>></span>Task<span class="tag"></<span class="title">th</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">th</span>></span>&nbsp;<span class="tag"></<span class="title">th</span>></span></span><br><span class="line"> <span class="tag"></<span class="title">thead</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">tbody</span>></span></span><br><span class="line"> @foreach ($tasks as $task)</span><br><span class="line"> <span class="tag"><<span class="title">tr</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">td</span> <span class="attribute">class</span>=<span class="value">"table-text"</span>></span><span class="tag"><<span class="title">div</span>></span>{{ $task->name }}<span class="tag"></<span class="title">div</span>></span><span class="tag"></<span class="title">td</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- Task Delete Button --></span></span><br><span class="line"> <span class="tag"><<span class="title">td</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">form</span> <span class="attribute">action</span>=<span class="value">"/task/{{ $task->id }}"</span> <span class="attribute">method</span>=<span class="value">"POST"</span>></span></span><br><span class="line"> {{ csrf_field() }}</span><br><span class="line"> {{ method_field('DELETE') }}</span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="title">button</span> <span class="attribute">type</span>=<span class="value">"submit"</span> <span class="attribute">id</span>=<span class="value">"delete-task-{{ $task->id }}"</span> <span class="attribute">class</span>=<span class="value">"btn btn-danger"</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">i</span> <span class="attribute">class</span>=<span class="value">"fa fa-btn fa-trash"</span>></span><span class="tag"></<span class="title">i</span>></span>Delete</span><br><span class="line"> <span class="tag"></<span class="title">button</span>></span></span><br><span class="line"> <span class="tag"></<span class="title">form</span>></span></span><br><span class="line"> <span class="tag"></<span class="title">td</span>></span></span><br><span class="line"> <span class="tag"></<span class="title">tr</span>></span></span><br><span class="line"> @endforeach</span><br><span class="line"> <span class="tag"></<span class="title">tbody</span>></span></span><br><span class="line"> <span class="tag"></<span class="title">table</span>></span></span><br><span class="line"> <span class="tag"></<span class="title">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="title">div</span>></span></span><br><span class="line"> @endif</span><br><span class="line"> <span class="tag"></<span class="title">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="title">div</span>></span></span><br><span class="line">@endsection</span><br></pre></td></tr></table></figure></p>
<p>此处将创建人物、列表展示以及删除人物均整合到该页面中。<br>同时,在<code>app.blade.php</code>中删除冗余的侧边栏导航,增加<code>Tasks</code>的导航。<br>如此,点击侧边栏的<code>Tasks</code>,可看到页面:<br><img src="/images/src/laravel_demo_taskPrimary.png" alt="Tasks基本页面"><br>其中数据通过seed填充。</p>
<h3 id="基本mvc进阶"><a href="#基本MVC进阶" class="headerlink" title="基本MVC进阶"></a>基本MVC进阶</h3><p>在用户登录及管理章节中,我们使用了Repository。同时,对于删除操作,一般而言,只允许该任务的创建者才拥有删除权限,因此,此处对以上的流程稍作优化。</p>
<h4 id="创建repository"><a href="#创建Repository" class="headerlink" title="创建Repository"></a>创建Repository</h4><p>在<code>app/Repositories</code>中创建<code>TaskRepository.php</code>,在其中使用用户权限管理,即为:<br><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="preprocessor"><?php</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">App</span>\<span class="title">Repositories</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">use</span> <span class="title">App</span>\<span class="title">User</span>;</span><br><span class="line"><span class="keyword">use</span> <span class="title">App</span>\<span class="title">Task</span>;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">TaskRepository</span></span><br><span class="line"></span>{</span><br><span class="line"> <span class="comment">/**</span><br><span class="line"> * Get all of the tasks for a given user.</span><br><span class="line"> *</span><br><span class="line"> * <span class="doctag">@param</span> User $user</span><br><span class="line"> * <span class="doctag">@return</span> Collection</span><br><span class="line"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">forUser</span><span class="params">(User <span class="variable">$user</span>)</span></span><br><span class="line"> </span>{</span><br><span class="line"> <span class="keyword">return</span> Task::where(<span class="string">'user_id'</span>, <span class="variable">$user</span>->id)</span><br><span class="line"> ->orderBy(<span class="string">'created_at'</span>, <span class="string">'asc'</span>)</span><br><span class="line"> ->get();</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<h4 id="使用auth控制删除"><a href="#使用auth控制删除" class="headerlink" title="使用auth控制删除"></a>使用auth控制删除</h4><p>首先在<code>app/Policies</code>中创建<code>TaskPlolicy.php</code>,限制<code>destroy</code>方法:<br><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="preprocessor"><?php</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">App</span>\<span class="title">Policies</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">use</span> <span class="title">App</span>\<span class="title">User</span>;</span><br><span class="line"><span class="keyword">use</span> <span class="title">App</span>\<span class="title">Task</span>;</span><br><span class="line"><span class="keyword">use</span> <span class="title">Illuminate</span>\<span class="title">Auth</span>\<span class="title">Access</span>\<span class="title">HandlesAuthorization</span>;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">TaskPolicy</span></span><br><span class="line"></span>{</span><br><span class="line"> <span class="keyword">use</span> <span class="title">HandlesAuthorization</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span><br><span class="line"> * Determine if the given user can delete the given task.</span><br><span class="line"> *</span><br><span class="line"> * <span class="doctag">@param</span> User $user</span><br><span class="line"> * <span class="doctag">@param</span> Task $task</span><br><span class="line"> * <span class="doctag">@return</span> bool</span><br><span class="line"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">destroy</span><span class="params">(User <span class="variable">$user</span>, Task <span class="variable">$task</span>)</span></span><br><span class="line"> </span>{</span><br><span class="line"> <span class="keyword">return</span> <span class="variable">$user</span>->id === <span class="variable">$task</span>->user_id;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p>然后在<code>app/Providers/AuthServiceProvider.php</code>中添加到<code>$policies</code>中:<br><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">protected</span> <span class="variable">$policies</span> = [</span><br><span class="line"> <span class="string">'App\Task'</span> => <span class="string">'App\Policies\TaskPolicy'</span>,</span><br><span class="line">];</span><br></pre></td></tr></table></figure></p>
<p>如此,可在Controller中使用。</p>
<h4 id="改造controller"><a href="#改造Controller" class="headerlink" title="改造Controller"></a>改造Controller</h4><p>在以上Repository和Policy基础上,改造Controller,如下:<br><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br></pre></td><td class="code"><pre><span class="line"><span class="preprocessor"><?php</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">App</span>\<span class="title">Http</span>\<span class="title">Controllers</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">use</span> <span class="title">Illuminate</span>\<span class="title">Http</span>\<span class="title">Request</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">use</span> <span class="title">App</span>\<span class="title">Http</span>\<span class="title">Requests</span>;</span><br><span class="line"><span class="keyword">use</span> <span class="title">App</span>\<span class="title">Http</span>\<span class="title">Controllers</span>\<span class="title">Controller</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">use</span> <span class="title">App</span>\<span class="title">Task</span>;</span><br><span class="line"><span class="keyword">use</span> <span class="title">App</span>\<span class="title">Repositories</span>\<span class="title">TaskRepository</span>;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">TaskController</span> <span class="keyword">extends</span> <span class="title">Controller</span></span><br><span class="line"></span>{</span><br><span class="line"> <span class="comment">/**</span><br><span class="line"> * The task repository instance.</span><br><span class="line"> *</span><br><span class="line"> * <span class="doctag">@var</span> TaskRepository</span><br><span class="line"> */</span></span><br><span class="line"> <span class="keyword">protected</span> <span class="variable">$tasks</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span><br><span class="line"> * Create a new controller instance.</span><br><span class="line"> *</span><br><span class="line"> * <span class="doctag">@param</span> TaskRepository $tasks</span><br><span class="line"> * <span class="doctag">@return</span> void</span><br><span class="line"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__construct</span><span class="params">(TaskRepository <span class="variable">$tasks</span>)</span></span><br><span class="line"> </span>{</span><br><span class="line"> <span class="variable">$this</span>->middleware(<span class="string">'auth'</span>);</span><br><span class="line"></span><br><span class="line"> <span class="variable">$this</span>->tasks = <span class="variable">$tasks</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span><br><span class="line"> * Display a list of all of the user's task.</span><br><span class="line"> *</span><br><span class="line"> * <span class="doctag">@param</span> Request $request</span><br><span class="line"> * <span class="doctag">@return</span> Response</span><br><span class="line"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">index</span><span class="params">(Request <span class="variable">$request</span>)</span></span><br><span class="line"> </span>{</span><br><span class="line"> <span class="keyword">return</span> view(<span class="string">'tasks.index'</span>, [</span><br><span class="line"> <span class="string">'tasks'</span> => <span class="variable">$this</span>->tasks->forUser(<span class="variable">$request</span>->user()),</span><br><span class="line"> ]);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span><br><span class="line"> * Create a new task.</span><br><span class="line"> *</span><br><span class="line"> * <span class="doctag">@param</span> Request $request</span><br><span class="line"> * <span class="doctag">@return</span> Response</span><br><span class="line"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">store</span><span class="params">(Request <span class="variable">$request</span>)</span></span><br><span class="line"> </span>{</span><br><span class="line"> <span class="variable">$this</span>->validate(<span class="variable">$request</span>, [</span><br><span class="line"> <span class="string">'name'</span> => <span class="string">'required|max:255'</span>,</span><br><span class="line"> ]);</span><br><span class="line"></span><br><span class="line"> <span class="variable">$request</span>->user()->tasks()->create([</span><br><span class="line"> <span class="string">'name'</span> => <span class="variable">$request</span>->name,</span><br><span class="line"> ]);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> redirect(<span class="string">'/task'</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span><br><span class="line"> * Destroy the given task.</span><br><span class="line"> *</span><br><span class="line"> * <span class="doctag">@param</span> Request $request</span><br><span class="line"> * <span class="doctag">@param</span> Task $task</span><br><span class="line"> * <span class="doctag">@return</span> Response</span><br><span class="line"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">destroy</span><span class="params">(Request <span class="variable">$request</span>, Task <span class="variable">$task</span>)</span></span><br><span class="line"> </span>{</span><br><span class="line"> <span class="variable">$this</span>->authorize(<span class="string">'destroy'</span>, <span class="variable">$task</span>);</span><br><span class="line"></span><br><span class="line"> <span class="variable">$task</span>->delete();</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> redirect(<span class="string">'/task'</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p>其中通过构造方法注入Repository,并使用<code>$this->authorize(‘destroy’, $task)</code>判断删除操作时候被授权,若未被授权,则该操作终止。</p>
<h3 id="分页"><a href="#分页" class="headerlink" title="分页"></a>分页</h3><p>当任务太过,上百甚至上千时,需要使用分页显示。Laravel中自带了<a href="https://laravel.com/docs/5.2/pagination" target="_blank" rel="external">分页功能</a>,可通过该功能快速地实现分页,以及下一页等的URL,同时提供了前端显示的基于Bootstrap的demo。<br>Laravel提供了<code>paginate</code>方法用于分页,可在<a href="https://laravel.com/docs/5.2/queries" target="_blank" rel="external">query builder</a>以及<a href="https://laravel.com/docs/5.2/eloquent" target="_blank" rel="external">Eloquent query</a>中使用。如以上实例中,需要对分页显示20条数据,则将<code>TaskRepository</code>中的方法改为:<br><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">forUser</span><span class="params">(User <span class="variable">$user</span>)</span></span><br><span class="line"></span>{</span><br><span class="line"> <span class="keyword">return</span> Task::where(<span class="string">'user_id'</span>, <span class="variable">$user</span>->id)</span><br><span class="line"> ->orderBy(<span class="string">'created_at'</span>, <span class="string">'asc'</span>)</span><br><span class="line"> ->paginate(<span class="number">20</span>);</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p>增加<code>paginate</code>方法。<br>增加之后,可看到返回的数据中增加了分页信息,如示例所示:<br><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br></pre></td><td class="code"><pre><span class="line">{</span><br><span class="line"> "<span class="attribute">total</span>": <span class="value"><span class="number">23273</span></span>,</span><br><span class="line"> "<span class="attribute">per_page</span>": <span class="value"><span class="number">10</span></span>,</span><br><span class="line"> "<span class="attribute">current_page</span>": <span class="value"><span class="number">1</span></span>,</span><br><span class="line"> "<span class="attribute">last_page</span>": <span class="value"><span class="number">1164</span></span>,</span><br><span class="line"> "<span class="attribute">next_page_url</span>": <span class="value"><span class="string">"http://localhost/task?page=2"</span></span>,</span><br><span class="line"> "<span class="attribute">prev_page_url</span>": <span class="value"><span class="literal">null</span></span>,</span><br><span class="line"> "<span class="attribute">from</span>": <span class="value"><span class="number">1</span></span>,</span><br><span class="line"> "<span class="attribute">to</span>": <span class="value"><span class="number">20</span></span>,</span><br><span class="line"> "<span class="attribute">data</span>": <span class="value">[</span><br><span class="line"> {</span><br><span class="line"> "<span class="attribute">id</span>": <span class="value"><span class="number">3</span></span>,</span><br><span class="line"> "<span class="attribute">user_id</span>": <span class="value"><span class="number">1</span></span>,</span><br><span class="line"> "<span class="attribute">name</span>": <span class="value"><span class="string">"damye test task"</span></span>,</span><br><span class="line"> "<span class="attribute">created_at</span>": <span class="value"><span class="string">"2016-03-18 09:01:07"</span></span>,</span><br><span class="line"> "<span class="attribute">updated_at</span>": <span class="value"><span class="string">"2016-03-18 09:01:07"</span></span><br><span class="line"> </span>},</span><br><span class="line"> {</span><br><span class="line"> "<span class="attribute">id</span>": <span class="value"><span class="number">4</span></span>,</span><br><span class="line"> "<span class="attribute">user_id</span>": <span class="value"><span class="number">1</span></span>,</span><br><span class="line"> "<span class="attribute">name</span>": <span class="value"><span class="string">"test controller"</span></span>,</span><br><span class="line"> "<span class="attribute">created_at</span>": <span class="value"><span class="string">"2016-03-18 10:06:36"</span></span>,</span><br><span class="line"> "<span class="attribute">updated_at</span>": <span class="value"><span class="string">"2016-03-18 10:06:36"</span></span><br><span class="line"> </span>},</span><br><span class="line"> {</span><br><span class="line"> "<span class="attribute">id</span>": <span class="value"><span class="number">5</span></span>,</span><br><span class="line"> "<span class="attribute">user_id</span>": <span class="value"><span class="number">1</span></span>,</span><br><span class="line"> "<span class="attribute">name</span>": <span class="value"><span class="string">"432342"</span></span>,</span><br><span class="line"> "<span class="attribute">created_at</span>": <span class="value"><span class="string">"2016-03-18 10:09:53"</span></span>,</span><br><span class="line"> "<span class="attribute">updated_at</span>": <span class="value"><span class="string">"2016-03-18 10:09:53"</span></span><br><span class="line"> </span>},</span><br><span class="line"> {</span><br><span class="line"> "<span class="attribute">id</span>": <span class="value"><span class="number">6</span></span>,</span><br><span class="line"> "<span class="attribute">user_id</span>": <span class="value"><span class="number">1</span></span>,</span><br><span class="line"> "<span class="attribute">name</span>": <span class="value"><span class="string">"PejSLfbKwV"</span></span>,</span><br><span class="line"> "<span class="attribute">created_at</span>": <span class="value"><span class="string">"2016-03-29 08:04:30"</span></span>,</span><br><span class="line"> "<span class="attribute">updated_at</span>": <span class="value"><span class="string">"2016-03-29 08:04:30"</span></span><br><span class="line"> </span>},</span><br><span class="line"> {</span><br><span class="line"> "<span class="attribute">id</span>": <span class="value"><span class="number">7</span></span>,</span><br><span class="line"> "<span class="attribute">user_id</span>": <span class="value"><span class="number">1</span></span>,</span><br><span class="line"> "<span class="attribute">name</span>": <span class="value"><span class="string">"mAfmaBCsUS"</span></span>,</span><br><span class="line"> "<span class="attribute">created_at</span>": <span class="value"><span class="string">"2016-03-29 08:04:30"</span></span>,</span><br><span class="line"> "<span class="attribute">updated_at</span>": <span class="value"><span class="string">"2016-03-29 08:04:30"</span></span><br><span class="line"> </span>},</span><br><span class="line"> {</span><br><span class="line"> "<span class="attribute">id</span>": <span class="value"><span class="number">17</span></span>,</span><br><span class="line"> "<span class="attribute">user_id</span>": <span class="value"><span class="number">1</span></span>,</span><br><span class="line"> "<span class="attribute">name</span>": <span class="value"><span class="string">"VbVV5J7VvH"</span></span>,</span><br><span class="line"> "<span class="attribute">created_at</span>": <span class="value"><span class="string">"2016-03-29 08:04:31"</span></span>,</span><br><span class="line"> "<span class="attribute">updated_at</span>": <span class="value"><span class="string">"2016-03-29 08:04:31"</span></span><br><span class="line"> </span>},</span><br><span class="line"> {</span><br><span class="line"> "<span class="attribute">id</span>": <span class="value"><span class="number">18</span></span>,</span><br><span class="line"> "<span class="attribute">user_id</span>": <span class="value"><span class="number">1</span></span>,</span><br><span class="line"> "<span class="attribute">name</span>": <span class="value"><span class="string">"XQwXK9BeGE"</span></span>,</span><br><span class="line"> "<span class="attribute">created_at</span>": <span class="value"><span class="string">"2016-03-29 08:04:31"</span></span>,</span><br><span class="line"> "<span class="attribute">updated_at</span>": <span class="value"><span class="string">"2016-03-29 08:04:31"</span></span><br><span class="line"> </span>},</span><br><span class="line"> {</span><br><span class="line"> "<span class="attribute">id</span>": <span class="value"><span class="number">19</span></span>,</span><br><span class="line"> "<span class="attribute">user_id</span>": <span class="value"><span class="number">1</span></span>,</span><br><span class="line"> "<span class="attribute">name</span>": <span class="value"><span class="string">"3JhnyOLMgQ"</span></span>,</span><br><span class="line"> "<span class="attribute">created_at</span>": <span class="value"><span class="string">"2016-03-29 08:04:31"</span></span>,</span><br><span class="line"> "<span class="attribute">updated_at</span>": <span class="value"><span class="string">"2016-03-29 08:04:31"</span></span><br><span class="line"> </span>},</span><br><span class="line"> {</span><br><span class="line"> "<span class="attribute">id</span>": <span class="value"><span class="number">20</span></span>,</span><br><span class="line"> "<span class="attribute">user_id</span>": <span class="value"><span class="number">1</span></span>,</span><br><span class="line"> "<span class="attribute">name</span>": <span class="value"><span class="string">"fGx83BzjU6"</span></span>,</span><br><span class="line"> "<span class="attribute">created_at</span>": <span class="value"><span class="string">"2016-03-29 08:04:31"</span></span>,</span><br><span class="line"> "<span class="attribute">updated_at</span>": <span class="value"><span class="string">"2016-03-29 08:04:31"</span></span><br><span class="line"> </span>},</span><br><span class="line"> {</span><br><span class="line"> "<span class="attribute">id</span>": <span class="value"><span class="number">21</span></span>,</span><br><span class="line"> "<span class="attribute">user_id</span>": <span class="value"><span class="number">1</span></span>,</span><br><span class="line"> "<span class="attribute">name</span>": <span class="value"><span class="string">"9Az4ctR7lb"</span></span>,</span><br><span class="line"> "<span class="attribute">created_at</span>": <span class="value"><span class="string">"2016-03-29 08:04:31"</span></span>,</span><br><span class="line"> "<span class="attribute">updated_at</span>": <span class="value"><span class="string">"2016-03-29 08:04:31"</span></span><br><span class="line"> </span>}</span><br><span class="line"> ]</span><br><span class="line"></span>}</span><br></pre></td></tr></table></figure></p>
<p>如此,后台返回的数据已带上分页信息。Laravel同时提供了基于Bootstrap的前端代码,在前端加上:<br><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">{!! $tasks->links() !!}</span><br></pre></td></tr></table></figure></p>
<p>即可获得页码信息。<br>示例如图:<br><img src="/images/src/laravel_demo_taskPaging.png" alt="Tasks基本页面"></p>
<h3 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h3><p>本文的方法中,将任务的创建、列表展示、删除合为一个页面,实际处理的时候可根据需求拆分,使用方法类似。<br>另外,css和js可根据前端的需求调整。</p>
<p>在实际应用中,订单类型的操作会很多&
Laravel后台系统实战(二):用户登录及管理
http://yoursite.com/2016/03/29/Laravel后台系统实战(二):用户登录及管理/
2016-03-29T09:37:25.000Z
2016-03-31T02:03:14.715Z
<p>此章节主要介绍用户登录、认证部分,以及用户管理。其中用户认证使用Laravel内置的模块,而用户管理为一个完整的MVC应用实例。<br>本文项目的GitHub地址为:<a href="https://github.com/damye/Laravel-dashboard-demo" target="_blank" rel="external">GitHub地址</a>,可参考。</p>
<h3 id="用户认证"><a href="#用户认证" class="headerlink" title="用户认证"></a>用户认证</h3><p>Laravel集成了<a href="https://laravel.com/docs/5.2/authentication" target="_blank" rel="external">用户认证</a>模块,通过该模块可实现用户登录、注册、重置密码等操作。下面,就此模块的最基本应用做简单介绍。</p>
<h4 id="数据库表"><a href="#数据库表" class="headerlink" title="数据库表"></a>数据库表</h4><p>在此之前,需先在<code>config/app.php</code>中配置数据库的相关信息。<br>在<code>databases/migrations</code>下默认有个php文件,该文件默认创建数据库表。为了此处应用,此处增加几个字段,完成后的php程序内容为:<br><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="preprocessor"><?php</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">use</span> <span class="title">Illuminate</span>\<span class="title">Database</span>\<span class="title">Schema</span>\<span class="title">Blueprint</span>;</span><br><span class="line"><span class="keyword">use</span> <span class="title">Illuminate</span>\<span class="title">Database</span>\<span class="title">Migrations</span>\<span class="title">Migration</span>;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">CreateUsersTable</span> <span class="keyword">extends</span> <span class="title">Migration</span></span><br><span class="line"></span>{</span><br><span class="line"> <span class="comment">/**</span><br><span class="line"> * Run the migrations.</span><br><span class="line"> *</span><br><span class="line"> * <span class="doctag">@return</span> void</span><br><span class="line"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">up</span><span class="params">()</span></span><br><span class="line"> </span>{</span><br><span class="line"> Schema::create(<span class="string">'users'</span>, <span class="function"><span class="keyword">function</span> <span class="params">(Blueprint <span class="variable">$table</span>)</span> </span>{</span><br><span class="line"> <span class="variable">$table</span>->increments(<span class="string">'id'</span>);</span><br><span class="line"> <span class="variable">$table</span>->string(<span class="string">'email'</span>);</span><br><span class="line"> <span class="variable">$table</span>->string(<span class="string">'password'</span>);</span><br><span class="line"> <span class="variable">$table</span>->string(<span class="string">'nickname'</span>);</span><br><span class="line"> <span class="variable">$table</span>->boolean(<span class="string">'is_admin'</span>)->default(<span class="number">0</span>);</span><br><span class="line"> <span class="variable">$table</span>->boolean(<span class="string">'block'</span>)->default(<span class="number">0</span>);</span><br><span class="line"> <span class="variable">$table</span>->timestamps();</span><br><span class="line"> });</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span><br><span class="line"> * Reverse the migrations.</span><br><span class="line"> *</span><br><span class="line"> * <span class="doctag">@return</span> void</span><br><span class="line"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">down</span><span class="params">()</span></span><br><span class="line"> </span>{</span><br><span class="line"> Schema::drop(<span class="string">'users'</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p>然后运行命令:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">php artisan migrate</span><br></pre></td></tr></table></figure></p>
<p>就可在数据库中看到一个<code>users</code>的数据库表。</p>
<h4 id="模型model"><a href="#模型(Model)" class="headerlink" title="模型(Model)"></a>模型(Model)</h4><p>在<code>app</code>下,默认有个<code>User.php</code>的文件,该文件为Laravel默认的用户认证模型</p>
<h4 id="路由及视图"><a href="#路由及视图" class="headerlink" title="路由及视图"></a>路由及视图</h4><p>鉴于用户登录、认证是大多数系统常见的功能需求,故Laravel将该功能默认集成在框架中,使用一个名为<code>AuthenticatesAndRegistersUsers</code>的trait实现用户登录相关逻辑。<br>使用时,可在路由中或者模型的构造方法中添加中间件<code>auth</code>使用,或者路由<code>Route::auth()</code>实现。<br>同时,视图也可快速创建,通过命令:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">php artisan make:auth --views</span><br></pre></td></tr></table></figure></p>
<p>通过该命令可创建用户登录、注册等视图,位于<code>resources/views/auth</code>之下。<br>如此,结合上一章节<code>app.blade.php</code>中的<code>Login</code>,可进入登录界面,如图所示:<br> <img src="/images/src/laravel_demo_login.png" alt="Laravel登录demo"></p>
<h3 id="用户管理"><a href="#用户管理" class="headerlink" title="用户管理"></a>用户管理</h3><p>用户注册完成后,此处添加用户管理模块。</p>
<h4 id="模型"><a href="#模型" class="headerlink" title="模型"></a>模型</h4><p>模型使用以上所述,Laravel自带的模型</p>
<h4 id="控制器"><a href="#控制器" class="headerlink" title="控制器"></a>控制器</h4><p>为了方便管理,增强系统的可读性,此处创建UserController<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">php artisan make:controller UserController</span><br></pre></td></tr></table></figure></p>
<p>然后在<code>routes.php</code>中定义路由:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">Route::group([<span class="string">'middleware'</span> => [<span class="string">'web'</span>]], <span class="function"><span class="title">function</span></span> () {</span><br><span class="line"> Route::resource(<span class="string">'user'</span>, <span class="string">'UserController'</span>);</span><br><span class="line"> Route::auth();</span><br><span class="line">});</span><br></pre></td></tr></table></figure></p>
<p>其中<code>web</code>中间件为一个中间件组,其中包含cookie、session以及csrf攻击等组件。<br>所有user的请求均由UserController处理。<br>然后在Controller里面添加<code>index</code>方法,默认获取所有用户列表,代码为:<br><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">index</span><span class="params">(Request <span class="variable">$request</span>)</span></span><br><span class="line"></span>{</span><br><span class="line"> <span class="keyword">return</span> view(<span class="string">'users.list'</span>, [</span><br><span class="line"> <span class="string">'users'</span> => User::all(),</span><br><span class="line"> ]);</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<h4 id="视图"><a href="#视图" class="headerlink" title="视图"></a>视图</h4><p>在Controller里面配置的,用户列表的view地址为<code>users.list</code>,则需要在views文件夹下面新建一个users的文件下,然后在其下面新建一个名为<code>list.blade.php</code>的view文件。<br>首先,在<code>app.balde.php</code>文件中,增加User的侧边栏,侧边栏的代码为:<br><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="title">div</span> <span class="attribute">class</span>=<span class="value">"col-sm-3 col-md-2 sidebar"</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">ul</span> <span class="attribute">class</span>=<span class="value">"nav nav-sidebar"</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">li</span>></span><span class="tag"><<span class="title">a</span> <span class="attribute">href</span>=<span class="value">"{{ url('/user') }}"</span>></span>Users<span class="tag"></<span class="title">a</span>></span><span class="tag"></<span class="title">li</span>></span></span><br><span class="line"> <span class="tag"></<span class="title">ul</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">ul</span> <span class="attribute">class</span>=<span class="value">"nav nav-sidebar"</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">li</span>></span><span class="tag"><<span class="title">a</span> <span class="attribute">href</span>=<span class="value">""</span>></span>Nav item<span class="tag"></<span class="title">a</span>></span><span class="tag"></<span class="title">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">li</span>></span><span class="tag"><<span class="title">a</span> <span class="attribute">href</span>=<span class="value">""</span>></span>Nav item again<span class="tag"></<span class="title">a</span>></span><span class="tag"></<span class="title">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">li</span>></span><span class="tag"><<span class="title">a</span> <span class="attribute">href</span>=<span class="value">""</span>></span>One more nav<span class="tag"></<span class="title">a</span>></span><span class="tag"></<span class="title">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">li</span>></span><span class="tag"><<span class="title">a</span> <span class="attribute">href</span>=<span class="value">""</span>></span>Another nav item<span class="tag"></<span class="title">a</span>></span><span class="tag"></<span class="title">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">li</span>></span><span class="tag"><<span class="title">a</span> <span class="attribute">href</span>=<span class="value">""</span>></span>More navigation<span class="tag"></<span class="title">a</span>></span><span class="tag"></<span class="title">li</span>></span></span><br><span class="line"> <span class="tag"></<span class="title">ul</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">ul</span> <span class="attribute">class</span>=<span class="value">"nav nav-sidebar"</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">li</span>></span><span class="tag"><<span class="title">a</span> <span class="attribute">href</span>=<span class="value">""</span>></span>Nav item again<span class="tag"></<span class="title">a</span>></span><span class="tag"></<span class="title">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">li</span>></span><span class="tag"><<span class="title">a</span> <span class="attribute">href</span>=<span class="value">""</span>></span>One more nav<span class="tag"></<span class="title">a</span>></span><span class="tag"></<span class="title">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">li</span>></span><span class="tag"><<span class="title">a</span> <span class="attribute">href</span>=<span class="value">""</span>></span>Another nav item<span class="tag"></<span class="title">a</span>></span><span class="tag"></<span class="title">li</span>></span></span><br><span class="line"> <span class="tag"></<span class="title">ul</span>></span></span><br><span class="line"><span class="tag"></<span class="title">div</span>></span></span><br></pre></td></tr></table></figure></p>
<p>如此,通过点击侧边栏的Users,即可访问UserController里面的index方法。<br>然后完成<code>list.blade.php</code>。代码如下:<br><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br></pre></td><td class="code"><pre><span class="line">@extends('layouts.app')</span><br><span class="line"></span><br><span class="line">@section('content')</span><br><span class="line"> <span class="tag"><<span class="title">div</span> <span class="attribute">class</span>=<span class="value">"container"</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">div</span> <span class="attribute">class</span>=<span class="value">"col-sm-offset-1 col-sm-8"</span>></span></span><br><span class="line"></span><br><span class="line"> {{ csrf_field() }}</span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- Current Tasks --></span></span><br><span class="line"> @if (count($users) > 0)</span><br><span class="line"> <span class="tag"><<span class="title">div</span> <span class="attribute">class</span>=<span class="value">"panel panel-default"</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">div</span> <span class="attribute">class</span>=<span class="value">"panel-heading"</span>></span></span><br><span class="line"> Current Users</span><br><span class="line"> <span class="tag"></<span class="title">div</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="title">div</span> <span class="attribute">class</span>=<span class="value">"panel-body"</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">table</span> <span class="attribute">class</span>=<span class="value">"table table-striped user-table"</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">thead</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">th</span>></span>ID<span class="tag"></<span class="title">th</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">th</span>></span>Email<span class="tag"></<span class="title">th</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">th</span>></span>name<span class="tag"></<span class="title">th</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">th</span>></span>Management<span class="tag"></<span class="title">th</span>></span></span><br><span class="line"> <span class="tag"></<span class="title">thead</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">tbody</span>></span></span><br><span class="line"> @foreach ($users as $user)</span><br><span class="line"> <span class="tag"><<span class="title">tr</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">td</span> <span class="attribute">class</span>=<span class="value">"table-text"</span>></span><span class="tag"><<span class="title">div</span>></span>{{ $user->id }}<span class="tag"></<span class="title">div</span>></span><span class="tag"></<span class="title">td</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">td</span> <span class="attribute">class</span>=<span class="value">"table-text"</span>></span><span class="tag"><<span class="title">div</span>></span>{{ $user->email }}<span class="tag"></<span class="title">div</span>></span><span class="tag"></<span class="title">td</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">td</span> <span class="attribute">class</span>=<span class="value">"table-text"</span>></span><span class="tag"><<span class="title">div</span>></span>{{ $user->name }}<span class="tag"></<span class="title">div</span>></span><span class="tag"></<span class="title">td</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- Task Delete Button --></span></span><br><span class="line"> <span class="tag"><<span class="title">td</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">form</span> <span class="attribute">action</span>=<span class="value">"/task/{{ $user->id }}"</span> <span class="attribute">method</span>=<span class="value">"POST"</span>></span></span><br><span class="line"> {{ csrf_field() }}</span><br><span class="line"> {{ method_field('DELETE') }}</span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="title">button</span> <span class="attribute">type</span>=<span class="value">"submit"</span> <span class="attribute">id</span>=<span class="value">"delete-task-{{ $user->id }}"</span> <span class="attribute">class</span>=<span class="value">"btn btn-danger"</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">i</span> <span class="attribute">class</span>=<span class="value">"fa fa-btn fa-trash"</span>></span><span class="tag"></<span class="title">i</span>></span>Delete</span><br><span class="line"> <span class="tag"></<span class="title">button</span>></span></span><br><span class="line"> <span class="tag"></<span class="title">form</span>></span></span><br><span class="line"> <span class="tag"></<span class="title">td</span>></span></span><br><span class="line"> <span class="tag"></<span class="title">tr</span>></span></span><br><span class="line"> @endforeach</span><br><span class="line"> <span class="tag"></<span class="title">tbody</span>></span></span><br><span class="line"> <span class="tag"></<span class="title">table</span>></span></span><br><span class="line"> <span class="tag"></<span class="title">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="title">div</span>></span></span><br><span class="line"> @endif</span><br><span class="line"></span><br><span class="line"> <span class="tag"></<span class="title">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="title">div</span>></span></span><br><span class="line">@endsection</span><br></pre></td></tr></table></figure></p>
<p>如此可获得用户列表,如图所示:<br><img src="/images/src/laravel_demo_userList.png" alt="用户列表demo"></p>
<h3 id="使用依赖注入"><a href="#使用依赖注入" class="headerlink" title="使用依赖注入"></a>使用依赖注入</h3><p>Laravel的<a href="https://laravel.com/docs/5.2/container" target="_blank" rel="external">服务容器</a>是整个框架的一个较强大的特性,其能多DB操作解耦,对测试有较大的方便。<br>下面,就该功能简要介绍。</p>
<h4 id="创建repository"><a href="#创建Repository" class="headerlink" title="创建Repository"></a>创建Repository</h4><p>在<code>app/Repositories</code>目录下新增一个<code>UserRepository</code>:<br><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="preprocessor"><?php</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">App</span>\<span class="title">Repositories</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">use</span> <span class="title">App</span>\<span class="title">User</span>;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">UserRepository</span></span><br><span class="line"></span>{</span><br><span class="line"> <span class="comment">/**</span><br><span class="line"> * <span class="doctag">@desc</span> get all users</span><br><span class="line"> * <span class="doctag">@return</span> \Illuminate\Database\Eloquent\Collection|static[]</span><br><span class="line"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">selectAll</span><span class="params">()</span></span><br><span class="line"> </span>{</span><br><span class="line"> <span class="keyword">return</span> User::all();</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<h4 id="注入repository"><a href="#注入Repository" class="headerlink" title="注入Repository"></a>注入Repository</h4><p>创建完成后,到Controller中注入该实例,如在<code>index</code>方法中,注入后的Controller为:<br><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br></pre></td><td class="code"><pre><span class="line"><span class="preprocessor"><?php</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">App</span>\<span class="title">Http</span>\<span class="title">Controllers</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">use</span> <span class="title">Illuminate</span>\<span class="title">Http</span>\<span class="title">Request</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">use</span> <span class="title">App</span>\<span class="title">Http</span>\<span class="title">Requests</span>;</span><br><span class="line"><span class="keyword">use</span> <span class="title">App</span>\<span class="title">Http</span>\<span class="title">Controllers</span>\<span class="title">Controller</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">use</span> <span class="title">App</span>\<span class="title">User</span>;</span><br><span class="line"><span class="keyword">use</span> <span class="title">App</span>\<span class="title">Repositories</span>\<span class="title">UserRepository</span>;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">UserController</span> <span class="keyword">extends</span> <span class="title">Controller</span></span><br><span class="line"></span>{</span><br><span class="line"> <span class="comment">/**</span><br><span class="line"> * The task repository instance.</span><br><span class="line"> *</span><br><span class="line"> * <span class="doctag">@var</span> TaskRepository</span><br><span class="line"> */</span></span><br><span class="line"> <span class="keyword">protected</span> <span class="variable">$users</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> <span class="variable">$module</span> = <span class="string">'user'</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span><br><span class="line"> * Create a new controller instance.</span><br><span class="line"> *</span><br><span class="line"> * <span class="doctag">@param</span> TaskRepository $tasks</span><br><span class="line"> * <span class="doctag">@return</span> void</span><br><span class="line"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__construct</span><span class="params">(UserRepository <span class="variable">$users</span>)</span></span><br><span class="line"> </span>{</span><br><span class="line"> <span class="variable">$this</span>->middleware(<span class="string">'auth'</span>);</span><br><span class="line"></span><br><span class="line"> <span class="variable">$this</span>->users = <span class="variable">$users</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span><br><span class="line"> * Display a list of all of the user's task.</span><br><span class="line"> *</span><br><span class="line"> * <span class="doctag">@param</span> Request $request</span><br><span class="line"> * <span class="doctag">@return</span> Response</span><br><span class="line"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">index</span><span class="params">(Request <span class="variable">$request</span>)</span></span><br><span class="line"> </span>{</span><br><span class="line"> <span class="keyword">return</span> view(<span class="string">'users.list'</span>, [</span><br><span class="line"> <span class="string">'users'</span> => <span class="variable">$this</span>->users->selectAll(),</span><br><span class="line"> ]);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p>如此,实现的功能与以上相同,同时使用了依赖注入。</p>
<p>此章节主要介绍用户登录、认证部分,&
Laravel后台系统实战(一):安装
http://yoursite.com/2016/03/29/Laravel后台系统实战(一):安装/
2016-03-29T08:27:22.000Z
2016-03-31T02:08:29.708Z
<h3 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h3><p>本系列文章为Laravel搭建后台管理系统的实战,相关信息如下:</p>
<blockquote>
<p>后台:Laravel 5.2<br>前端框架:Bootstrap</p>
</blockquote>
<p>本文项目的GitHub地址为:<a href="https://github.com/damye/Laravel-dashboard-demo" target="_blank" rel="external">GitHub地址</a>,可参考。</p>
<h3 id="安装laravel"><a href="#安装Laravel" class="headerlink" title="安装Laravel"></a>安装Laravel</h3><p>Laravel的安装科参照另一篇博文<a href="http://damye.github.io/2016/03/11/Laravel%E9%9A%8F%E7%AC%94%EF%BC%88%E4%B8%80%EF%BC%89%EF%BC%9A%E7%AE%80%E4%BB%8B/" target="_blank" rel="external">Laravel随笔(一):简介</a>。<br>安装完成之后,需运行(若在墙内,建议先配置composer中国镜像,参考<a href="http://damye.github.io/2016/03/14/composer%E4%B8%AD%E5%9B%BD%E5%85%A8%E9%87%8F%E9%95%9C%E5%83%8F/" target="_blank" rel="external">composer中国全量镜像</a>):<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">composer install</span><br></pre></td></tr></table></figure></p>
<p>安装依赖。若有需求,可在<code>composer.json</code>中配置。<br>若要使用<code>elixir</code>管理js和css,还需安装<code>gulp</code>,安装命令如下:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 若在国内,可配置cnpm</span></span><br><span class="line">npm install</span><br><span class="line">npm install --global gulp</span><br></pre></td></tr></table></figure></p>
<p>成功安装完成后,使用命令:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">gulp</span><br></pre></td></tr></table></figure></p>
<p>即可<code>less</code>、<code>scss</code>等文件。具体可参照<a href="https://laravel.com/docs/5.2/elixir" target="_blank" rel="external">Laravel elixir</a></p>
<h3 id="使用bootstrap"><a href="#使用Bootstrap" class="headerlink" title="使用Bootstrap"></a>使用Bootstrap</h3><p>本文参照Bootstrap是<a href="http://v3.bootcss.com/examples/dashboard/" target="_blank" rel="external">dashboard</a>实例。<br>Bootstrap的css和js使用CDN地址,若使用本地的相对路径的,需将css和js包放到public文件夹之下,然后引入使用相对路径。<br>此处在<code>resources</code>下的<code>views</code>文件夹下,新建一个<code>layouts</code>的文件夹,用于存放布局相关的代码,如后台页面中的顶部、侧边栏等。<br>然后新建文件<code>app.blade.php</code>,根据Bootstrap的dashboard中的demo,代码为:<br><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br></pre></td><td class="code"><pre><span class="line"><span class="doctype"><!DOCTYPE html></span></span><br><span class="line"><span class="tag"><<span class="title">html</span> <span class="attribute">lang</span>=<span class="value">"en"</span>></span></span><br><span class="line"><span class="tag"><<span class="title">head</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">meta</span> <span class="attribute">charset</span>=<span class="value">"utf-8"</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">meta</span> <span class="attribute">http-equiv</span>=<span class="value">"X-UA-Compatible"</span> <span class="attribute">content</span>=<span class="value">"IE=edge"</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">meta</span> <span class="attribute">name</span>=<span class="value">"viewport"</span> <span class="attribute">content</span>=<span class="value">"width=device-width, initial-scale=1"</span>></span></span><br><span class="line"> <span class="comment"><!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags --></span></span><br><span class="line"> <span class="tag"><<span class="title">meta</span> <span class="attribute">name</span>=<span class="value">"description"</span> <span class="attribute">content</span>=<span class="value">""</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">meta</span> <span class="attribute">name</span>=<span class="value">"author"</span> <span class="attribute">content</span>=<span class="value">""</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="title">title</span>></span>BetMe<span class="tag"></<span class="title">title</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="title">link</span> <span class="attribute">href</span>=<span class="value">"font/lato.css"</span> <span class="attribute">rel</span>=<span class="value">'stylesheet'</span> <span class="attribute">type</span>=<span class="value">'text/css'</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- Bootstrap core CSS --></span></span><br><span class="line"> <span class="tag"><<span class="title">link</span> <span class="attribute">href</span>=<span class="value">"//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css"</span> <span class="attribute">rel</span>=<span class="value">"stylesheet"</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- Custom styles for this template --></span></span><br><span class="line"> <span class="tag"><<span class="title">link</span> <span class="attribute">href</span>=<span class="value">"css/dashboard.css"</span> <span class="attribute">rel</span>=<span class="value">"stylesheet"</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="title">style</span>></span><span class="css"></span><br><span class="line"> <span class="tag">body</span> <span class="rules">{</span><br><span class="line"> <span class="rule"><span class="attribute">font-family</span>:<span class="value"> <span class="string">'Lato'</span></span></span>;</span><br><span class="line"> }</span></span><br><span class="line"></span><br><span class="line"> <span class="class">.fa-btn</span> <span class="rules">{</span><br><span class="line"> <span class="rule"><span class="attribute">margin-right</span>:<span class="value"> <span class="number">6px</span></span></span>;</span><br><span class="line"> }</span></span><br><span class="line"> </span><span class="tag"></<span class="title">style</span>></span></span><br><span class="line"><span class="tag"></<span class="title">head</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="title">body</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="title">nav</span> <span class="attribute">class</span>=<span class="value">"navbar navbar-inverse navbar-fixed-top"</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">div</span> <span class="attribute">class</span>=<span class="value">"container-fluid"</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">div</span> <span class="attribute">class</span>=<span class="value">"navbar-header"</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">button</span> <span class="attribute">type</span>=<span class="value">"button"</span> <span class="attribute">class</span>=<span class="value">"navbar-toggle collapsed"</span> <span class="attribute">data-toggle</span>=<span class="value">"collapse"</span> <span class="attribute">data-target</span>=<span class="value">"#navbar"</span> <span class="attribute">aria-expanded</span>=<span class="value">"false"</span> <span class="attribute">aria-controls</span>=<span class="value">"navbar"</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">span</span> <span class="attribute">class</span>=<span class="value">"sr-only"</span>></span>Toggle navigation<span class="tag"></<span class="title">span</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">span</span> <span class="attribute">class</span>=<span class="value">"icon-bar"</span>></span><span class="tag"></<span class="title">span</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">span</span> <span class="attribute">class</span>=<span class="value">"icon-bar"</span>></span><span class="tag"></<span class="title">span</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">span</span> <span class="attribute">class</span>=<span class="value">"icon-bar"</span>></span><span class="tag"></<span class="title">span</span>></span></span><br><span class="line"> <span class="tag"></<span class="title">button</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">a</span> <span class="attribute">class</span>=<span class="value">"navbar-brand"</span> <span class="attribute">href</span>=<span class="value">"#"</span>></span>BetMe<span class="tag"></<span class="title">a</span>></span></span><br><span class="line"> <span class="tag"></<span class="title">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">div</span> <span class="attribute">id</span>=<span class="value">"navbar"</span> <span class="attribute">class</span>=<span class="value">"navbar-collapse collapse"</span>></span></span><br><span class="line"> <span class="comment"><!-- Left Side Of Navbar --></span></span><br><span class="line"> <span class="tag"><<span class="title">ul</span> <span class="attribute">class</span>=<span class="value">"nav navbar-nav"</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">li</span>></span><span class="tag"><<span class="title">a</span> <span class="attribute">href</span>=<span class="value">"{{ url('/home') }}"</span>></span>Home<span class="tag"></<span class="title">a</span>></span><span class="tag"></<span class="title">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">li</span>></span><span class="tag"><<span class="title">a</span> <span class="attribute">href</span>=<span class="value">"{{ url('/user') }}"</span>></span>Users<span class="tag"></<span class="title">a</span>></span><span class="tag"></<span class="title">li</span>></span></span><br><span class="line"> <span class="tag"></<span class="title">ul</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="title">ul</span> <span class="attribute">class</span>=<span class="value">"nav navbar-nav navbar-right"</span>></span></span><br><span class="line"> @if (Auth::guest())</span><br><span class="line"> <span class="tag"><<span class="title">li</span>></span><span class="tag"><<span class="title">a</span> <span class="attribute">href</span>=<span class="value">"{{ url('/login') }}"</span>></span>Login<span class="tag"></<span class="title">a</span>></span><span class="tag"></<span class="title">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">li</span>></span><span class="tag"><<span class="title">a</span> <span class="attribute">href</span>=<span class="value">"{{ url('/register') }}"</span>></span>Register<span class="tag"></<span class="title">a</span>></span><span class="tag"></<span class="title">li</span>></span></span><br><span class="line"> @else</span><br><span class="line"> <span class="tag"><<span class="title">li</span> <span class="attribute">class</span>=<span class="value">"dropdown"</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">a</span> <span class="attribute">href</span>=<span class="value">"#"</span> <span class="attribute">class</span>=<span class="value">"dropdown-toggle"</span> <span class="attribute">data-toggle</span>=<span class="value">"dropdown"</span> <span class="attribute">role</span>=<span class="value">"button"</span> <span class="attribute">aria-expanded</span>=<span class="value">"false"</span>></span></span><br><span class="line"> {{ Auth::user()->name }} <span class="tag"><<span class="title">span</span> <span class="attribute">class</span>=<span class="value">"caret"</span>></span><span class="tag"></<span class="title">span</span>></span></span><br><span class="line"> <span class="tag"></<span class="title">a</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="title">ul</span> <span class="attribute">class</span>=<span class="value">"dropdown-menu"</span> <span class="attribute">role</span>=<span class="value">"menu"</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">li</span>></span><span class="tag"><<span class="title">a</span> <span class="attribute">href</span>=<span class="value">"{{ url('/logout') }}"</span>></span><span class="tag"><<span class="title">i</span> <span class="attribute">class</span>=<span class="value">"fa fa-btn fa-sign-out"</span>></span><span class="tag"></<span class="title">i</span>></span>Logout<span class="tag"></<span class="title">a</span>></span><span class="tag"></<span class="title">li</span>></span></span><br><span class="line"> <span class="tag"></<span class="title">ul</span>></span></span><br><span class="line"> <span class="tag"></<span class="title">li</span>></span></span><br><span class="line"> @endif</span><br><span class="line"> <span class="tag"></<span class="title">ul</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">form</span> <span class="attribute">class</span>=<span class="value">"navbar-form navbar-right"</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">input</span> <span class="attribute">type</span>=<span class="value">"text"</span> <span class="attribute">class</span>=<span class="value">"form-control"</span> <span class="attribute">placeholder</span>=<span class="value">"Search..."</span>></span></span><br><span class="line"> <span class="tag"></<span class="title">form</span>></span></span><br><span class="line"> <span class="tag"></<span class="title">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="title">div</span>></span></span><br><span class="line"><span class="tag"></<span class="title">nav</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="title">div</span> <span class="attribute">class</span>=<span class="value">"container-fluid"</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">div</span> <span class="attribute">class</span>=<span class="value">"row"</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">div</span> <span class="attribute">class</span>=<span class="value">"col-sm-3 col-md-2 sidebar"</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">ul</span> <span class="attribute">class</span>=<span class="value">"nav nav-sidebar"</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">li</span>></span><span class="tag"><<span class="title">a</span> <span class="attribute">href</span>=<span class="value">""</span>></span>user<span class="tag"></<span class="title">a</span>></span><span class="tag"></<span class="title">li</span>></span></span><br><span class="line"> <span class="tag"></<span class="title">ul</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">ul</span> <span class="attribute">class</span>=<span class="value">"nav nav-sidebar"</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">li</span>></span><span class="tag"><<span class="title">a</span> <span class="attribute">href</span>=<span class="value">""</span>></span>Nav item<span class="tag"></<span class="title">a</span>></span><span class="tag"></<span class="title">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">li</span>></span><span class="tag"><<span class="title">a</span> <span class="attribute">href</span>=<span class="value">""</span>></span>Nav item again<span class="tag"></<span class="title">a</span>></span><span class="tag"></<span class="title">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">li</span>></span><span class="tag"><<span class="title">a</span> <span class="attribute">href</span>=<span class="value">""</span>></span>One more nav<span class="tag"></<span class="title">a</span>></span><span class="tag"></<span class="title">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">li</span>></span><span class="tag"><<span class="title">a</span> <span class="attribute">href</span>=<span class="value">""</span>></span>Another nav item<span class="tag"></<span class="title">a</span>></span><span class="tag"></<span class="title">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">li</span>></span><span class="tag"><<span class="title">a</span> <span class="attribute">href</span>=<span class="value">""</span>></span>More navigation<span class="tag"></<span class="title">a</span>></span><span class="tag"></<span class="title">li</span>></span></span><br><span class="line"> <span class="tag"></<span class="title">ul</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">ul</span> <span class="attribute">class</span>=<span class="value">"nav nav-sidebar"</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">li</span>></span><span class="tag"><<span class="title">a</span> <span class="attribute">href</span>=<span class="value">""</span>></span>Nav item again<span class="tag"></<span class="title">a</span>></span><span class="tag"></<span class="title">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">li</span>></span><span class="tag"><<span class="title">a</span> <span class="attribute">href</span>=<span class="value">""</span>></span>One more nav<span class="tag"></<span class="title">a</span>></span><span class="tag"></<span class="title">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">li</span>></span><span class="tag"><<span class="title">a</span> <span class="attribute">href</span>=<span class="value">""</span>></span>Another nav item<span class="tag"></<span class="title">a</span>></span><span class="tag"></<span class="title">li</span>></span></span><br><span class="line"> <span class="tag"></<span class="title">ul</span>></span></span><br><span class="line"> <span class="tag"></<span class="title">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">div</span> <span class="attribute">class</span>=<span class="value">"col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main"</span>></span></span><br><span class="line"> @yield('content')</span><br><span class="line"> <span class="tag"></<span class="title">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="title">div</span>></span></span><br><span class="line"><span class="tag"></<span class="title">div</span>></span></span><br><span class="line"></span><br><span class="line"><span class="comment"><!-- Bootstrap core JavaScript</span><br><span class="line">================================================== --></span></span><br><span class="line"><span class="comment"><!-- Placed at the end of the document so the pages load faster --></span></span><br><span class="line"><span class="tag"><<span class="title">script</span> <span class="attribute">src</span>=<span class="value">"//cdn.bootcss.com/jquery/2.2.1/jquery.min.js"</span>></span><span class="undefined"></span><span class="tag"></<span class="title">script</span>></span></span><br><span class="line"><span class="tag"><<span class="title">script</span> <span class="attribute">src</span>=<span class="value">"//cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js"</span>></span><span class="undefined"></span><span class="tag"></<span class="title">script</span>></span></span><br><span class="line"></span><br><span class="line">{{--<span class="tag"><<span class="title">script</span> <span class="attribute">type</span>=<span class="value">"text/javascript"</span>></span><span class="handlebars"><span class="xml">--}}</span><br><span class="line"> </span><span class="expression">{{<span class="variable">--</span>$(<span class="string">".nav a"</span>)<span class="variable">.on</span>(<span class="string">"click"</span>, <span class="variable">function</span>(){<span class="variable">--</span>}}</span><span class="xml"></span><br><span class="line"> </span><span class="expression">{{<span class="variable">--</span>$(<span class="string">".nav"</span>)<span class="variable">.find</span>(<span class="string">".active"</span>)<span class="variable">.removeClass</span>(<span class="string">"active"</span>);<span class="variable">--</span>}}</span><span class="xml"></span><br><span class="line"> </span><span class="expression">{{<span class="variable">--</span>$(<span class="variable">this</span>)<span class="variable">.parent</span>()<span class="variable">.addClass</span>(<span class="string">"active"</span>);<span class="variable">--</span>}}</span><span class="xml"></span><br><span class="line"> </span><span class="expression">{{<span class="variable">--</span>});<span class="variable">--</span>}}</span><span class="xml"></span><br><span class="line"></span><span class="expression">{{<span class="variable">--</span></span></span><span class="tag"></<span class="title">script</span>></span>--}}</span><br><span class="line"></span><br><span class="line"><span class="tag"></<span class="title">body</span>></span></span><br><span class="line"><span class="tag"></<span class="title">html</span>></span></span><br></pre></td></tr></table></figure></p>
<p>再将Laravel中自带的<code>welcome.blade.php</code>改写为:<br><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">@extends('layouts.app')</span><br><span class="line"></span><br><span class="line">@section('content')</span><br><span class="line"> <span class="tag"><<span class="title">div</span> <span class="attribute">class</span>=<span class="value">"col-md-10 col-md-offset-1"</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">div</span> <span class="attribute">class</span>=<span class="value">"panel panel-default"</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">div</span> <span class="attribute">class</span>=<span class="value">"panel-heading"</span>></span>Welcome<span class="tag"></<span class="title">div</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="title">div</span> <span class="attribute">class</span>=<span class="value">"panel-body"</span>></span></span><br><span class="line"> Your Application's Landing Page.</span><br><span class="line"> <span class="tag"></<span class="title">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="title">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="title">div</span>></span></span><br><span class="line">@endsection</span><br></pre></td></tr></table></figure></p>
<p>此处使用Laravel中的blade模板,在<code>welcome.blade.php</code>中引入了<code>app.blade.php</code>,<code>app.blade.php</code>作为后台管理系统中的公共部分。<br>然后在<code>routes.php</code>中配置默认路由:<br><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Route::get(<span class="string">'/'</span>, <span class="function"><span class="keyword">function</span> <span class="params">()</span> </span>{</span><br><span class="line"> <span class="keyword">return</span> view(<span class="string">'welcome'</span>);</span><br><span class="line">});</span><br></pre></td></tr></table></figure></p>
<p> 即可访问后台管理系统的默认页面,如图所示。<br> <img src="/images/src/laravel_demo_welcome.png" alt="Laravel后台系统demo"></p>
<h3 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h3><p>本ߏ
node-gyp编译问题
http://yoursite.com/2016/03/28/node-gyp编译问题/
2016-03-28T12:04:54.000Z
2016-03-29T03:31:14.846Z
<blockquote>
<p>这两天学习Laravel,管理及编译前端代码的时候用到了elixir,但在windows下,<code>npm(cnpm) install</code>的时候报错,大概意思是需要编译,而编译依赖于<code>VC++</code>和<code>python 2.7</code>。网上的解决方案大多为配置<code>VS</code>以及<code>Python 2.7</code>环境,但不想额外配置环境,终于找到一个<font color="red">无需编译的解决方案</font>,此处mark。</p>
</blockquote>
<h3 id="错误描述"><a href="#错误描述" class="headerlink" title="错误描述"></a>错误描述</h3><p>使用<code>gulp</code>命令时报错如下:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">[<span class="number">20</span>:<span class="number">02</span>:<span class="number">53</span>] Using gulpfile D:\XXX\Dev\gulpfile.js</span><br><span class="line">[<span class="number">20</span>:<span class="number">02</span>:<span class="number">53</span>] Starting <span class="string">'default'</span>...</span><br><span class="line">[<span class="number">20</span>:<span class="number">02</span>:<span class="number">53</span>] Starting <span class="string">'sass'</span>...</span><br><span class="line">[<span class="number">20</span>:<span class="number">02</span>:<span class="number">53</span>] <span class="string">'sass'</span> errored after <span class="number">83</span> ms</span><br><span class="line">[<span class="number">20</span>:<span class="number">02</span>:<span class="number">53</span>] Error: The `libsass` binding was not found <span class="keyword">in</span> D:\XXX\Dev\node_mod</span><br><span class="line">This usually happens because your node version has changed.</span><br><span class="line">Run `npm rebuild node-sass` to build the binding <span class="keyword">for</span> your current node version.</span><br><span class="line"> at Object.sass.getBinaryPath (D:\XXX\Dev\node_modules\.npminstall\node<span class="operator">-s</span></span><br><span class="line"> at Object.<anonymous> (D:\XXX\Dev\node_modules\.npminstall\node-sass\<span class="number">3.4</span></span><br><span class="line"> at Module._compile (module.js:<span class="number">409</span>:<span class="number">26</span>)</span><br><span class="line"> at Object.Module._extensions..js (module.js:<span class="number">416</span>:<span class="number">10</span>)</span><br><span class="line"> at Module.load (module.js:<span class="number">343</span>:<span class="number">32</span>)</span><br><span class="line"> at Function.Module._load (module.js:<span class="number">300</span>:<span class="number">12</span>)</span><br><span class="line"> at Module.require (module.js:<span class="number">353</span>:<span class="number">17</span>)</span><br><span class="line"> at require (internal/module.js:<span class="number">12</span>:<span class="number">17</span>)</span><br><span class="line"> at Object.<anonymous> (D:\XXX\Dev\node_modules\.npminstall\gulp-sass\<span class="number">2.2</span></span><br><span class="line"> at Module._compile (module.js:<span class="number">409</span>:<span class="number">26</span>)</span><br><span class="line">[<span class="number">20</span>:<span class="number">02</span>:<span class="number">53</span>] Error <span class="keyword">in</span> plugin <span class="string">'run-sequence'</span></span><br><span class="line">Message:</span><br><span class="line"> An error occured <span class="keyword">in</span> task <span class="string">'sass'</span>.</span><br><span class="line">[<span class="number">20</span>:<span class="number">02</span>:<span class="number">53</span>] Finished <span class="string">'default'</span> after <span class="number">121</span> ms</span><br></pre></td></tr></table></figure></p>
<p>因此需要重新编译,执行命令<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 使用cnpm(墙内)</span></span><br><span class="line">npm rebuild node-sass</span><br></pre></td></tr></table></figure></p>
<p>而又报错如下:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line">gyp ERR! configure error</span><br><span class="line">gyp ERR! stack Error: Can<span class="string">'t find Python executable "python", you can set the PYTHON env</span><br><span class="line">gyp ERR! stack at failNoPython (D:\XXX\Dev\node_modules\.npminstall\node</span><br><span class="line">gyp ERR! stack at D:\XXX\Dev\node_modules\.npminstall\node-gyp\3.3.1\nod</span><br><span class="line">gyp ERR! stack at FSReqWrap.oncomplete (fs.js:82:15)</span><br><span class="line">gyp ERR! System Windows_NT 6.1.7601</span><br><span class="line">gyp ERR! command "C:\\Program Files\\nodejs\\node.exe" "D:\\XXX\\Dev\\node_m</span><br><span class="line">erbose" "--libsass_ext=" "--libsass_cflags=" "--libsass_ldflags=" "--libsass_library="</span><br><span class="line">gyp ERR! cwd D:\XXX\Dev\node_modules\laravel-elixir\node_modules\gulp-sass\n</span><br><span class="line">gyp ERR! node -v v4.4.1</span><br><span class="line">gyp ERR! node-gyp -v v3.3.1</span><br><span class="line">gyp ERR! not ok</span><br><span class="line">Build failed</span><br><span class="line"></span><br><span class="line">npm ERR! Windows_NT 6.1.7601</span><br><span class="line">npm ERR! argv "C:\\Program Files\\nodejs\\node.exe" "C:\\Users\\Administrator\\AppData\\</span><br><span class="line">fig=C:\\Users\\Administrator\\.cnpmrc" "--disturl=https://npm.taobao.org/mirrors/node" "</span><br><span class="line">npm ERR! node v4.4.1</span><br><span class="line">npm ERR! npm v3.8.3</span><br><span class="line">npm ERR! code ELIFECYCLE</span><br><span class="line">npm ERR! node-sass@3.4.2 postinstall: `node scripts/build.js`</span><br><span class="line">npm ERR! Exit status 1</span><br><span class="line">npm ERR!</span><br><span class="line">npm ERR! Failed at the node-sass@3.4.2 postinstall script '</span>node scripts/build.js<span class="string">'.</span><br><span class="line">npm ERR! Make sure you have the latest version of node.js and npm installed.</span><br><span class="line">npm ERR! If you do, this is most likely a problem with the node-sass package,</span><br><span class="line">npm ERR! not with npm itself.</span><br><span class="line">npm ERR! Tell the author that this fails on your system:</span><br><span class="line">npm ERR! node scripts/build.js</span><br><span class="line">npm ERR! You can get information on how to open an issue for this project with:</span><br><span class="line">npm ERR! npm bugs node-sass</span><br><span class="line">npm ERR! Or if that isn'</span>t available, you can get their info via:</span><br><span class="line">npm ERR! npm owner ls node-sass</span><br><span class="line">npm ERR! There is likely additional logging output above.</span><br><span class="line"></span><br><span class="line">npm ERR! Please include the following file with any support request:</span><br><span class="line">npm ERR! D:\XXX\Dev\npm-debug.log</span><br></pre></td></tr></table></figure></p>
<p>提示编译需要<code>Python</code>环境。</p>
<h3 id="解决方案"><a href="#解决方案" class="headerlink" title="解决方案"></a>解决方案</h3><p>在<a href="http://cnodejs.org/topic/53040bc95366a72a2c2128b9" target="_blank" rel="external">cnodejs论坛</a>上发现了一个类似的帖子,在回复的最后发现了一个答案,即先安装<code>bcryptjs</code>,则可不需要编译。<br>测试通过!<br>附上cnpm上的链接<br><figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://npm.taobao.org/package/bcryptjs</span><br></pre></td></tr></table></figure></p>
<blockquote>
<p>这两天学习Laravel,管理及编译前端代x
Laravel随笔(三):优化相关
http://yoursite.com/2016/03/17/Laravel随笔(三):优化相关/
2016-03-17T11:41:22.000Z
2016-03-17T11:52:32.797Z
<p>此文主要介绍Laravel框架中提供的优化方面的知识,后续有遇到的会进一步更新。<br>该部分方式在发布项目时可考虑添加。</p>
<h3 id="路由优化"><a href="#路由优化" class="headerlink" title="路由优化"></a>路由优化</h3><p>若应用中仅使用基于controller的路由,可使用Laravel的路由缓存(<code>route cache</code>)。可极大地减少路由注册的时间,提高访问数据。个例可提高100倍的速度。生成<code>route:cache</code>命令为:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">php artisan route:cache</span><br></pre></td></tr></table></figure></p>
<p>若新增了路由,需再次执行以上的命令。<br>若删除,执行:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">php artisan route:clear</span><br></pre></td></tr></table></figure></p>
<p>即可。</p>
<p><font color="red">注意:</font>路由缓存不支持匿名函数的路由,若要使用,请转换为controller路由。</p>
<p>此文主要介绍Laravel框架中提供的优化方面&#
nginx安装
http://yoursite.com/2016/03/17/nginx安装/
2016-03-17T04:19:12.000Z
2016-03-17T08:26:49.059Z
<p>配置Linux服务器上的web服务器时,了解到nginx的相当牛掰,因此选用了nginx,但安装、卸载、配置中遇到了些问题,此处做下简要的笔记。<br>本机环境:</p>
<blockquote>
<p>CentOS 7<br>php版本 5.6.17</p>
</blockquote>
<h3 id="安装依赖"><a href="#安装依赖" class="headerlink" title="安装依赖"></a>安装依赖</h3><p>nginx依赖于zlib、pcre、OpenSSL三个模块,安装nginx之前需要先安装这些依赖。为了保险起见,本文安装nginx之前,再安装一遍。安装方式为源码安装。<br>以下为本文的安装方式,不同时候版本可能存在差异,若参照且check版本。<br>安装zlib<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装zlib</span></span><br><span class="line">wget http://zlib.net/zlib-<span class="number">1.2</span>.<span class="number">8</span>.tar.gz</span><br><span class="line">tar -zxvf zlib-<span class="number">1.2</span>.<span class="number">8</span>.tar.gz</span><br><span class="line"><span class="built_in">cd</span> zlib-<span class="number">1.2</span>.<span class="number">8</span></span><br><span class="line">./configure</span><br><span class="line">make && install </span><br><span class="line"></span><br><span class="line">安装pcre</span><br><span class="line">wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-<span class="number">8.38</span>.tar.gz</span><br><span class="line">tar -zxvf pcre-<span class="number">8.38</span>.tar.gz</span><br><span class="line"><span class="built_in">cd</span> pcre-<span class="number">8.38</span></span><br><span class="line">./configure</span><br><span class="line">make && install </span><br><span class="line"></span><br><span class="line">安装openssl</span><br><span class="line">wget http://www.openssl.org/<span class="built_in">source</span>/openssl-<span class="number">1.0</span>.<span class="number">2</span>g.tar.gz</span><br><span class="line">tar -zxvf popenssl-<span class="number">1.0</span>.<span class="number">2</span>g.tar.gz</span><br><span class="line"><span class="built_in">cd</span> openssl-<span class="number">1.0</span>.<span class="number">2</span>g</span><br><span class="line">./configure</span><br><span class="line">make && install</span><br></pre></td></tr></table></figure></p>
<p>若没报错(error),扩展则安装完成。</p>
<h3 id="安装nginx"><a href="#安装nginx" class="headerlink" title="安装nginx"></a>安装nginx</h3><p>使用wget获取nginx压缩文件<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">wget http://nginx.org/download/nginx-<span class="number">1.8</span>.<span class="number">1</span>.tar.gz</span><br><span class="line">tar -zxvf nginx-<span class="number">1.8</span>.<span class="number">1</span>.tar.gz</span><br><span class="line"><span class="built_in">cd</span> nginx-<span class="number">1.8</span>.<span class="number">1</span></span><br></pre></td></tr></table></figure></p>
<p>然后是配置及编译。编译前,根据需要配置编译选项,可通过<code>./configure –help</code>查看,具体可参照help文档或者<a href="http://seanlook.com/2015/05/17/nginx-install-and-config/" target="_blank" rel="external">他们笔记</a>。<br>本文此处配置为:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">./configure --prefix=/usr/<span class="built_in">local</span>/nginx \</span><br><span class="line">--sbin-path=/usr/<span class="built_in">local</span>/nginx/nginx \</span><br><span class="line">--conf-path=/usr/<span class="built_in">local</span>/nginx/nginx.conf \</span><br><span class="line">--pid-path=/usr/<span class="built_in">local</span>/nginx/nginx.pid \</span><br><span class="line">--with-http_ssl_module \</span><br><span class="line">--with-pcre=/root/installTemp/pcre-<span class="number">8.38</span> \</span><br><span class="line">--with-zlib=/root/installTemp/zlib-<span class="number">1.2</span>.<span class="number">8</span> \</span><br><span class="line">--with-openssl=/root/installTemp/openssl-<span class="number">1.0</span>.<span class="number">2</span>g</span><br></pre></td></tr></table></figure></p>
<p>其中</p>
<blockquote>
<p>with-pcre=/root/installTemp/pcre-8.38 \<br>with-zlib=/root/installTemp/zlib-1.2.8 \<br>with-openssl=/root/installTemp/openssl-1.0.2g</p>
</blockquote>
<p>是扩展模块的<code>源代码目录</code>,非<code>安装目录</code>。<br>配置完成后编译即可:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">make && make install</span><br></pre></td></tr></table></figure></p>
<p>无error,安装完成。</p>
<h3 id="启动nginx"><a href="#启动nginx" class="headerlink" title="启动nginx"></a>启动nginx</h3><p>nginx默认端口80,若有其他应用占用,需要在<code>/user/local/nginx/nginx.conf</code>中的listen改为其他。<br>启动nginx命令:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/user/<span class="built_in">local</span>/nginx/nginx</span><br></pre></td></tr></table></figure></p>
<p>查看端口:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">netstat -tnl | grep <span class="number">80</span></span><br></pre></td></tr></table></figure></p>
<p>访问URL:<ip>:port,即可查看nginx运行效果。</ip></p>
<h3 id="reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h3><p>笔记:<a href="https://www.zybuluo.com/phper/note/73025" target="_blank" rel="external">https://www.zybuluo.com/phper/note/73025</a></p>
<p>配置Linux服务器上的web服务器时,了解到nginx
nginx errors
http://yoursite.com/2016/03/16/nginx-errors/
2016-03-16T12:08:29.000Z
2016-03-16T12:19:44.007Z
<p>此为nginx调试中出现的问题及处理方法,主要以mark为主。</p>
<h3 id="基本调试方法"><a href="#基本调试方法" class="headerlink" title="基本调试方法"></a>基本调试方法</h3><h4 id="日志"><a href="#日志" class="headerlink" title="日志"></a>日志</h4><p>nginx在conf之中,可以配置日志路径及日志格式,在若出现日志,最好把access log和error log打开,以定位问题。</p>
<h4 id="错误类型1"><a href="#错误类型1" class="headerlink" title="错误类型1"></a>错误类型1</h4><p>错误提示:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="number">2016</span>/<span class="number">03</span>/<span class="number">16</span> <span class="number">18</span>:<span class="number">41</span>:<span class="number">42</span> [error] <span class="number">15849</span><span class="comment">#0: *32 open() "/home/work/XXXX/XXX/public/XX" failed (2: No such file or directory), client: 1.202.225.154, server: 115.28.75.150, request: "GET /betme HTTP/1.1", host: "115.28.75.150"</span></span><br></pre></td></tr></table></figure></p>
<p>该错误为conf文件中路径配置的问题,可参照<a href="http://www.cnblogs.com/xiaogangqq123/archive/2011/03/02/1969006.html" target="_blank" rel="external">nginx配置</a>检查配置。</p>
<h4 id="错误提示2"><a href="#错误提示2" class="headerlink" title="错误提示2"></a>错误提示2</h4><p>错误提示<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="number">2016</span>/<span class="number">03</span>/<span class="number">16</span> <span class="number">18</span>:<span class="number">43</span>:<span class="number">31</span> [error] <span class="number">15849</span><span class="comment">#0: *34 connect() failed (111: Connection refused) while connecting to upstream, client: 107.151.226.203, server: 115.28.75.150, request: "GET http://www.proxy-listen.de/azenv.php HTTP/1.0", upstream: "fastcgi://127.0.0.1:9000", host: "www.proxy-listen.de"</span></span><br></pre></td></tr></table></figure></p>
<p>此错误可能是php-fpm没有安装的问题,参照<a href="http://blog.csdn.net/zzq900503/article/details/45501797" target="_blank" rel="external">博文</a>,设置php-fpm即可。<br>安装nginx和php时多数已经安装,只是没有启动。因此,此处启动php-fpm。<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#切换目录</span></span><br><span class="line"><span class="built_in">cd</span> /usr/<span class="built_in">local</span>/php/etc</span><br><span class="line"><span class="comment">#cpdefault文件为conf文件</span></span><br><span class="line">cp php-fpm.conf.default php-fpm.conf</span><br><span class="line"><span class="comment">#启动php-fpm</span></span><br><span class="line">/usr/<span class="built_in">local</span>/php/sbin/php-fpm</span><br></pre></td></tr></table></figure></p>
<h4 id="错误提示3"><a href="#错误提示3" class="headerlink" title="错误提示3"></a>错误提示3</h4><p>错误提示<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="number">2016</span>/<span class="number">03</span>/<span class="number">16</span> <span class="number">20</span>:<span class="number">18</span>:<span class="number">08</span> [error] <span class="number">15891</span><span class="comment">#0: *34 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 1.202.225.154, server: 115.28.75.150, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "115.28.75.150"</span></span><br></pre></td></tr></table></figure></p>
<p>此为nginx调试中出现的问题及处理方法,
RESTful API
http://yoursite.com/2016/03/16/RESTful-API/
2016-03-16T03:59:18.000Z
2016-03-16T06:43:40.598Z
<p>具象状态传输(Representational State Transfer,REST)是Roy Thomas Fielding于2000年的论文<a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm" target="_blank" rel="external">Architectural Styles and the Design of Network-based Software Architectures</a>中阐述的一种软件架构风格风格,其具有结构清晰、符合标准、易于理解、扩展方便的优点,<a href="http://www.ruanyifeng.com/blog/2011/09/restful.html" target="_blank" rel="external">被广泛采用</a>。<br>此处参考<a href="http://www.ruanyifeng.com/blog/2014/05/restful_api.html" target="_blank" rel="external">阮一峰</a>的文章,对RESTful API做简要介绍。</p>
<h3 id="协议"><a href="#协议" class="headerlink" title="协议"></a>协议</h3><p>通信使用HTTP协议</p>
<h3 id="域名"><a href="#域名" class="headerlink" title="域名"></a>域名</h3><p>应尽量将API部署到专用域名下,如:<br><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://api.example.com</span><br></pre></td></tr></table></figure></p>
<h3 id="版本version"><a href="#版本(Version)" class="headerlink" title="版本(Version)"></a>版本(Version)</h3><p>若有,应将版本放入URL。如:<br><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://api.example.com/v1/</span><br></pre></td></tr></table></figure></p>
<h3 id="路径"><a href="#路径" class="headerlink" title="路径"></a>路径</h3><p>在RESTful架构中,每一个网址都代表一种资源,所有网址中应尽量避免出现动词,只能有名词。且根据实际情况,名词需要考虑是否为复数。<br>如对一个学校,有教师、学生、教室信息,则其API则应为:<br><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">https://api.example.com/v1/teachers</span><br><span class="line">https://api.example.com/v1/students</span><br><span class="line">https://api.example.com/v1/classmates</span><br></pre></td></tr></table></figure></p>
<h3 id="http-verbs"><a href="#HTTP-Verbs" class="headerlink" title="HTTP Verbs"></a>HTTP Verbs</h3><p>HTTP动词定义了资源的具体操作类型,最常用的动词为GET和POST,具体有:</p>
<blockquote>
<p>GET(SELECT):从服务器取出资源(一项或多项)。<br>POST(CREATE):在服务器新建一个资源。<br>PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。<br>PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。<br>DELETE(DELETE):从服务器删除资源。<br>HEAD:获取资源的元数据。<br>OPTIONS:获取信息,关于资源的哪些属性是客户端可以改变的。</p>
</blockquote>
<p>其中,需要区别POST、PUT、PATCH的使用区别,可参照<a href="https://ihower.tw/blog/archives/6483" target="_blank" rel="external">此文</a>。</p>
<h3 id="状态码"><a href="#状态码" class="headerlink" title="状态码"></a>状态码</h3><p>HTTP状态码表示了一个操作的结果,由服务器返回,常见的有:</p>
<blockquote>
<p>200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。<br>201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。<br>202 Accepted - [<em>]:表示一个请求已经进入后台排队(异步任务)<br>204 NO CONTENT - [DELETE]:用户删除数据成功。<br>400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。<br>401 Unauthorized - [</em>]:表示用户没有权限(令牌、用户名、密码错误)。<br>403 Forbidden - [<em>] 表示用户得到授权(与401错误相对),但是访问是被禁止的。<br>404 NOT FOUND - [</em>]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。<br>406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。<br>410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。<br>422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。<br>500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。</p>
</blockquote>
<p>详细可参照<a href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html" target="_blank" rel="external">w3官方文档</a></p>
<h3 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h3><ul>
<li>API的身份及安全由<a href="http://oauth.net/2/" target="_blank" rel="external">OAuth 2.0</a>控制</li>
<li>交互的数据应尽量使用JSON。</li>
</ul>
<h3 id="reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h3><p>WIKI:<a href="https://zh.wikipedia.org/wiki/REST" target="_blank" rel="external">https://zh.wikipedia.org/wiki/REST</a><br>REST论文:<a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm" target="_blank" rel="external">http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm</a><br>阮一峰博客:<a href="http://www.ruanyifeng.com/blog/2014/05/restful_api.html" target="_blank" rel="external">http://www.ruanyifeng.com/blog/2014/05/restful_api.html</a><br>HTTP Verbs:<a href="https://ihower.tw/blog/archives/6483" target="_blank" rel="external">https://ihower.tw/blog/archives/6483</a></p>
<p>具象状态传输(Representational State Transfer,REST)是Roy Thomas Fielding&#x
Laravel随笔(二):MVC
http://yoursite.com/2016/03/15/Laravel随笔(二):MVC/
2016-03-15T11:53:35.000Z
2016-03-15T13:57:56.630Z
<p>Laravel遵从MVC的设计原则,同时,routes用于映射URL到具体的controller,示例如图所示<br><img src="/images/src/laravel_mvc_diagram.png" alt="Laravel MVC"><br>数据图片来源于<a href="https://selftaughtcoders.com/from-idea-to-launch/lesson-17/laravel-5-mvc-application-in-10-minutes/" target="_blank" rel="external">self-taught coders</a>。<br>因此,一个完整的访问流程可以总结为:</p>
<ul>
<li>用户输入URL访问应用</li>
<li>route映射URL和对应的controller</li>
<li>controller通过model访问数据库,获取数据,并将其传输到view</li>
<li>view渲染前台页面</li>
</ul>
<p>下面,通过实例简要介绍Laravel 5的MVC应用。</p>
<h3 id="model"><a href="#Model" class="headerlink" title="Model"></a>Model</h3><p>以车辆为例,创建一个Model。在此之前,首先要设置DB</p>
<h4 id="laravel-db设置"><a href="#Laravel-DB设置" class="headerlink" title="Laravel DB设置"></a>Laravel DB设置</h4><p>Laravel的DB可在env文件中简单配置,也可在config/database.php文件中配置,若同时存在,则会已env文件中读取的为主。为了避免引起歧义,此处将读取env环境变量的函数(如env(‘DB_HOST’, ‘localhost’))去除。本文使用MySQL,设置host、database、username、password,示例如下:<br><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">'default'</span> => <span class="string">'mysql'</span>,</span><br><span class="line"></span><br><span class="line"> <span class="string">'mysql'</span> => [</span><br><span class="line"> <span class="string">'driver'</span> => <span class="string">'mysql'</span>,</span><br><span class="line"> <span class="string">'host'</span> => <span class="string">'localhost'</span>,</span><br><span class="line"> <span class="string">'database'</span> => <span class="string">'test'</span>,</span><br><span class="line"> <span class="string">'username'</span> => <span class="string">'develop'</span>,</span><br><span class="line"> <span class="string">'password'</span> => <span class="string">'develop'</span>,</span><br><span class="line"> <span class="string">'charset'</span> => <span class="string">'utf8'</span>,</span><br><span class="line"> <span class="string">'collation'</span> => <span class="string">'utf8_unicode_ci'</span>,</span><br><span class="line"> <span class="string">'prefix'</span> => <span class="string">''</span>,</span><br><span class="line"> <span class="string">'strict'</span> => <span class="keyword">false</span>,</span><br><span class="line"> <span class="string">'engine'</span> => <span class="keyword">null</span>,</span><br><span class="line"> ],</span><br><span class="line"> ],</span><br></pre></td></tr></table></figure></p>
<p>如此,默认的DB连接为MySQL,连接为”mysql”,如上所示。</p>
<h4 id="创建model"><a href="#创建Model" class="headerlink" title="创建Model"></a>创建Model</h4><p>此处安利Laravel自带的<a href="https://laravel.com/docs/5.2/artisan" target="_blank" rel="external"><strong>Artisan CLI</strong>工具</a>,其中集成了大量的命令。<br>使用<strong>Artisan CLI</strong>创建一个Model,命令如下:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 创建Model,同时写入数据库(--migration)</span></span><br><span class="line">php artisan make:model Car --migration</span><br></pre></td></tr></table></figure></p>
<p>创建完成后,在app下有个Car.php的文件,该文件即为通过Artisan创建的Model,文件内容为:<br><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="preprocessor"><?php</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">App</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">use</span> <span class="title">Illuminate</span>\<span class="title">Database</span>\<span class="title">Eloquent</span>\<span class="title">Model</span>;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Car</span> <span class="keyword">extends</span> <span class="title">Model</span></span><br><span class="line"></span>{</span><br><span class="line"> <span class="comment">//</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p>同时,Laravel支持通过Artisan工具创建数据库表。因此,在database\migrations下生成了一个2016_03_15_124343_create_cars_table.php文件,内容为:<br><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="preprocessor"><?php</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">use</span> <span class="title">Illuminate</span>\<span class="title">Database</span>\<span class="title">Schema</span>\<span class="title">Blueprint</span>;</span><br><span class="line"><span class="keyword">use</span> <span class="title">Illuminate</span>\<span class="title">Database</span>\<span class="title">Migrations</span>\<span class="title">Migration</span>;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">CreateCarsTable</span> <span class="keyword">extends</span> <span class="title">Migration</span></span><br><span class="line"></span>{</span><br><span class="line"> <span class="comment">/**</span><br><span class="line"> * Run the migrations.</span><br><span class="line"> *</span><br><span class="line"> * <span class="doctag">@return</span> void</span><br><span class="line"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">up</span><span class="params">()</span></span><br><span class="line"> </span>{</span><br><span class="line"> Schema::create(<span class="string">'cars'</span>, <span class="function"><span class="keyword">function</span> <span class="params">(Blueprint <span class="variable">$table</span>)</span> </span>{</span><br><span class="line"> <span class="variable">$table</span>->increments(<span class="string">'id'</span>);</span><br><span class="line"> <span class="variable">$table</span>->timestamps();</span><br><span class="line"> });</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span><br><span class="line"> * Reverse the migrations.</span><br><span class="line"> *</span><br><span class="line"> * <span class="doctag">@return</span> void</span><br><span class="line"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">down</span><span class="params">()</span></span><br><span class="line"> </span>{</span><br><span class="line"> Schema::drop(<span class="string">'cars'</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p>此处对数据库表增加几个make、model、produced_on这三个属性。<br><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">Schema::create(<span class="string">'cars'</span>, <span class="function"><span class="keyword">function</span> <span class="params">(Blueprint <span class="variable">$table</span>)</span> </span>{</span><br><span class="line"> <span class="variable">$table</span>->increments(<span class="string">'id'</span>);</span><br><span class="line"> <span class="variable">$table</span>->string(<span class="string">'make'</span>);</span><br><span class="line"> <span class="variable">$table</span>->string(<span class="string">'model'</span>);</span><br><span class="line"> <span class="variable">$table</span>->string(<span class="string">'produced_on'</span>);</span><br><span class="line"> <span class="variable">$table</span>->timestamps();</span><br><span class="line">});</span><br></pre></td></tr></table></figure></p>
<p>然后在执行migrate命令:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">php artisan migrate</span><br></pre></td></tr></table></figure></p>
<p>数据库中则成功创建表:cars。然后,可使用<a href="https://laravel.com/docs/5.2/seeding" target="_blank" rel="external">Database: Seeding</a>填充数据。本文此处略过。</p>
<h3 id="创建controller"><a href="#创建Controller" class="headerlink" title="创建Controller"></a>创建Controller</h3><p>在Laravel中,一个对象,如上面创建的Car,被定义为resource,对于每个resource,Laravel中普遍使用resource controller管理关于该资源的所有请求。此处可用Artisan命令行创建controller:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">php artisan make:controller CarController</span><br></pre></td></tr></table></figure></p>
<p>会生成一个controller文件,路径为:app/Http/Controllers/CarController.php,文件为:<br><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="preprocessor"><?php</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">App</span>\<span class="title">Http</span>\<span class="title">Controllers</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">use</span> <span class="title">Illuminate</span>\<span class="title">Http</span>\<span class="title">Request</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">use</span> <span class="title">App</span>\<span class="title">Http</span>\<span class="title">Requests</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">use</span> <span class="title">App</span>\<span class="title">Car</span>;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">CarController</span> <span class="keyword">extends</span> <span class="title">Controller</span></span><br><span class="line"></span>{</span><br><span class="line"> <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">index</span><span class="params">()</span></span><br><span class="line"> </span>{</span><br><span class="line"> <span class="variable">$car</span> = Car::all();</span><br><span class="line"> <span class="keyword">return</span> view(<span class="string">'cars.all'</span>, <span class="keyword">array</span>(<span class="string">'cars'</span> => <span class="variable">$car</span>));</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<h3 id="routes"><a href="#routes" class="headerlink" title="routes"></a>routes</h3><p>然后定义routes,在app/Http/routes.php中增加以下代码:<br><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Route::resource(<span class="string">'cars'</span>, <span class="string">'CarController'</span>);</span><br></pre></td></tr></table></figure></p>
<p><a href="https://laravel.com/docs/5.2/routing" target="_blank" rel="external">routes介绍</a>参照官网。</p>
<h3 id="创建view"><a href="#创建view" class="headerlink" title="创建view"></a>创建view</h3><p>Laravel默认使用<a href="https://laravel.com/docs/5.2/blade" target="_blank" rel="external">blade模板引擎</a>渲染前端页面<br>此处展示所有车辆,首先根据以上的路由配置,在controller里面配置index函数,默认返回所有车辆数据。代码如下:<br><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="preprocessor"><?php</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">App</span>\<span class="title">Http</span>\<span class="title">Controllers</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">use</span> <span class="title">Illuminate</span>\<span class="title">Http</span>\<span class="title">Request</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">use</span> <span class="title">App</span>\<span class="title">Http</span>\<span class="title">Requests</span>;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">CarController</span> <span class="keyword">extends</span> <span class="title">Controller</span></span><br><span class="line"></span>{</span><br><span class="line"> <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">index</span><span class="params">()</span></span><br><span class="line"> </span>{</span><br><span class="line"> <span class="variable">$car</span> = Car::findAll();</span><br><span class="line"> <span class="keyword">return</span> view(<span class="string">'cars.show'</span>, <span class="keyword">array</span>(<span class="string">'car'</span> => <span class="variable">$car</span>));</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p>然后创建view文件,路径为:resources/views/cars/all.blade.php,使用blade模板引擎渲染数据,demo如下:<br><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br></pre></td><td class="code"><pre><span class="line"><span class="doctype"><!DOCTYPE html></span></span><br><span class="line"><span class="tag"><<span class="title">html</span>></span></span><br><span class="line"><span class="tag"><<span class="title">head</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">title</span>></span>Laravel<span class="tag"></<span class="title">title</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="title">h2nk</span> <span class="attribute">href</span>=<span class="value">"https://fonts.googleapis.com/css?family=Lato:100"</span> <span class="attribute">rel</span>=<span class="value">"stylesheet"</span> <span class="attribute">type</span>=<span class="value">"text/css"</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="title">style</span>></span><span class="css"></span><br><span class="line"> <span class="tag">html</span>, <span class="tag">body</span> <span class="rules">{</span><br><span class="line"> <span class="rule"><span class="attribute">height</span>:<span class="value"> <span class="number">100%</span></span></span>;</span><br><span class="line"> }</span></span><br><span class="line"></span><br><span class="line"> <span class="tag">body</span> <span class="rules">{</span><br><span class="line"> <span class="rule"><span class="attribute">margin</span>:<span class="value"> <span class="number">0</span></span></span>;</span><br><span class="line"> <span class="rule"><span class="attribute">padding</span>:<span class="value"> <span class="number">0</span></span></span>;</span><br><span class="line"> <span class="rule"><span class="attribute">width</span>:<span class="value"> <span class="number">100%</span></span></span>;</span><br><span class="line"> <span class="rule"><span class="attribute">display</span>:<span class="value"> table</span></span>;</span><br><span class="line"> <span class="rule"><span class="attribute">font-weight</span>:<span class="value"> <span class="number">100</span></span></span>;</span><br><span class="line"> <span class="rule"><span class="attribute">font-family</span>:<span class="value"> <span class="string">'Lato'</span></span></span>;</span><br><span class="line"> }</span></span><br><span class="line"></span><br><span class="line"> <span class="class">.container</span> <span class="rules">{</span><br><span class="line"> text-ah2<span class="rule"><span class="attribute">gn</span>:<span class="value"> center</span></span>;</span><br><span class="line"> <span class="rule"><span class="attribute">display</span>:<span class="value"> table-cell</span></span>;</span><br><span class="line"> vertical-ah2<span class="rule"><span class="attribute">gn</span>:<span class="value"> middle</span></span>;</span><br><span class="line"> }</span></span><br><span class="line"></span><br><span class="line"> <span class="class">.content</span> <span class="rules">{</span><br><span class="line"> text-ah2<span class="rule"><span class="attribute">gn</span>:<span class="value"> center</span></span>;</span><br><span class="line"> <span class="rule"><span class="attribute">display</span>:<span class="value"> inh2ne-block</span></span>;</span><br><span class="line"> }</span></span><br><span class="line"></span><br><span class="line"> <span class="class">.title</span> <span class="rules">{</span><br><span class="line"> <span class="rule"><span class="attribute">font-size</span>:<span class="value"> <span class="number">96px</span></span></span>;</span><br><span class="line"> }</span></span><br><span class="line"> </span><span class="tag"></<span class="title">style</span>></span></span><br><span class="line"><span class="tag"></<span class="title">head</span>></span></span><br><span class="line"><span class="tag"><<span class="title">body</span>></span></span><br><span class="line"><span class="tag"><<span class="title">div</span> <span class="attribute">class</span>=<span class="value">"container"</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">div</span> <span class="attribute">class</span>=<span class="value">"content"</span>></span></span><br><span class="line"> @foreach($cars as $car)</span><br><span class="line"> <span class="tag"><<span class="title">h1</span>></span>Car {{ $car->id }}<span class="tag"></<span class="title">h1</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">h2</span>></span>{{ $car->make }}<span class="tag"></<span class="title">h2</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">h2</span>></span>{{ $car->model }}<span class="tag"></<span class="title">h2</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">h2</span>></span>{{ $car->produced_on }}<span class="tag"></<span class="title">h2</span>></span></span><br><span class="line"> @endforeach</span><br><span class="line"> <span class="tag"></<span class="title">div</span>></span></span><br><span class="line"><span class="tag"></<span class="title">div</span>></span></span><br><span class="line"><span class="tag"></<span class="title">body</span>></span></span><br><span class="line"><span class="tag"></<span class="title">html</span>></span></span><br></pre></td></tr></table></figure></p>
<p>访问链接:<a href="http://localhost/cars" target="_blank" rel="external">http://localhost/cars</a> ,效果如图所示。<br><img src="/images/src/laravel_run_demo.png" alt="Laravel默认图"></p>
<p>Laravel遵从MVC的设计原则,同时,routes用于映射U
Apache配置多主机和虚拟目录
http://yoursite.com/2016/03/14/Apache配置多主机和虚拟目录/
2016-03-14T10:04:41.000Z
2016-03-14T10:27:13.937Z
<p>相当广泛的需求吧,一个开发机上需要同时发布多个项目=.=,找到<a href="http://www.cnblogs.com/lzrabbit/archive/2013/03/05/2944804.html" target="_blank" rel="external">一篇文章</a>,根据该文折腾了一下,挺好使的,此处做一下笔记</p>
<h4 id="虚拟目录"><a href="#虚拟目录" class="headerlink" title="虚拟目录"></a>虚拟目录</h4><p>假设一个网站的网站根目录在 D:\Program Files\Web ,现在又有一个新的web应用,其目录在 D:\Program Files\demo ,为了此处能够同时访问根目录下的web应用和demo下的web应用,此处可使用虚拟目录实现。<br>打开http.conf,搜索<ifmodule alias_module="">节点,然后在节点中添加以下内容:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#下面是虚拟目录声明格式</span></span><br><span class="line"><span class="comment">#Alias用来定义虚拟目录及虚拟目录路径,其中虚拟目录名称用于URL访问的路径别名,可以和虚拟目录名称不同</span></span><br><span class="line"><span class="comment">#<Directory/>节点用于定义目录的访问权限等</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment">#Alias 虚拟目录名称 虚拟目录路径</span></span><br><span class="line"><span class="comment">#<Directory 虚拟目录路径></span></span><br><span class="line"><span class="comment"># Options Indexes FollowSymLinks</span></span><br><span class="line"><span class="comment"># AllowOverride All</span></span><br><span class="line"><span class="comment"># Order allow,deny</span></span><br><span class="line"><span class="comment"># Allow from all</span></span><br><span class="line"><span class="comment">#</Directory></span></span><br><span class="line"></span><br><span class="line"><span class="comment">#下面是具体的示例,/DemoSite是目录别名 "D:/Program Files/demo"是虚拟目录的实际路径</span></span><br><span class="line">Alias /DemoSite <span class="string">"D:/Program Files/demo"</span></span><br><span class="line"></span><br><span class="line"><Directory <span class="string">"D:/Program Files/demo"</span>></span><br><span class="line"> Options Indexes FollowSymLinks</span><br><span class="line"> AllowOverride All</span><br><span class="line"> Order allow,deny</span><br><span class="line"> Allow from all</span><br><span class="line"></Directory></span><br></pre></td></tr></table></figure></ifmodule></p>
<p>重启Apache服务,在浏览器输入:<a href="http://localhost/demo" target="_blank" rel="external">http://localhost/demo</a> 即可访问<br><em>和参考文档中相比,配置默认端口故URL中不输入URL</em><br>附上一个完整的<ifmodule alias_module="">节点参考<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line"><IfModule <span class="built_in">alias</span>_module></span><br><span class="line"> <span class="comment">#</span></span><br><span class="line"> <span class="comment"># Redirect: Allows you to tell clients about documents that used to </span></span><br><span class="line"> <span class="comment"># exist in your server's namespace, but do not anymore. The client </span></span><br><span class="line"> <span class="comment"># will make a new request for the document at its new location.</span></span><br><span class="line"> <span class="comment"># Example:</span></span><br><span class="line"> <span class="comment"># Redirect permanent /foo http://www.example.com/bar</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">#</span></span><br><span class="line"> <span class="comment"># Alias: Maps web paths into filesystem paths and is used to</span></span><br><span class="line"> <span class="comment"># access content that does not live under the DocumentRoot.</span></span><br><span class="line"> <span class="comment"># Example:</span></span><br><span class="line"> <span class="comment"># Alias /webpath /full/filesystem/path</span></span><br><span class="line"> <span class="comment">#</span></span><br><span class="line"> <span class="comment"># If you include a trailing / on /webpath then the server will</span></span><br><span class="line"> <span class="comment"># require it to be present in the URL. You will also likely</span></span><br><span class="line"> <span class="comment"># need to provide a <Directory> section to allow access to</span></span><br><span class="line"> <span class="comment"># the filesystem path.</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">#</span></span><br><span class="line"> <span class="comment"># ScriptAlias: This controls which directories contain server scripts. </span></span><br><span class="line"> <span class="comment"># ScriptAliases are essentially the same as Aliases, except that</span></span><br><span class="line"> <span class="comment"># documents in the target directory are treated as applications and</span></span><br><span class="line"> <span class="comment"># run by the server when requested rather than as documents sent to the</span></span><br><span class="line"> <span class="comment"># client. The same rules about trailing "/" apply to ScriptAlias</span></span><br><span class="line"> <span class="comment"># directives as to Alias.</span></span><br><span class="line"> <span class="comment">#</span></span><br><span class="line"> ScriptAlias /cgi-bin/ <span class="string">"D:/Program Files (x86)/xampp/cgi-bin/"</span></span><br><span class="line"></span><br><span class="line"> Alias /betme <span class="string">"D:/PHP/laravel/laravel2016/betMe/public"</span></span><br><span class="line"></span><br><span class="line"> <Directory <span class="string">"D:/PHP/laravel/laravel2016/betMe/public"</span>></span><br><span class="line"> Options Indexes FollowSymLinks</span><br><span class="line"> AllowOverride All</span><br><span class="line"> Order allow,deny</span><br><span class="line"> Allow from all</span><br><span class="line"> </Directory></span><br><span class="line"></IfModule></span><br></pre></td></tr></table></figure></ifmodule></p>
<h4 id="多主机绑定"><a href="#多主机绑定" class="headerlink" title="多主机绑定"></a>多主机绑定</h4><p>即一个端口绑定多个域名,通过域名访问不同的目录。<br>打开http.conf文件,在文件的末尾添加以下内容<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#多主机头配置无需放在特定的节点下面,一般直接在配置文件底部添加即可</span></span><br><span class="line"><span class="comment">#NameVirtualHost addr[:port] 为一个基于域名的虚拟主机指定一个IP地址(和端口)</span></span><br><span class="line"><span class="comment">#声明主机头必须加这条指令,否者主机头配置不会生效</span></span><br><span class="line"><span class="comment">#VirtualHost节点下面ServerName就是要绑定的域名,DocumentRoot表示此域名指向的目录</span></span><br><span class="line"><span class="comment">#本机测试的话请在hosts中进行域名绑定如 127.0.0.1 www.mysite1.com</span></span><br><span class="line"></span><br><span class="line">NameVirtualHost *:<span class="number">8080</span></span><br><span class="line"><VirtualHost *:<span class="number">8080</span>></span><br><span class="line"> ServerName www.mysite1.com</span><br><span class="line"> DocumentRoot <span class="string">"D:\Program Files\Apache2.2\htdocs"</span></span><br><span class="line"></VirtualHost></span><br><span class="line"></span><br><span class="line"><VirtualHost *:<span class="number">8080</span>></span><br><span class="line"> ServerName www.mysite2.com</span><br><span class="line"> DocumentRoot <span class="string">"D:\Code\MySite"</span></span><br><span class="line"></VirtualHost></span><br></pre></td></tr></table></figure></p>
<p>配置完成后,重启Apache浏览器输入www.mysite1.com:8080,就会自动定向到D:\Program Files\Apache2.2\htdocs站点了<br>输入www.mysite2.com:8080就会自动定向到D:\Code\MySite站点,如此就可以实现在一个服务器上同时运行多个站点</p>
<h4 id="引用"><a href="#引用" class="headerlink" title="引用"></a>引用</h4><p>Apache配置虚拟目录和多主机头:<a href="http://www.cnblogs.com/lzrabbit/archive/2013/03/05/2944804.html" target="_blank" rel="external">http://www.cnblogs.com/lzrabbit/archive/2013/03/05/2944804.html</a></p>
<p>相当广泛的需求吧,一个开发机上需要&
composer中国全量镜像
http://yoursite.com/2016/03/14/composer中国全量镜像/
2016-03-14T07:30:52.000Z
2016-03-14T08:12:49.751Z
<h3 id="composer中国镜像"><a href="#Composer中国镜像" class="headerlink" title="Composer中国镜像"></a>Composer中国镜像</h3><p>composer是一个php依赖管理的工具,其中缓存了大量的项目和安装包,但由于在可能被墙,故可配置国内镜像,配置方式如下</p>
<h5 id="修改-composer-全局配置文件推荐方式"><a href="#修改-composer-全局配置文件(推荐方式)" class="headerlink" title="修改 composer 全局配置文件(推荐方式)"></a>修改 composer 全局配置文件<font color="#3c763d">(推荐方式)</font></h5><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">composer config -g repo.packagist composer https://packagist.phpcomposer.com</span><br></pre></td></tr></table></figure>
<p>详情参照<a href="http://pkg.phpcomposer.com/" target="_blank" rel="external">官方文档</a></p>
<h3 id="composer中国镜像"><a href="#Composer中国镜像" class="headerlink" title="Composer
Laravel随笔(一):简介
http://yoursite.com/2016/03/11/Laravel随笔(一):简介/
2016-03-11T02:20:16.000Z
2016-03-15T02:00:19.432Z
<blockquote>
<p>Love beautiful code? We do too.</p>
<p align="right">—— Laravel</p>
</blockquote>
<h3 id="introduction"><a href="#Introduction" class="headerlink" title="Introduction"></a>Introduction</h3><p>用PHP半年多了,读研的时候做项目用的Java,其中写图像也用过C++,但PHP给人感觉很随性,@龙哥所说,字符串配上数组走天下。<br>关于框架,才来公司的时候,根据公司的业务,用过F3框架和boss自己写的一个框架,要么结构混乱,文件堆积太多,要么库和支持太少,总想自己折腾下。<br>google、知乎了一下,Laravel备受青睐,如排行榜<br><img src="/images/src/php_framwork_rank.png" alt="PHP框架排行"><br>来源于<a href="http://www.sitepoint.com/best-php-framework-2015-sitepoint-survey-results/" target="_blank" rel="external">sitepoint报告</a>。<br>且Laravel简洁大方的的风格,瞬间吸引了我,Po一张图<br><img src="/images/src/Laravel.png" alt="Laravel默认图"><br>因此,一起来折腾O(∩_∩)O</p>
<h3 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h3><p>参考<a href="https://laravel.com/docs/5.2/installation" target="_blank" rel="external">Laravel官方文档</a></p>
<h4 id="服务器要求"><a href="#服务器要求" class="headerlink" title="服务器要求"></a>服务器要求</h4><p>若非使用<a href="https://laravel.com/docs/5.2/homestead" target="_blank" rel="external">Laravel Homestead</a>,安装Laravel之前,需对环境有一定要求,具体如下(此处版本5.2):</p>
<ul>
<li>PHP >= 5.5.9</li>
<li>OpenSSL PHP Extension</li>
<li>PDO PHP Extension</li>
<li>Mbstring PHP Extension</li>
<li>Tokenizer PHP Extension</li>
</ul>
<h4 id="安装laravel"><a href="#安装Laravel" class="headerlink" title="安装Laravel"></a>安装Laravel</h4><p>Laravel使用<a href="https://getcomposer.org/" target="_blank" rel="external">Composer</a>管理其依赖,故在安装前,需先确认是否安装Composer。若在国内,最好还设置<a href="http://pkg.phpcomposer.com/" target="_blank" rel="external">中国镜像</a>。</p>
<h5 id="通过laravel安装"><a href="#通过Laravel安装" class="headerlink" title="通过Laravel安装"></a>通过Laravel安装</h5><p>首先,使用Composer下载Laravel安装程序<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">composer global require <span class="string">"laravel/installer"</span></span><br></pre></td></tr></table></figure></p>
<p>请确保 ~/.composer/vendor/bin 目录在你的 PATH 中。这样,Laravel 可执行文件才会被系统定位并执行。<br>安装完成之后,可通过命令laravel new创建全新的Laravel到执行目录,且该方法比通过Composer安装更快,命令如:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装一个名为blog的Laravel</span></span><br><span class="line">laravel new blog</span><br></pre></td></tr></table></figure></p>
<h5 id="通过composer安装"><a href="#通过Composer安装" class="headerlink" title="通过Composer安装"></a>通过Composer安装</h5><p>使用Composer的create-project安装Laravel:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 可通过[blog]执行项目名</span></span><br><span class="line">composer create-project laravel/laravel [blog] --prefer-dist</span><br></pre></td></tr></table></figure></p>
<h4 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h4><p>此处参考<a href="https://laravel.com/docs/5.2/installation" target="_blank" rel="external">Laravel官方文档</a></p>
<h3 id="reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h3><p>Laravel官方文档:<a href="https://laravel.com/docs/5.2/installation" target="_blank" rel="external">https://laravel.com/docs/5.2/installation</a><br>laracasts视频教程:<a href="https://laracasts.com/series/laravel-5-from-scratch/episodes/1" target="_blank" rel="external">https://laracasts.com/series/laravel-5-from-scratch/episodes/1</a></p>
<blockquote>
<p>Love beautiful code? We do too.</p>
<p align="right">—— Laravel</p>
</blockquote>
<h3 id="introduction"><a hr
centos rz sz安装
http://yoursite.com/2016/03/10/centos-rz-sz安装/
2016-03-10T10:19:45.000Z
2016-03-10T10:20:23.293Z
<p>使用yum安装,命令如下:<br><figure class="highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">#安装命令</span><br><span class="line">yum install lrzsz</span><br></pre></td></tr></table></figure></p>
<p>使用yum安装,命令如下:<br><figure class="highlight vim"><table><tr><td class
ssh key登录Linux
http://yoursite.com/2016/03/10/ssh-key登录Linux/
2016-03-10T10:16:24.000Z
2016-03-23T04:08:34.652Z
<h3 id="生成ssh-key"><a href="#生成ssh-key" class="headerlink" title="生成ssh key"></a>生成ssh key</h3><p>在Window下,可通过以下命令生成<br><figure class="highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh-keygen -<span class="keyword">t</span> rsa -C <span class="string">"name@example.com"</span></span><br></pre></td></tr></table></figure></p>
<p>Linux下<br><figure class="highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh-keygen -<span class="keyword">t</span> rsa</span><br></pre></td></tr></table></figure></p>
<p>生成过程中需要输入密码,密码为空直接回车即可。<br>然后得到id_rsa(私钥)、id_rsa.pub(公钥)。</p>
<h3 id="ssh-key登录"><a href="#ssh-key登录" class="headerlink" title="ssh key登录"></a>ssh key登录</h3><p>生成key后,将公钥上传到Linux服务器。对于需要使用ssh key进行登录的用户进行配置,以work为例。<br>在Linux服务器中:<br><figure class="highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"># 切换到work目录</span><br><span class="line"><span class="keyword">cd</span> /home/work</span><br><span class="line"># 创建.ssh目录</span><br><span class="line"><span class="built_in">mkdir</span> .ssh</span><br><span class="line">#创建授权文件(可以将key上传之后,直接mv得到,以防复制出错。若生成秘钥使用的是ssh2,则还需新建authorized_keys2文件)</span><br><span class="line">mv id_rsa.pub authorized_keys</span><br><span class="line">mv id_rsa.pub authorized_keys2</span><br><span class="line"># 修改权限(重要)</span><br><span class="line">chmod <span class="number">700</span> .ssh</span><br><span class="line">chmod <span class="number">644</span> .ssh/*</span><br></pre></td></tr></table></figure></p>
<p>之后使用私钥即可登录work账户</p>
<h3 id="常见错误"><a href="#常见错误" class="headerlink" title="常见错误"></a>常见错误</h3><p>使用ssh 登录时,在客户端可能报错:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Permission denied (publickey,gssapi-keyex,gssapi-with-mic).</span><br></pre></td></tr></table></figure></p>
<p>其实此类错误,主要查看ssh登录日志可发现大多数错误原因。<br>查看登录日志:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> /var/<span class="built_in">log</span>/</span><br><span class="line">tail <span class="operator">-f</span> secure</span><br></pre></td></tr></table></figure></p>
<p>可得知失败原因为:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Mar <span class="number">23</span> <span class="number">10</span>:<span class="number">18</span>:<span class="number">40</span> iZ25t206jm9Z sshd[<span class="number">2826</span>]: User git not allowed because account is locked</span><br><span class="line">Mar <span class="number">23</span> <span class="number">10</span>:<span class="number">18</span>:<span class="number">40</span> iZ25t206jm9Z sshd[<span class="number">2826</span>]: input_userauth_request: invalid user git [preauth]</span><br><span class="line">Mar <span class="number">23</span> <span class="number">10</span>:<span class="number">18</span>:<span class="number">40</span> iZ25t206jm9Z sshd[<span class="number">2826</span>]: Connection closed by <span class="number">1.202</span>.<span class="number">225.154</span> [preauth]</span><br></pre></td></tr></table></figure></p>
<p>由于用户被锁。<br><a href="http://stackoverflow.com/questions/15664561/ssh-key-asks-for-password" target="_blank" rel="external">stackoverflow中有解答</a>,原因为:<br><code><br>On Linux systems, locked accounts are defined as those that have !! in the password field of /etc/shadow.<br>This is the default entry for accounts created with the useradd command.<br></code><br>原因是设置用户时,没有设置用户用户密码,导致用户被锁,设置用户密码或把密码域的!!改掉即可。</p>
<h3 id="生成ssh-key"><a href="#生成ssh-key" class="headerlink" title="生成ssh key"></a>生成s
Linux nginx操作
http://yoursite.com/2016/03/10/Linux-nginx操作/
2016-03-10T10:07:36.000Z
2016-03-10T10:08:40.234Z
<h3 id="启动"><a href="#启动" class="headerlink" title="启动"></a>启动</h3><figure class="highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"># 查看nginx是否运行</span><br><span class="line"><span class="keyword">ps</span> aux | <span class="keyword">grep</span> nginx</span><br><span class="line"># 若没有启动,root权限下启动nginx</span><br><span class="line"><span class="keyword">cd</span> /usr/sbin/nginx</span><br><span class="line">./nginx</span><br></pre></td></tr></table></figure>
<h3 id="重启"><a href="#重启" class="headerlink" title="重启"></a>重启</h3><figure class="highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"># 测试</span><br><span class="line"><span class="keyword">cd</span> /usr/sbin/nginx</span><br><span class="line">./nginx -<span class="keyword">t</span></span><br><span class="line"># 重启</span><br><span class="line"><span class="keyword">cd</span> /usr/sbin/nginx</span><br><span class="line">./nginx -<span class="keyword">s</span> reload</span><br></pre></td></tr></table></figure>
<h3 id="关闭"><a href="#关闭" class="headerlink" title="关闭"></a>关闭</h3><figure class="highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"># 查询进程</span><br><span class="line"><span class="keyword">ps</span> aux | <span class="keyword">grep</span> nginx</span><br><span class="line"># 从容停止</span><br><span class="line">kill -QUIT 主进程号</span><br><span class="line"># 快速停止</span><br><span class="line">kill -TERM 主进程号</span><br><span class="line"># 强制停止</span><br><span class="line">kill -<span class="number">9</span> nginx</span><br></pre></td></tr></table></figure>
<h3 id="启动"><a href="#启动" class="headerlink" title="启动"></a>启动</h3><figure class="hi