蒼時弦也
蒼時弦也
資深軟體工程師
發表於

Laravel 初次嘗試

今天下午用 Laravel 試寫了一下留言板。雖然之前看過文件,但是沒有認真去讀,這次認真用一次之後,感想就是很讚~

一方面是跟 Rails 的設計真的都很類似,又有 Cli 可以使用,光這兩點就省下很多功夫。

總而言之,我要推一下這個 PHP Framework 拉!除了 Slim Framework 之外,這款是我有實際去用過的第三款,用起來也很不錯(蓋章)

下載


這步驟根本是湊字數的(被巴)

我超貼心幫各位把官網都做好超連結了喔~~

總之就是下載,解壓縮,然後放到可以跑 PHP 的地方,幫 storage 資料夾設定為可寫。 大家可能會不太習慣,不過他是以 public 資料夾為瀏覽的目錄喔~

(所以用在 PagodaBox 這種可以設定根目錄的 PaaS 超爽的)

事前設定


我跟你們說我超懶的,連 MySQL 都不想設定拉~

所以請打開 application/config/database.PHP 把 ‘default’ => ‘mysql’ 改成 sqlite 吧~

 1<?PHP
 2  //略
 3  /*
 4   |--------------------------------------------------------------------------
 5   | Default Database Connection
 6   |--------------------------------------------------------------------------
 7   |
 8   | The name of your default database connection. This connection will used
 9   | as the default for all database operations unless a different name is
10   | given when performing said operation. This connection name should be
11   | listed in the array of connections below.
12   |
13   */
14
15   'default' => 'sqlite',
16   //略
17?>

第 45 行左右,大概就是這樣喔~

如果你想用 Rewrite 的話,就把 application/config/applicatoin.PHP 裡面的 ‘index’ => ‘index.PHP’, 改成 ‘index’ => ‘’, 就可以了(至於 .htaccess 檔則是一開始就幫你弄好,超貼心~)

路由


接下來修改一下 applicatoin/routers.PHP 的設定

一開始大概 35 行會看到這樣

 1<?PHP
 2//略
 3
 4Route::get('/', function()
 5{
 6	return View::make('home.index');
 7});
 8
 9//略
10?>

然後我們只要有一個簡單的留言功能,所以直接丟給 Controller 就可以了~

1<?PHP
2//略
3
4Route::controller('home');
5
6//略
7?>

Model


我們會用到 Migrate 這個超方便的功能,不過要先用個指令~

PHP artisan migrate:install

這樣 Laravel 才會有 Migrate 紀錄的資料表,也才有辦法知道下次運行 Migrate 時是否要更動資料表

接著創建一個 Migrate 來新增我們留言資料

PHP artisan migrate:make create_comments_table

之後編輯 application/migrations/日期戳記_create_comments_table.PHP 來撰寫資料表的結構。

 1<?PHP
 2
 3class Create_Comments_Table {
 4
 5	/**
 6	 * Make changes to the database.
 7	 *
 8	 * @return void
 9	 */
10	public function up()
11	{
12    Schema::create('comments', function($table){ //建立資料表
13      $table->increments('ID'); //設定 ID (遞增)
14      $table->string('subject'); //留言主旨
15      $table->text('content'); //留言內容
16      $table->timestamps(); //時間戳記 created_at 跟 updated_at 兩個欄位
17    });
18	}
19
20	/**
21	 * Revert the changes to the database.
22	 *
23	 * @return void
24	 */
25	public function down()
26	{
27      Schema::drop('comments'); //刪除資料表
28	}
29
30}

接著 Migrate 讓 Laravel 產生 SQL 語法並且寫入資料庫

PHP artisan migrate

繼續建立 Model 來存取,新增一個檔案 application/models/Comment.PHP

1
2<?PHP
3
4  class Comment extends Eloquent
5  {
6    public static $table = 'comments'; // 指定對應的資料表
7    public static $per_page = 5; //設定分頁時每頁筆數(預設 20 筆)
8  }

這樣一來 Model 就建立好了,因為只需要簡易的讀寫,所以就沒有在深入去撰寫更細節的部分。

Controller & View


