标签为“Laravel”的页面如下
30天成爲Laravel萌新(目錄)
這是第二次參加「iT 邦幫忙鐵人賽」。上次報了兩個主題,只有一個完賽。這次報了三個主題……還好全都完賽了。雖然開賽前,對於一個主題先寫了近十天左右的文章,但在賽中,趕稿壓力還是頗大的。
30天成爲Laravel萌新(目錄)
「30天成爲Laravel萌新」是我最重要的一個系列,報名在Modern Web主題下,並同步發表於又LAG隨性筆記。下面列出每天文章連結:
- 30天成爲Laravel萌新(第0天) - 前言
- 30天成爲Laravel萌新(第1天) - 認識Laravel
- 30天成爲Laravel萌新(第2天) - 安装 Laravel
- 30天成爲Laravel萌新(第3天) - 使用laradock建立開發環境(上)
- 30天成爲Laravel萌新(第4天) - 使用laradock建立開發環境(下)
- 30天成爲Laravel萌新(第5天) - Laradock的工作空間容器
- 30天成爲Laravel萌新(第6天) - 配置專案
- 30天成爲Laravel萌新(第7天) - 認識artisan
- 30天成爲Laravel萌新(第8天) - 路由&頁面模板(1)
- 30天成爲Laravel萌新(第9天) - 路由&頁面模板(2)
- 30天成爲Laravel萌新(第10天) - 路由&頁面模板(3)
30天成爲Laravel萌新(第30-1天) - 總結
這是第二次參加鐵人賽。這個主題是我決定參賽出就已經定好,總算寫完了。從介紹、安裝、配置,使用laradock
、artisan
,路由、模板,Parsdown
(Markdown),再到控制器、資料庫,以及另我以些驚豔的Pagiantion
,然後多語系支援、紀錄檔,客製化錯誤頁面,檔案上傳與表單驗證,到最後登入驗證。
在這過程中,一學習到不少,很充實。(還有下次不要在一次報三個主題了…)
不過,Laravel官方文檔其實相當豐富完整,這30天的文章,頂多只能當作而外的參考而已,但願對想學習Laravel的人還是有幫助。
最後,你可以在這裡看到跟Laravel有關的文章。或是看看另外兩個系列文章( 又LAG的EOS.IO技術筆記 和 有點玩鬧性質的 又LAG的ML學習筆記 )。
30天成爲Laravel萌新(第30天) - 登入驗證
這部份在Django時,明明是最先學的,在Laravel卻放到了最後☺
要使用Laravel提供的會員系統,相當容易,只須要:
artisan make:auth
artisan migrate
然後瀏覽http://localhost/register 註冊帳號,或是http://localhost/login 登入帳號。仔細一看,會多了這些檔案:
new file: app/Http/Controllers/HomeController.php
new file: resources/views/auth/login.blade.php
new file: resources/views/auth/passwords/email.blade.php
new file: resources/views/auth/passwords/reset.blade.php
new file: resources/views/auth/register.blade.php
new file: resources/views/auth/verify.blade.php
new file: resources/views/home.blade.php
new file: resources/views/layouts/app.blade.php
modified: routes/web.php
其中routes/web.php
多了:
Auth::routes();
Route::get('/home', 'HomeController@index')->name('home');
現在瀏覽http://localhost/home 也有畫面了。
30天成爲Laravel萌新(第29天) - 表單驗證
昨天的程式碼有一些註解的內容,先取消註解試試。
resources/views/images/upload.blade.php部份內容
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
routes/web.php處理post('/images/upload')
請求的部份內容:
Validator::make($request->all(), [
'file' => 'required|image',
])->validate();
驗證表單資料
Validator::make($request->all(), [
'file' => 'required|image',
])->validate();
差不多等價於:
$validate = $request->validate([
'file' => 'required|image',
]);
$request
有validate()
的方法。還可以直接建立一個驗證器,繼承Request
:
php artisan make:request ImageUpload
上面執行完後,現在,在app/Http/Requests/
目錄下多了ImageUpload.php
,內容改成下面這樣:
30天成爲Laravel萌新(第28天) - 上傳檔案
Laravel要上傳檔案非常的簡單,今天就來簡單帶個範例吧!
建立檔案目錄連結
首先,現用Artisan建立目錄連結。
artisan storage:link
上面命令會建立storage/app/public
目錄,並將目錄同樣綁定到public/storage
。這讓於此目錄下的內容,可以透過http://localhost/storage/<FILE NAME>
存取。在public
目錄下的檔案,基本都可以直接透過瀏覽器存取。
上傳頁面
同樣以一個簡單的上傳頁面作為範例。先建立resources/views/images/upload.blade.php
:
@extends("base",['title'=>'上傳圖片'])
@section('title', '上傳圖片')
@section('body')
<form action="{{route('image.upload')}}" method="post" enctype="multipart/form-data">
@csrf
<!--
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
-->
<input name="file" type="file" accept="image/*" value=""/>
<input name="" type="submit" value="上傳"/>
</form>
@endsection
30天成爲Laravel萌新(第27天) - 本地化、多語言支援(Localization)
@extends("base",['title'=>'哎呀,找不著頁面'])
@section('title', '哎呀,找不著頁面')
@section('body')
<h1>{{__('404 error message')}}</h1>
<b>哎呀,找不著頁面</b>
<p>
<ul>
<li><a href="/">點擊我,回到首頁</a></li>
<li><a href="{{route('blog/post.index')}}">我的網誌</a></li>
</ul>
</p>
@endsection
開始
在昨天簡單建立的錯誤頁面中,又再一次偷渡了一個東西。對,就是那個有點怪怪的{{__('404 error message')}}
,實際上這等價於@lang('404 error message')
。透過lang()
函式的方式,也可以在控制器做變換。lang()
會根據給定的字串,以及設定(app/config.php
)中的locale
和faker_locale
轉換為對應的語言。預設會轉換為locale
所設定的,而備用語言可由faker_locale
設定。當兩者都不存在時,會直接輸出字串。還記得我們把app/config.php
部份內容改成這樣嗎?
'locale' => 'zh-TW',
'fallback_locale' => 'en',
不過,不管是locale
還是faker_locale
,都還找不著{{__('404 error message')}}
要轉換成的文字,所以現在會直接生成404 error message
。
30天成爲Laravel萌新(第26天) - 客製化404錯誤頁面
HTTP協議上存在許多狀態碼,其中400系列、500系列錯誤可能是最常見到。200、300很難被注意到。恐怕又以404錯誤、403錯誤、500錯誤、503錯誤最常見。一個好的錯誤提示頁面,可以帶來很好的使用體驗。你可以看看別人怎麼設計(以及2018年不可錯過的創意404報錯設計),甚至更有404 PAGE TEMPLATE (https://www.404pagefree.com/) 可以直接下載404錯誤頁面模板(這網址真有趣),裡頭模板多以CC-BY 3.0姓名標示授權,可用於商業用途。
那麼在Laravel要怎麼客製化這些錯誤提示頁面?以404錯誤頁面為例,可以建立resources/views/errors/404.blade.php
檔案,寫入以下內容:
@extends("base",['title'=>'哎呀,找不著頁面'])
@section('title', '哎呀,找不著頁面')
@section('body')
<h1>{{__('404 error message')}}</h1>
<b>哎呀,找不著頁面</b>
<p>
<ul>
<li><a href="/">點擊我,回到首頁</a></li>
<li><a href="{{route('blog/post.index')}}">我的網誌</a></li>
</ul>
</p>
@endsection
同樣的…CSS不是本系列重點……
30天成爲Laravel萌新(第25天) - 紀錄檔
使用Logging
現在,要再回到laradock來。不過同樣的,Lavavel儲存紀錄檔的地方也是在storage/logs
。這裡會儲存使用Log::info()
所寫下的紀錄。
docker-compose exec workspace bash -c "tail -f storage/logs/最新的log"
如果使用Linux的話,也可以直接:
tail -f storage/logs/最新的log
當然你也可以直接把紀錄檔,用文字編輯器開啟。不過上述會這麼做,是因為如次可以更簡單的在開發時除錯。有時候,Laravel錯誤訊息頁面提供的訊息並非一目瞭然,會需要用到printf
方式除錯(我假設…你不動gdb
,但用過最基本的除錯手法…)。在這裡,使用一系列Log::
的方法,其中,Log::debug()
就對應除錯資訊。這和我曾經寫過的瀏覽器console.log()外的一些其他用法 有些像。
30天成爲Laravel萌新(第24天) - 頁面清單 下篇(使用Pagnation和刪除按鈕)
就先來看看使用Laravel提供Pagination能夠多麼簡單。
首先,控制器只需要使用BlogPost::paginate($limit)
查詢就好,並將查詢結果直接傳遞給視圖。
public function index()
{
// 如果想要將每頁顯示數量變成可以調整的,
// index需要傳入 (Request $request),並由下方方式取得$limit傳入paginate
// $limit = $request->query('limit', 30);
$posts = BlogPost::paginate(30);
return view("blog/index",[
"posts"=>$posts,
]);
}
BlogPost::paginate($limit)
會自動根據Request的page
參數取得存取的頁面,自動計算offset
,並根據給予的每頁顯示數量限制來查詢。甚至連index()
都不需要傳入Request $request
。傳給視圖的也少了不少。說到視圖,立馬來看看變得多簡潔:
@section('body')
<div class="container">
<ul>
@foreach ($posts as $post)
<li>
<a href="{{route('blog/post.show',['id'=>$post->id])}}">{{ $post->title }}</a>
</li>
@endforeach
</ul>
</div>
{{ $posts->links() }}
@endsection
列出文章清單的部份,大致什麼太大變化。但是頁面頁數選項不再那麼複雜,沒錯,只需要$post->links()
就好。他會自動生成符合Bootstrap的Pagination。在瀏覽器接受到的HTML樣子可能如下:
呵呵,根本不需要寫這麼麻煩…也太簡單了吧!
30天成爲Laravel萌新(第23天) - 頁面清單 上篇
因為重點不在於CSS,不在於Bootstrap。 其實大可以將頁面弄的很美觀。在Laravel專案資料夾中,其實有一個給
npm
使用的package.json
檔案。 不過還是來把重點放在Laravel上。
使用Pagnation前
Laravel提供一個超級簡單的方式,來處理分頁問題。不過在使用前,來看看原本要怎麼實現index()
。不但要取得頁數,並計算檢索數量,然後從資料庫透過offset()
、linit()
的方式取得資料。
public function index(Request $request)
{
$offset = $request->query("offset", 0);
$limit = $request->query("limit", 30);
$page = $request->query("page");
if($page){
$offset = ($page - 1) * $limit;
}else{
$page = ($offset / $limit) + 1;
}
$request->merge([
"offset" => $offset,
"page" => $page,
]);
$posts = BlogPost::orderBy('activity_id','ASC')
->offset($offset)
->limit($limit)
->get();
return view("blog/index",[
"posts"=>$posts,
"page"=>$page,
"total_pages" => $total_pages,
]);
}
30天成爲Laravel萌新(第22天) - 資源控制器(Resource Controller) 下篇
最終,我決定將index()
和destroy()
另外寫。一個是寫完create()
和edit()
,destroy()
也就不怎麼難。但是index()
意外也能有豐富內容能寫…(加上有另一種用法我還不太會)
總體來說,這篇程式還是有些趕工粗糙….
重點觀念
@method
的使用 相當於隱藏欄位_method
。@csrf
的使用
建立頁面模板
同樣的,先建立一個編輯頁面的模板resource/views/blog/edit.blade.php
:
@extends("base",['title'=>'編輯文章'])
@section('title', '編輯文章')
@section('body')
<form method="post" action="{{($type=="edit") ?
route("blog/post.update", ["id"=>$id]) :
route("blog/post.store")}}">
@csrf
@method(($type=="edit")? "patch" : "post")
<label for="title">標題:</label>
<input name="title" type="text" value="{{$title}}" id="title" />
<br/>
<label for="content">內容:</label>
<textarea cols="30" id="content" name="content" rows="10">{{$content}}</textarea>
<br/>
<input name="" type="submit" value="儲存"/>
</form>
@endsection
30天成爲Laravel萌新(第21天) - 資源控制器(Resource Controller) 中篇
現在,要正式把控制器與資料庫連結起來。順便偷埋之後兩個主題☻。
引入所需使用的套件
首先,得先把之前建立好的Model引入。另外,我們在偷偷引入一個Illuminate\Support\Facades\Log
。
use Illuminate\Support\Facades\Log;
use App\BlogPost;
use Parsedown;
完成CRUD操作
Create / Store
public function store(Request $request)
{
$title = $request->input("titile", "未命名文章");
$content = $request->input("content");
$post = new BlogPost;
$post->title = $title;
$post->content = $content;
$post->save();
Log::info("Store New Blog Post: id = $post->id");
return redirect()->action(
'Blog\PostController@show', ['id' => $post->id]
);
}
可以透過Request
的input
方法,取得POST來的資料,還可以補上預設參數。這邊取得標題與內容後,建立一個新的PostBlog
實體存入資料庫。
Read / Show
public function show($id){
$post = BlogPost::find($id);
if(! $post){
abort(404);
}
$content = $post->content;
{
$Parsedown = new Parsedown();
$content = $Parsedown->text($content);
}
return view("blog.post", [
"title" => $post->titile,
"content" => $content,
]);
}
讀取與之前控制器的內容差不多。不同的是,需要先從資料庫尋找資料,如果找不到就回傳404找不到錯誤頁面。之後會對該頁面進行修改。現在http://localhost/blog/post/12 將會顯示404錯誤頁面,只有http://localhost/blog/post/1 才會出現之前填入的內容。
30天成爲Laravel萌新(第20天) - 資源控制器(Resource Controller) 上篇
CRUD & RESTful
所謂CRUD是Create、Read、Update、Delete。昨天已經從資料庫模型(Model)的角度看過基本操作了,今天要將些操作加入到控制器(Controller)。
C | Create
R | Read
U | Update
D | Delete
另外,還需要另外知道的一件事情是RESTful。RESTful並不是硬性規定,只是一種在HTTP請求上的一種慣例設計。通常HTTP請求方法有GET
、POST
、PUT
、DELETE
、PATCH
,以及HEAD
、CONNECT
、OPTIONS
、TRACE
。以下節錄自MDN:
GET
GET 方法請求展示指定資源。使用 GET 的請求只應用於取得資料。
HEAD
HEAD 方法請求與 GET 方法相同的回應,但它沒有回應主體(response body)。
POST
POST 方法用於提交指定資源的實體,通常會改變伺服器的狀態或副作用(side effect)。
PUT
PUT 方法會取代指定資源所酬載請求(request payload)的所有表現。
DELETE
DELETE 方法會刪除指定資源.
CONNECT
CONNECT 方法會和指定資源標明的伺服器之間,建立隧道(tunnel)。
OPTIONS
OPTIONS 方法描述指定資源的溝通方法(communication option)。
TRACE
TRACE 方法會與指定資源標明的伺服器之間,執行迴路返回測試(loop-back test)。
PATCH
PATCH 方法套用指定資源的部份修改。
其實也就差不多對應了CRUD的操作:
CRUD | RESTful |
---|---|
Create | POST / PUT |
Read | GET |
Update | PATCH / PUT |
Delete | Delete |
30天成爲Laravel萌新(第19天) - Model的基本操作
ORM是物件關聯對映(Object Relational Mapping)。在Larvel裡提供的 Eloquent ORM能讓開發者以一個簡單、美觀的方式操作關聯式資料庫。今天就來寫一點點基本的操作,更多可以查看文件,以及Laravel資料庫相關文件。
Select All
在SQL,可能會用SELECT * FROM <TABLE>;
來取得所有資料,儘管在資料量龐大時,這樣操作並不好,但是Laravel同樣有對應的操作:
use \App\BlogPost
$posts = App\BlogPost::all();
foreach ($posts as $post) {
echo $post->title;
}
條件查詢Where
條件查詢也非常長使用到:
$post = App\BlogPost::where('id', 1)->get();
// ->orderBy('name', 'desc') // 還可以加以設定以下參數
// ->take(10)
// ->get();
用where
自然很容易從SQL轉換了解。不過,Laravel有更簡單的方式針對主鍵做查詢:
$post = App\BlogPost::find(1);
// 等同於
$post = App\BlogPost::where('active', 1)->first();
30天成爲Laravel萌新(第18天) - 建立Model
前幾天建立了Blog Post在資料庫的Schema,並且遷移(Migration)進資料庫,建立相關的資料表(blog_post)。為了讓Larave提供的ORM系統,以一個美觀、簡易的方式操作資料庫,還得建立BlogPost Model類別。
當然也可以使用artisan建立一個樣板:
artisan make:model BlogPost
然後會有app/BlogPost.php
的檔案
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class BlogPost extends Model
{
//
}
這次,只需要簡單改成下面的樣子就好:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class BlogPost extends Model
{
protected $table = "blog_post";
// protected $primaryKey = 'id';
// public $timestamps = false;
}
30天成爲Laravel萌新(第17天) - 資料庫管理工具(下)‧使用DBeaver
今天要在介紹一個,我用過後就喜歡上的資料庫管理工具–DBeaver。
DBeaver的兩個版本
DBeaver有社區版和企業版兩種。社區版可以免費使用,並且跨平台,透過JDBC支援多種資料庫。此外還會自動檢測資料庫版本,自動尋找相對應的Drive。
我手動配置過phpMyAdmin過。同樣直接下載安裝的情況下,DBeaver簡單好多。
DBeaver的界面很漂亮,我還蠻喜歡的。其中還有一個功能測試時非常好用–產生假資料。這個和前幾天亂數短文很像,不過DBeaver會針對欄位型態產生資料。資料庫測試的模擬數據生成(Mock Data Generation)也有一些限制,有些資料類型還是無法產生。
連線資料庫並填入資料
說了這麼多,相信已經下載安裝好了吧?該像昨天一樣,來連接資料庫,並塞入文章吧!
30天成爲Laravel萌新(第16天) - 資料庫管理工具(上)‧使用phpMyAdmin
今天,要用 phpMyAdmin 來看看昨天建立的資料表,我會順面補充一些之前做的設定。
查看Docker容器狀態
我會假設使用的是laradock,如果你使用的是XAMPP可能會簡單一些。
那麼,首先先看看運行的容器:
docker-compose ps
我們之前有啟動phpMyAdmin的服務,那麼輸出應該包含下面內容:
Name Command State Ports
---------------------------------------------------------------------------------------------------------------
laradock_phpmyadmin_1 /docker-entrypoint.sh apac ... Up 0.0.0.0:8080->80/tcp
其中注意到 Ports 的部份,這意思是綁定(bind)電腦8080端口到容器的80端口。所以我們可以透過瀏覽 http://localhost:8080 來使用phpMyAdmin。
登入phpMyAdmin
這裡伺服器要輸入mariadb
,帳號和密碼分別是:default
和secret
。如果你是啟用MySQL的話,伺服器就改成mysql
。
30天成爲Laravel萌新(第15天) - 建立資料庫Migration
要把文章存入資料庫?那麼對於傳統關聯式資料庫,需要先建立資料表Schema。你可以透過明天要介紹的資料庫管理工具,也可以透過今天來來說的使用 Artisan 建立資料表。
使用Artisan建立資料表
Artisan可以快速的建立控制器基本模板,同樣也可以建立資料庫相關模板:
artisan make:migration create_blog_post_table
透過上面命令,會在database/migrations
新增相關檔案,檔名由<日期><時間>_create_blog_post_table
組成。前面時間相關的在某些情況下會很重要,後面介紹的 artiasn 命令會依序建立資料表,所以如果資料表有相互依賴就有影像。現在我們開啟該檔案看看:
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateBlogPostTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('blog_post', function (Blueprint $table) {
$table->bigIncrements('id');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('blog_post');
}
}
其中最重要兩行:
$table->bigIncrements('id');
$table->timestamps();
30天成爲Laravel萌新(第14天) - 控制器(Controller)
回頭看看,看,怎麼Route的內容變得這麼長阿!仔細一看,還做了路由以外的事情,像是修改變數內容等等。是不是該把Hangle Function獨立出來?有什麼辦法?Laravel的控制器(Controller)可以幫助。
新增Controller
我們可以透過Artisan來快速新增一個標準的控制器(Controller):
artisan make:controller Blog/ExamplePostController
在app/Http/Controllers/Blog
資料夾下會多一個ExamplePostController.php
的檔案,內容大致如下:
<?php
namespace App\Http\Controllers\Blog;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class ExamplePostController extends Controller
{
//
}
Blog
這個新建立的資料夾,實際對應於昨日group
路由當中的'namespace' => 'Blog'
參數。並且在上面生成的程式中use App\Http\Controllers\Controller;
,也是因為這個新建立的模組是在App\Http\Controllers\Blog
底下的命名空間,因此要引入使用App\Http\Controllers\Controller
。關於PHP的模組系統,就不多做解釋了,只是相關的Blog
字串如不想使用,要做相對應的調整。
之後會改用資源控制器。這邊單純要做個對照,之後可以刪除不使用。
30天成爲Laravel萌新(第13天)- 簡易Blog頁面(下)
昨天利用亂數文章(Lorem ipsum)產生了@section('body')
的預設內容。今天,要在Route把變數$content
設成類似的亂數文章。
中文亂數文章
Lorem最多的資源大多還是英文,不過中文也有不少資源可以使用。此外,有些情況使用設計好的預設文字可能會更適合。今天,就只是想來用用而已XD。透過亂數假文產生器 Chinese Lorem Ipsum可以產生中文亂數文章,也可以用於產生標題。現在來簡單的把$title
設成日的及度加機子魚年
。$content
設成:
身主一?是字對一日國地包最中感行物評民活於力!進上城大、很會英我:的樣基覺型家海當期是著:算像系大心樣十因天特企以加想點以後許,念落是客我什在白實文種運明市下只能當作力美間要速包企以統推多,收什火投,顧外。
指的司之身鄉然說小人發,我雜人轉英臺區實說麼後男會友大,阿產效第續明造識竟自沒大上有。到全藝地港為精件連需,過聯排可然更友我後們時?一風了組麼兒比、方來出科!車卻讀力風人父資國個年愛成故作自功:原用中有、港看車我高心打!親北受活女微特利動果的無何片經物……象巴約得?色時值壓五……過點子得提圖陽可計,來麼室拉的合天!人觀難一手樹以防黃精也需被那部我冷不不連痛以哥多人事營件、目熱而夫加……紀味曾蘭不好空農後電題熱頭國:戲識者是相大覺光,雙命影心可那?前區孩增,物時。
產明物力區有王真?院見很原,經總萬官方,生回。
海在康代界積實兒變:她哥出邊。善快寶,死面大,紀著資小成去資戲面和的發行的止的接來,南生不能野:政生企性班們教求給學就得受再球也生克決的金長冷成。
標題、文章內容當然還無意義wwww
調整排版
恩~沒分段了?這是因為HTML會忽略空白,如過要換行還需要使用<br/>
。當然你可以在變數內容這麼加,然後在模板將顯示的部份改為{!! $content !!}
,或是也可以用<pre>
來做,像是把@section('body')
改成:
@section('body')
<h1>{{$title}}</h1>
<pre>{{$content}}</pre>
@endsection
30天成爲Laravel萌新(第12天)- 簡易Blog頁面(上)
今天要來建立一個部落格文章的極簡陋顯示頁面。
建立路由
在routes/web.php
檔案中添加以下內容:
Route::group(['prefix' => 'blog',
'as' => 'blog/',
'namespace' => 'Blog', ],
function(){
Route::get('/post/{post_id}', function($post_id){
$title = "Example Title";
$content = "Example Content";
return view('blog.post', [
"title" => $title,
'content' => $content,
]);
});
});
儘管其實完全不需要用到group
,不過未來可以像其他blog系統一樣,除了有文章頁面(post),還可以有其他獨立頁面(page)。另外,添加blog的前綴,可以將其他前綴用於其他作用,或是最後在做個轉址。總之,先選了個靈活的寫法。
其中,好好注意$title
和$content
這兩個參數,這兩個參數隨後會在多次變動修改,今天主要先把頁面顯示出來。
部落格文章頁面模板
接者建立resources/views/blog/post.blade.php
檔案(當然需要先建立resources/views/blog
資料夾)。並且上頭原本路由區用的view也可以寫為blog/post
。將這份檔案簡單填入以下內容:
@extends("base",['title'=>$title]) {{-- 第二個參數可以傳遞變數給父模板,但是父模板改用插槽方式,須改用以下方式 --}}
@section('title', $title)
@section('body')
<h1>{{$title}}</h1>
{{$content}}
@endsection
這個頁面模板繼承了基礎頁面(base
),並填入頁面內容。不過,還沒有基礎也面阿?現在來建立resources/views/base.blade.php
,並寫下以下內容:
30天成爲Laravel萌新(第11天) - 路由&頁面模板(4)
使用Artisan顯示目前路由狀態
首先,先來說說怎麼看目前路由狀態。透過artisan route:list
列出目前路由狀態:
+--------+----------------------------------------+--------------+------+---------+--------------+
| Domain | Method | URI | Name | Action | Middleware |
+--------+----------------------------------------+--------------+------+---------+--------------+
| | GET|HEAD | / | | Closure | web |
| | GET|HEAD | api/user | | Closure | api,auth:api |
| | GET|HEAD | hello | | Closure | web |
| | GET|HEAD|POST|PUT|PATCH|DELETE|OPTIONS | hello-world | | Closure | web |
| | GET|HEAD | hello/{name} | | Closure | web |
+--------+----------------------------------------+--------------+------+---------+--------------+
首先要注意到的是Method
和URI
,這也是在定義路由最基礎的部份,URL
在路由定義時就稱作PATH
。我們還可以將路由命名(Name
);至於Action
與以後會提到的控制器(Controller
)有關,這裡顯示Closure
表示路由由handler function
處理請求;最後Middleware
預計本系列文章不會提到,又興趣可以去看官方文件。
api/user
定義在routes/api.php
中。
基礎路由方法
基本路由方法有:
Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);
基本上就對應了REST的GET
、POST
、PUT
、PATCH
、DELETE
、OPTIONS
的請求方法。此外還可以透過Route::any($uri, $callback);
來直接處理請求,而不管請求方法;或是使用Route::match([$method,...], $uri, $callback);
來處理特定請求方法。
※ 請求方法 是HTTP請求裡頭的一個欄位:METHOD。
30天成爲Laravel萌新(第10天) - 路由&頁面模板(3)
回去看了一下文件,才發現之前有好多沒用到過 畢竟只學了2周的時間。不過有些設計挺有趣的。
今天來看一下Blade模板語言中的一些(我覺得)重要的功能。
印出變數
昨天已經看過怎麼顯示變數了,使用{{$variable}}
。今天要特提的是:怎麼給變數一個預設值。
{{isset($variable) ? $variable : "Default Value"}}
{{ $variable or 'Default' }}
不過在5.8、6.x以後似乎改成這樣:
{{$variable ?? 'Default'}}
我不清楚爲什麼把這麼方便的功能給去除掉了。 6.x之後的用法並沒有在官網的文件特別提,會發現單純是範例中有類似程式碼。
上面其實還相當於
@isset ($variable)
{{$variable}}
@else
Default
@endisset
另外還有@empty
@empty($variable)
Default
@else
{{$variable}}
@endempty
30天成爲Laravel萌新(第9天) - 路由&頁面模板(2)
繼續昨天
Route::get('/hello/{name}', function ($name) {
return '<h1>Hello, '.$name.'</h1>';
});
透過路徑接受了參數傳了進來,再加以加工輸出回去。不過這麼寫不怎麼美觀, 因為這違反了 「 只做一件事情 」的原則,不但處理了路由請求,還傳遞參數並渲染頁面。
今天透過模板系統,要來把路由請求處理與頁面設計分離。
首先,把上面程式修改為以下內容
Route::get('/hello/{name}', function ($name) {
return view("hello-name", [
"name" => $name,
]);
});
接著在新增一個模板檔案resources/views/hello-name.blade.php
<h1>Hello, {{$name}}</h1>
然後瀏覽http://localhost/hello/Daniel 看看,應該與之前畫面並無差異。
30天成爲Laravel萌新(第8天) - 路由&頁面模板(1)
接下來幾天,會交叉介紹路由(Route)和頁面模板(View/Blade)。幾經思考,這兩者關係十分密切,不太好單獨撰寫。
關於路由(Route),我們曾經在第六天短暫看到過。
<?php
Route::get('/', function () {
return '<h1>Hello</h1>';
});
現在我們看看routes
資料裡面的內容:
- api.php
- channels.php
- console.php
- web.php
我們修改的是web.php
的內容,這也是最主要訂立路由的檔案。api.php
的檔案實際上也不太有差別,不過api.php
底下定義的路由,預設會前置增加api/
的前綴,是設計用於提供HTTP API路由定義的檔案。
瀏覽 http://localhost/ 以後,就會顯示Hello World,如果你嘗試右鍵瀏覽網頁原始碼(view-source:http://localhost/)就會看到<h1>Hello</h1>
。
在回頭看看網址,除了localhost
外,後面的就是路徑/
,認知道這個斜線是很重要的,因為Apache2和Nginx對於結尾斜線的認知有些不同。接著再在wep.php
增加以下入由看看:
30天成爲Laravel萌新(第7天) - 認識artisan
Laravel有「 為網頁藝術家創造的框架 」的美譽,他的工具名字也很有意思 artisan ,意為 工匠 ,與藝術家(artist)一樣,是與藝術(art)有關的字。
artisan 可以用來顯示路由狀態、遷移資料庫、產生基本樣板程式碼、調整文件結構狀態等等。而且之前已經看過,就是我們用來產生專案文件密鑰(key)的artisan key:generate
。
不過,如果使用laradock
進入workspace
的docker容器的話,可能會找不著指令。artisan
詳細使用方式,會在未來有需要時在做說明,今天,就先來簡單看一下。
如果使用laradock
進入workspace
的docker容器的話,找不著指令嗎? 透過下面命令切換到/var/www
目錄下在試試。
cd /var/www
列出所有artisan子命令
不同版本的artisan
有可能存在使用差異。今天主要說明怎麼快速了解指令如何使用。
首先先學著者麼列出所有能使用的工具:
artisan
或是
artisan list
30天成爲Laravel萌新(第6天) - 配置專案
在前三天已經安裝好Laravel的基本環境。今天算是一個分水嶺,不管你採用哪種方式建立開發環境,都應該已經得到一個預設好的Laravel工作目錄。在此我不會解釋目錄結構,有興趣可以自行參閱文檔。不過是先留意一下幾個文件與目錄:
- artisan
- config/
- database/
- public/
- resources/
- routes/
- storage/
之後有用到會在加以說明。而今天,首先要進行專案的配置,也就是設定(config/)。沒錯,目錄 config 就是儲存相關配置的目錄。不過在此,我們還得先編輯 .env 檔案。你可能會找不著這份檔案,別擔心,目錄下有個 .env.example ,將其複製並重新命名即可。
接著我們找到以下內容:
APP_DEBUG=true
APP_URL=http://localhost
LOG_CHANNEL=stack
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret
目前最爲重要的是關於APP和DB的設定。在發佈階段,APP_URL
會需要調整,不過我們之後在說說。而目前預設情況僅有自己的電腦能夠瀏覽。其次是APP_DEBG
,在發佈階段需要改為false
。 此外,還會注意到一個APP_KEY
的設定,如果其為空,請執行以下命令:
php artisan key:generate
接着是資料庫的設定,這裏需要改成資料庫的連結設定。如果使用MariaDB和MySQL,維持mysql
就好。(新版本的MariaDB可能有問題)
30天成爲Laravel萌新(第5天) - Laradock的工作空間容器
在開始配置Laravel的環境設定檔案之前(.env
),先來帶大伙看看laradocke最
重要的一個容器workspace
。
關於workspace容器
workspace是laradock連結各個容器的重要容器,還記得我們昨天這麼做嗎:
docker-compose exec workspace composer create-project --prefer-dist laravel/laravel tutorial_blog 5.8.*
docker-compose exec
的格式是docker-compose exec <CONTAINER> <COMMAND>
。可是,可沒有吧workspace
啟動(up
)起來呀!我們像下面啟動了nginx
、mariaDB
、phpmyadmin
而已阿。
docker-compose up -d nginx mariadb phpmyadmin
是的,laradock會自動啟動workspace
這個容器。並且注意到後面的COMMAND
實際就是在第2天用來初始話laravel專案的命令。在下完這的命令以後,會在原本建立的 laravel-tutorial 目錄下多一個 tutorial_blog 目錄。並且裡面有基本Laravel的環境。我們會在幾天後來設定這個環境,現在,來我們專注於 workspace 這個容器。
我們同用用docker-compose exec
來進到 workspace 容器裡面。
docker-compose exec -u laradock workspace /bin/bash
或是用docker exec
來進到裡頭。不過使用docker exec
你還會需要知道真正的容器名字。所以命令可能像是下面這樣:
docker exec -it -u laradock laradock_workspace_1 /bin/bash
我們使用 laradock 登入workspace容器(-u/--user
)。laradock 預設用於開發的使用者帳號,如果不加上這個選項,會使用最高管理權限登入(root)。透過使用這個帳號登入,未來可能可以省去一些不必要的麻煩(ex:宿主機和虛擬機掛載目錄的權限問題)。
30天成爲Laravel萌新(第4天) - 使用laradock建立開發環境(下)
建立專案目錄
本次專案目錄預計會有以下內容:
- laravel-tutorial
- laradock
- .laradock
- tutorial_blog
laradock 和 .laradock 先不管他們。先建立 laravel-tutorial 目錄,並在該目錄鍵入:
git clone https://github.com/Laradock/laradock.git
cd laradock
git checkout v7.15
以上會安裝laradock,並切換到7.15版本。
設定laradock
在建立服務容器前,要先做設定。
首先, 複製 env-example 為 .env,然後找到以下設定並變更:
APP_CODE_PATH_HOST=../tutorial_blog
...
...
...
DATA_PATH_HOST=../.laradock/data
APP_CODE_PATH_HOST
指定專案目錄(下一步驟建立),DATA_PATH_HOST
則是未來資料儲存的位置,包含資料庫儲存位置。
接着建立並啓動環境:
30天成爲Laravel萌新(第3天) - 使用laradock建立開發環境(上)
除了使用composer
以外,還可以使用 laradock 、Homestead、Valet、Laragon。Homestead是基於 Vagrant ,如果您已安裝VirtualBox,可以使用看看。而接下來說明laradock的使用方式。
Laradock 環境需求
laradock是基於docker的一個快速建立laravel的開發環境工具,理所當然的你會需要docker,此外你還會需要 docker-compose,以下列出範例使用的版本:
軟體 | 版本 |
---|---|
docker | 18.09 |
docker-compose | 1.25 |
git | 2.7.4 |
透過使用laradock,可以很快速的在Apache2、Nginx;MySQL、MariaDB;甚至是在PHP不同版本之間做切換。
30天成爲Laravel萌新(第2天) - 安装 Laravel
環境需求
這不是全部強制的,只是接下來一個月的時間,會以以下環境為範例:
軟體 | 版本 |
---|---|
Laravel | 5.8.18 |
Nginx | 1.14.0 |
MariaDB | 10.3.15 |
PHP | 7.2.19 |
如同前言所說,雖然Laravel已經釋出6.0版,但接下來將會以5.8為主。此外,也可以使用Apache網頁伺服器,儘管有些設定不同;至於資料庫也可以使用MySQL。並且,以上也都不是強制的,Laravel對於多個網頁伺服器、資料庫接受度良好,所以當然也可以使用PostgreSQL和其他支援PHP的網頁伺服器。
(雖然上面這樣列出,不過最後有可能會用Apache+MySQL再測試一次)
使用XAMPP
明天,我會介紹另外一個快速建置環境的方式,我會更推薦使用該方式。
如果你是Windows,可以直接安裝XAMPP,只是在之後如果遇到問題,請注意一下各個組件的版本。更多可以參考XAMPP的網站。
安裝Laravel
Composer是PHP的一個包管理器,儘管不是必要的,不過可以大量簡化Laravel的安裝程序,並且也可以加以安裝其他組件。因此,需要先確定Composer已經安裝好,並設定好環境。你可以透過 命令提示字元 或其他 Shell 的環境輸入composer -V
,正確安裝完會顯示版本資訊。
安裝Laravel:
composer global require laravel/installer
30天成爲Laravel萌新(第1天) - 認識Laravel
原本,我是想寫下Laravel的介紹,但是…可能有些單調。因為有些經驗實在是 不太多,就算是看別人寫的關於Laravel的特色,和過往PHP開發到底又怎樣差異, 也還是對我而言有些無感。因此決定從我自身角度來介紹Laravel。
Laravel又被人稱為 為網頁藝術家創造的框架 。那是因為,相較於以前PHP 將頁面資料與邏輯代碼混合寫在一起的 義大利麵寫法 , Laravel是類似 Django這樣廣義的MVC框架。也就是將頁面資料與邏輯代碼分開。
那摸到底為神ㄇ要用Laravel? 我簡單列出以下以點:
- 首先,PHP還沒有死亡。實際上PHP在許多地方還是可以看的到。著名的 WordPress、Drupal都是用PHP寫的。在許多與網頁相關應用方面,PHP成熟且 易用,這也讓使用PHP多了一個理由。過去寫過很短的PHP還活 著 可以去參考一下wwww。
- 相比WordPress的易用、易上手,Laravel提供更高度的彈性。
- 遵守Laravel一些基本的開發原則,原始碼更容易維護。(就是有些人一樣能 寫成義大利麵….)
- Laravel提供多個極為好用的基本可選用功能。包含身份驗證、資料驗證、資 料庫分離、ORM、資源控制器、上傳等等等。
30天成爲Laravel萌新(第0天) - 前言
今年有一段時間,短暫的1~2周,因為一些原因學習了Laravel,這次我事後的學習筆記。
Laravel是一個流行的PHP開發框架。不同於熱門的Drupal、WordPress.org, Laravel更像是Node.js的Express.js、Python的Django等等廣義的MVC框架。當然,他也可以快速的發展成CMS。
Laravel目前也發展到6.0,不過接下來幾天的內容會以5.8為主。Laravel也有完整的開發文檔。儘管有些翻譯仍然不完全,但也有多種語言的翻譯。首先,介紹一些學習資源:
- Laravel 官方網站
- Laravel.tw 中文站 文檔最新只到5.3版本
- Laravel中文學院
預計未來內容撰寫的方向:
- 關於Laravel
- 建立Laravel開發環境
- 使用Composer安装
- 使用laradock建立環境
- 認識artisan
- Route - MVC
- 會員系統
- Template
- Controller
- 文章資料庫 - Database Schema
- 商品資料庫 - 驗證資料
- 上傳檔案
- API