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