接下來處理一下 Controller 的部分,編輯 application/controller/home.PHP

 1
 2<?PHP
 3
 4class Home_Controller extends Base_Controller {
 5
 6  public $restful = true; //使用 RESTFUL (get_ post_ 開頭的 method)
 7
 8  public function get_index()
 9  {
10
11    $comments = Comment::order_by('created_at', 'desc')->paginate(); //依照 created_at 排序,並且分頁
12
13    return View::make('home.index')
14                 ->with('comments', $comments); //Render home/index 這個 view 並且附帶 comments 這個變數
15  }
16
17  public function post_index()
18  {
19    $inputs = Input::all(); //取得所有 POST/GET 的變數
20    $rules = array( //設定驗證規則
21      'subject' => 'required', //必填
22      'content' => 'required' //必填
23    );
24
25    $validation = Validator::make($input, $rules); //進行驗證
26
27    if( $validation->fails() ) { //假設驗證失敗
28      return Redirect::home()->with_errors($validation); //回到首頁並且帶著錯誤資訊
29    }
30
31    Comment::create(array( //插入資料
32      'subject' => $inputs['subject'],
33      'content' => $inputs['content']
34    ));
35
36    return Redirect::home();
37  }
38
39}

基本上我們就不改動 Laravel 的 CSS 直接借用一下(因為是練習,所以實際使用請改正喔~)

編輯 application/views/home/index.blade.PHP

附註:blade 是 Laravel 的樣板引擎,要加在檔名才會運作~

 1{% raw %}
 2<!doctype html>
 3<html lang="zh_TW">
 4<head>
 5	<meta charset="utf-8">
 6	<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
 7	<title>Simple Guestbook</title>
 8	<meta name="viewport" content="width=device-width">
 9	{{ HTML::style('laravel/CSS/style.css') }}
10  <style>
11    input,textarea {
12      background: #FFF;
13      border: 1px solid #EFEFEF;
14      margin: 10px;
15      padding: 5px;
16    }
17  </style>
18</head>
19<body>
20	<div class="wrapper">
21		<header>
22			<h1>Guestbook</h1>
23			<h2>A simple guestbook</h2>
24
25			<p class="intro-text" style="margin-top: 45px;">
26			</p>
27		</header>
28		<div role="main" class="main">
29      <div class="new">
30      	<?PHP $errorMessages = $errors->all('<pre>:message</pre>'); ?>
31        @foreach ($errorMessages as $message)
32          { { $message }}
33        @endforeach
34        {{ Form::open() }}
35
36        {{ Form::open() }}
37        <p>
38          {{ Form::label('subject', 'Subject') }}
39          {{ Form::text('subject') }}
40        </p>
41        <p>
42          {{ Form::label('content', 'Content') }}
43          {{ Form::textarea('content') }}
44        </p>
45        <p>
46          { { Form::submit('Comment') }}
47        </p>
48        {{ Form::close() }}
49      </div>
50      <hr />
51			<div class="home">
52        @forelse ($comments->results as $comment)
53          <h2>{{ e($comment->subject) }}</h2>
54          <pre>{{ e($comment->content) }}</pre>
55        @empty
56          <pre> No comment be found! </pre>
57        @endforelse
58			</div>
59		</div>
60	</div>
61</body>
62</html>
63{% endraw %}

不知道為什麼我用 { { }} 包起來就會消失,所以我在 { 跟 { 中間多加了空白

Form Class 是 Laravel 的表單物件,可以輔助產生表單。

$errors 是 Laravel 有錯誤時會附加到 View 的變數(可以用 Session::get(’errors’) 在 Controller 取得,這邊為了方便就直接在 View 設定)

而 e() 是 Laravel 的脫跳,可以把 HTML 等有危險的資變成一般字串顯示。類似於 htmlspecialchars() 的功能。

{% raw %} 至於 Crsf 的部分我並沒有寫進去,因為我還不清楚 Laravel 的 Controller 中使用 Filter 如何使用,不然可以加上 {{ Form::token() }} 以及幫 Controller 加入 brefore filter 並且設定 crsf 來避免跨域的攻擊。 {% endraw %}

好了,這篇文章就到這邊告一段落摟~

至於 Laravel 本身內建分頁跟使用者認證,是很方便的部分。也支援數種資料庫跟記憶體快取的實踐,除了 Cli 沒辦法幫忙產生 Controller/Model/View 的基本檔案有點可惜,不然其實很接近 Rails 的方便了~

(之前看到有人引用,說我的文章沒啥參考性但是可以不用看英文,超傷心,只好認真一點寫 XDD)

如果噴錯誤,請檢查一下是不是 :: 少打一個,我常常這樣噴錯誤又看不到錯誤訊息 XDD

Github Repo: https://Github.com/elct9620/laravel-guestbook-example