laravel(三):larave基本使用

一、基本視圖顯示


 

前文已經介紹如何建立控制器、動做和視圖,下面咱們來建立一些更實質的功能。php

在此以前咱們須要修改一些配置:mysql

  • app/config/app.php 文件中的 debug 選項設置爲 true (注:開啓開發模式,更友好的開發提示);
  • app/config/database.php 文件中的 default 選項設置爲 mysql(注:咱們以前選擇 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開發中不免會遇到問題,須要協助可使用這些資源:

https://laravel-china.org/

http://www.golaravel.com/

http://laravelacademy.org/

相關文章
相關標籤/搜索