前文已經介紹如何建立控制器、動做和視圖,下面咱們來建立一些更實質的功能。php
在此以前咱們須要修改一些配置:mysql
在博客程序中,咱們要建立一個新「資源」。資源是指一系列相似的對象,好比文章,人和動物。laravel
資源能夠被建立、讀取、更新和刪除,這些操做簡稱 CRUD。sql
Laravel 提供了資源控制器能夠簡單的創建跟資源相關的 RESTful 控制器。 建立文章資源後,app/routes.php 文件的內容新增以下:數據庫
Route::resource('articles', 'ArticlesController');
執行下面的命令,會看到定義了全部標準的 REST 動做架構
$ php artisan routes
根據本身建立的路由,使用前一節所說的命令生成控制器與視圖。打開剛生成的 app/controllers/ArticlesController.php 文件,控制器就是一個類,繼承自 BaseController。在這個 ArticlesController 類中定義了對應的資源動做。動做的做用是處理文章的 CRUD 操做。
修改 ArticlesController.php 文件中的+--------+-----------------------------------+------------------+----------------------------+----------------+---------------+ | Domain | URI | Name | Action | Before Filters | After Filters | +--------+-----------------------------------+------------------+----------------------------+----------------+---------------+ | | GET|HEAD / | | WelcomeController@index | | | | | GET|HEAD articles | articles.index | ArticlesController@index | | | | | GET|HEAD articles/create | articles.create | ArticlesController@create | | | | | POST articles | articles.store | ArticlesController@store | | | | | GET|HEAD articles/{articles} | articles.show | ArticlesController@show | | | | | GET|HEAD articles/{articles}/edit | articles.edit | ArticlesController@edit | | | | | PUT articles/{articles} | articles.update | ArticlesController@update | | | | | PATCH articles/{articles} | | ArticlesController@update | | | | | DELETE articles/{articles} | articles.destroy | ArticlesController@destroy | | | +--------+-----------------------------------+------------------+----------------------------+----------------+---------------+
public function create() { // }
爲app
public function create() { return View::make('articles.create'); }
注:在 PHP 中,方法分爲 public、private 和 protected 三種,只有 public 方法才能做爲控制器的動做。函數
而後在文件 app/views/articles/create.blade.php中,寫入以下代碼ui
<h1>New Article</h1>
最後在地址欄輸入http://localhost:8000/articles/create , 能夠看到頁面中顯示了一個標頭。如今路由、控制器、動做和視圖都能正常運行了。this
要在模板中編寫表單,可使用「表單構造器」。Laravel 中經常使用的表單構造器是 Form
。在 app/views/articles/create.blade.php 文件中加入如下代碼:
{{ Form::open() }} <p> {{ Form::text('title') }} </p> <p> {{ Form::text('text') }} </p> <p> {{ Form::submit('submit') }} </p> {{ Form::close() }}
如今刷新頁面,會看到上述代碼生成的表單。在 Laravel 中編寫表單就是這麼簡單!
在 Form 方法的塊中,Form::text 建立了兩個標籤和兩個文本字段,一個用於文章標題,一個用於文章內容。最後,Form::submit 建立一個提交按鈕。
不過這個表單還有個問題。若是查看這個頁面的源碼,會發現表單 action 屬性的值是 /articles/create。這就是問題所在,由於其指向的地址就是如今這個頁面,而這個頁面是用來顯示新建文章表單的。
要想轉到其餘地址,就要使用其餘的地址。這個問題可以使用 Form::open 方法的 url 參數解決。在 Laravel 中,用來處理新建資源表單提交數據的動做是 store,因此表單應該轉向這個動做。
修改 app/views/articles/create.blade.php 文件中的 Form::open,改爲這樣:
{{ Form::open(array('url' => 'articles')) }}
這裏,咱們把 url 參數的值設爲 articles 。對應的地址是 /articels,默認狀況下,這個表單會向這個路由發起 POST 請求。這個路由對應於 ArticlesController 控制器的 store 動做。
表單寫好了,路由也定義了,如今能夠填寫表單,而後點擊提交按鈕新建文章了。提交表單,會看到一個白屏。如今暫且無論這個錯誤。store 動做的做用是把新文章保存到數據庫中。
提交表單後,其中的字段以參數的形式傳遞給 Laravel。這些參數能夠在控制器的動做中使用,完成指定的操做。要想查看這些參數的內容,能夠把 store 動做改爲:
public function store() { dd(Input::all()); }
dd 函數爲 Laravel 內置的打印輸出函數,Input::all() 取得全部發出請求時傳入的輸入數據。
若是如今再次提交表單,不會再看到白屏錯誤,而是會看到相似下面的文字:
array (size=3) '_token' => string 'plx6TrGRWfHakBlKybUzkRTH8r712JU4rWfiPTs7' (length=40) 'title' => string 'First article!' (length=14) 'text' => string 'This is my first article.' (length=25)
store 動做把表單提交的參數顯示出來了。不過這麼作沒什麼用,看到了參數又怎樣,什麼都沒發生。
接下來須要建立模型
三、建立模型
和建立控制器、視圖同樣,建立模型也有相應的命令
$ php artisan make:model Models\Article
是否是特別簡單,而後你會在app/models/Article.php文件中看到如下代碼:
<?php class Article extends Model { }
注意咱們並無告訴 Eloquent Article 模型會使用哪一個數據庫表。若沒有特別指定,系統會默認自動對應名稱爲「類名稱的小寫複數形態」的數據庫表。因此,在上面的例子中, Eloquent 會假設 Article 將把數據存在 articles 數據庫表。
若是想要指定數據庫表名,插入以下代碼:
protected $table = 'article';
到這裏有沒有感受還缺點什麼,對!就是缺乏article,假如你還要去手動建立數據表,那你就low爆了,laravel爲咱們提供了migrate遷移命令,能夠快速建表,節省時間。
使用 Artisan CLI 的 migrate:make 命令創建遷移文件:
$ php artisan migrate:make create_articles_table --create=articles
遷移文件會創建在 app/database/migrations 目錄下,文件名會包含時間戳,用於在執行遷移時用來決定順序。
app/database/migrations/2014_09_03_084339_create_articles_table.php (你的遷移文件名可能有點不同)文件的內容以下所示:
<?php use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateArticlesTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('articles', function(Blueprint $table) { $table->increments('id'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::drop('articles'); } }
修改其中的建立代碼爲:
Schema::create('articles', function(Blueprint $table) { $table->increments('id'); $table->string('title'); $table->text('text'); $table->timestamps(); });
在這個遷移中定義了一個名爲 up 的方法,在運行遷移時執行。up 方法中定義的操做都是能夠經過 down 方法實現可逆的,Laravel 知道如何撤銷此次遷移操做。運行遷移後,會建立 articles 表,以及一個字符串字段和文本字段。同時還會建立兩個時間戳字段,用來跟蹤記錄的建立時間和更新時間。
而後,使用 Artisan 命令運行遷移:
$ php artisan migrate
Laravel 會執行遷移操做,告訴你建立了 articles 表。
Migration table created successfully. Migrated: 2014_09_03_084339_create_articles_table
再回到 ArticlesController 控制器,咱們要修改 store 動做,使用 Article 模型把數據保存到數據庫中。打開 app/controllers/ArticlesController.php 文件,把 store 動做修改爲這樣:
public function store() { $article = Article::create(array('title'=>Input::get('title'), 'text'=>Input::get('text'))); return Redirect::route('articles.show', array($article->id)); }
同時在 app/models/Article.php 添加 :
protected $fillable = array('title', 'text');
fillable 屬性容許在動做中調用模型的 create 方法使用 title 和 text 屬性。
再次訪問 http://localhost:8000/articles/create ,填寫表單,還差一步就能建立文章了。
和前面同樣,咱們要在 app/controllers/ArticlesController.php 文件中更改 show 動做,以及相應的視圖文件。
public function show($id) { $article = Article::find($id); return View::make('articles.show', compact('article')); }
而後,新建 app/views/articles/show.blade.php 文件,寫入下面的代碼:
<p> <strong>Title:</strong> {{ $article->title }} </p> <p> <strong>Text:</strong> {{ $article->text }} </p>
作了以上修改後,就能真正的新建文章了。訪問 http://localhost:8000/articles/create ,本身試試。
咱們還要列出全部文章,對應的路由是:
GET|HEAD articles | articles.index | ArticlesController@index
在 app/controllers/ArticlesController.php 文件中,修改 ArticlesController 控制器 index 動做:
public function index() { $articles = Article::all(); return View::make('articles.index', compact('articles')); }
而後編寫這個動做的視圖,保存爲 app/views/articles/index.blade.php:
<h1>Listing articles</h1> <table> <tr> <th>Title</th> <th>Text</th> </tr> @foreach ($articles as $article) <tr> <td>{{ $article->title }}</td> <td>{{ $article->text }}</td> </tr> @endforeach </table>
如今訪問 http://localhost:8000/articles ,會看到已經發布的文章列表。
至此,咱們能夠新建、顯示、列出文章了。下面咱們添加一些連接,指向這些頁面。
打開 app/views/welcome/index.blade.php 文件,添加:
{{ link_to_route('articles.index', 'My Blog') }}
link_to_route 是 Laravel 內置的視圖幫助方法之一,根據提供的文本和地址建立超連接。這上面這段代碼中,地址是文章列表頁面。
接下來添加到其餘頁面的連接。先在 app/views/articles/index.blade.php 中添加「New Article」連接,放在
標籤以前:
{{ link_to_route('articles.create', 'New article') }}
點擊這個連接後,會轉向新建文章的表單頁面。
而後在 app/views/articles/create.blade.php 中添加一個連接,位於表單下面,返回到 index 動做:
{{ link_to_route('articles.index', 'Back') }}
最後,在 app/views/articles/show.blade.php 模板中添加一個連接,返回 index 動做,這樣用戶查看某篇文章後就能夠返回文章列表頁面了:
{{ link_to_route('articles.index', 'Back') }}
在 app/controllers/ArticlesController.php 文件中,修改 ArticlesController 控制器 store 動做:
public function store() { $rules = array('title' => 'required|min:5'); $validator = Validator::make(Input::all(), $rules); if ($validator->fails()) { return Redirect::route('articles.create') ->withErrors($validator) ->withInput(); } $article = Article::create(array('title'=>Input::get('title'), 'text'=>Input::get('text'))); return Redirect::route('articles.show', array($article->id)); }
而後修改 app/views/articles/create.blade.php 添加 :
@if ($errors->any()) <div id="error_explanation"> <h2>{{ count($errors->all()) }} prohibited this article from being saved:</h2> <ul> @foreach ($errors->all() as $message) <li>{{ $message }}</li> @endforeach </ul> </div> @endif
再次訪問 http://localhost:8000/articles/create ,嘗試發佈一篇沒有標題的文章,會看到一個頗有用的錯誤提示。
七、
咱們已經說明了 CRUD 中的 CR 兩種操做。下面進入 U 部分,更新文章。
首先,要在 ArticlesController 中更改 edit 動做:
public function edit($id) { $article = Article::find($id); return View::make('articles.edit', compact('article')); }
視圖中要添加一個相似新建文章的表單。新建 app/views/articles/edit.blade.php 文件,寫入下面的代碼:
<h1>Editing Article</h1> @if ($errors->any()) <div id="error_explanation"> <h2>{{ count($errors->all()) }} prohibited this article from being saved:</h2> <ul> @foreach ($errors->all() as $message) <li>{{ $message }}</li> @endforeach </ul> </div> @endif {{ Form::open(array('route' => array('articles.update', $article->id), 'method' => 'put')) }} <p> {{ Form::text('title', $article->title) }} </p> <p> {{ Form::text('text', $article->text) }} </p> <p> {{ Form::submit('submit') }} </p> {{ Form::close() }} {{ link_to_route('articles.index', 'Back') }}
這裏的表單指向 update 動做
method: put ( patch ) 選項告訴 Laravel,提交這個表單時使用 PUT 方法發送請求。根據 REST 架構,更新資源時要使用 HTTP PUT 方法。
而後,要在 app/controllers/ArticlesController.php 中更新 update 動做:
public function update($id) { $rules = array('title' => 'required|min:5'); $validator = Validator::make(Input::all(), $rules); if ($validator->fails()) { return Redirect::route('articles.create') ->withErrors($validator) ->withInput(); } $article = Article::find($id); $article->title = Input::get('title'); $article->text = Input::get('text'); $article->save(); return Redirect::route('articles.show', array($article->id)); }
最後,咱們想在文章列表頁面,在每篇文章後面都加上一個連接,指向 edit 動做。打開 app/views/articles/index.blade.php 文件,在「Show」連接後面添加「Edit」連接:
<table> <tr> <th>Title</th> <th>Text</th> <th colspan="2"></th> </tr> @foreach ($articles as $article) <tr> <td>{{ $article->title }}</td> <td>{{ $article->text }}</td> <td>{{ link_to_route('articles.show', 'Show', $article->id) }}</td> <td>{{ link_to_route('articles.edit', 'Edit', $article->id) }}</td> </tr> @endforeach </table>
咱們還要在 app/views/articles/show.blade.php 模板的底部加上「Edit」連接:
{{ link_to_route('articles.index', 'Back') }} | {{ link_to_route('articles.edit', 'Edit', $article->id) }}
編輯文章頁面和新建文章頁面很類似,顯示錯誤提示的代碼是相同的。下面使用局部視圖去掉兩個視圖中的重複代碼。
新建 app/views/notifications.blade.php 文件,寫入如下代碼:
@if ($errors->any()) <div id="error_explanation"> <h2>{{ count($errors->all()) }} prohibited this article from being saved:</h2> <ul> @foreach ($errors->all() as $message) <li>{{ $message }}</li> @endforeach </ul> </div> @endif
下面來修改 app/views/articles/creat.blade.php 和 edit.blade.php 視圖,使用新建的局部視圖,把其中的上面代碼全刪掉,替換成:
@include('notifications')
九、最後來個刪除吧
如今介紹 CRUD 中的 D,從數據庫中刪除文章。按照 REST 架構的約定,刪除文章的路由是:
DELETE articles/{articles} | articles.destroy | ArticlesController@destroy
刪除資源時使用 DELETE 請求。若是還使用 GET 請求,能夠構建以下所示的惡意地址:
<a href='http://example.com/articles/1/destroy'>look at this cat!</a>
刪除資源使用 DELETE 方法,路由會把請求發往 app/controllers/ArticlesController.php 中的 destroy 動做。修改 destroy 動做:
public function destroy($id) { Article::destroy($id); return Redirect::route('articles.index'); }
想把記錄從數據庫刪除,能夠在模型對象上調用 destroy 方法。注意,咱們無需爲這個動做編寫視圖,由於它會轉向 index 動做。
最後,在 index 動做的模板(app/views/articles/index.blade.php)中加上「Destroy」連接:
<table> <tr> <th>Title</th> <th>Text</th> <th colspan="2"></th> </tr> @foreach ($articles as $article) <tr> <td>{{ $article->title }}</td> <td>{{ $article->text }}</td> <td>{{ link_to_route('articles.show', 'Show', $article->id) }}</td> <td>{{ link_to_route('articles.edit', 'Edit', $article->id) }}</td> <td> {{ Form::open(array('method' => 'DELETE', 'route' => array('articles.destroy', $article->id))) }} {{ Form::submit('Delete') }} {{ Form::close() }} </td> </tr> @endforeach </table>
搞定收工!
恭喜,如今你能夠新建、顯示、列出、更新、刪除文章了。
在laravel開發中不免會遇到問題,須要協助可使用這些資源: