Published in
9 min readJan 5, 2021
# 版本
# 前言
我喜歡使用 Laravel 開發的感覺, 除了開發快速, 程式碼簡潔且優雅之外, Laravel 框架本身也是一個很好的學習參照物。 本篇主要將官方文件重點整理成 Q&A 的形式呈現, 原子化的概念, 這方式並不適用於每個人, 但若對你有幫助, 我會很開心。
# 目錄
# Creating & Rendering Views
以下的 Laravel example code 的意思是?
- Example:
<?php
Route::get('/', function () {
return view('greeting', ['name' => 'James']);
});
- Answer: return 定義好的 view, 定義於
resources/views
資料夾下, 帶著 variable$name = 'James'
以下的 Laravel example code 的意思是?
- Example:
<?php
use Illuminate\Support\Facades\View;
return View::make('greeting', ['name' => 'James']);
- Answer: 使用 View facade, return 定義好的 view, 定義於
resources/views
資料夾下, 帶著 variable$name = 'James'
# Nested View Directories
以下的 Laravel example code 的意思是?
- Example:
<?php
return view('admin.profile', $data);
- Answer: return view, view 的 location 為
/resources/views/admin/profile
, 並帶著 $data 過去, $data 為一個 array
# Creating The First Available View
以下的 Laravel example code 的意思是?
- Example:
<?php
use Illuminate\Support\Facades\View;
return View::first(['custom.admin', 'admin'], $data);
- Answer: return first() 的 arg1 array 中的 first existing view, 並帶入 $data
# Determining If A View Exists
以下的 Laravel example code 的意思是?
- Example:
<?php
use Illuminate\Support\Facades\View;
if (View::exists('emails.customer')) {
//
}
- Answer: 判斷
resources/views/emails/customer
view 是否存在
# Passing Data To Views
以下的 Laravel example code 的意思是?
- Example:
<?php
return view('greetings', ['name' => 'Victoria']);
// on view page
<?php echo $name; ?>
- Answer: 將
$name = 'Victoria'
傳到 view, 所以在 view page 可以 access$name
以下的 Laravel example code 的意思是?
- Example:
<?php
return view('greeting')
->with('name', 'Victoria')
->with('occupation', 'Astronaut');
- Answer: 將
$name = 'Victoria', $occupation = 'Astronaut'
pass 給 view, 所以在 view page 可以存取$name, $occupation
# Sharing Data With All Views
以下的 Laravel example code 的意思是?
- Example:
<?php
namespace App\Providers;
use Illuminate\Support\Facades\View;
class AppServiceProvider extends ServiceProvider
{
public function register()
{
//
}
public function boot()
{
View::share('key', 'value');
}
}
- Answer: 在
AppServiceProvider
的 boot(), 使用View::share()
, 可以將註冊的 data share 到所有的 views, 註冊後所有的 views 都可以存取key
# View Composers
以下的 Laravel example code 的意思是?
- Example:
<?php
// 在自己建立的 ViewServiceProvider
namespace App\Providers;
use App\Http\View\Composers\ProfileComposer;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
class ViewServiceProvider extends ServiceProvider
{
public function register()
{
//
}
public function boot()
{
View::composer('profile', ProfileComposer::class);
View::composer('dashboard', function ($view) {
//
});
}
}
// ProfileComposer
namespace App\Http\View\Composers;
use App\Repositories\UserRepository;
use Illuminate\View\View;
class ProfileComposer
{
protected $users;
public function __construct(UserRepository $users)
{
// Dependencies automatically resolved by service container...
$this->users = $users;
}
public function compose(View $view)
{
$view->with('count', $this->users->count());
}
}
- Answer: 在自己建立的 ViewServiceProvider 的 boot() 針對特定的 view 註冊 view composer, 並且定義 view composer, 該 view page 在 render 時會執行 view composer, 在此 example 中, profile view page 在 render 時會執行 ProfileComposer, 因此 profile view page render 後可在該頁面存取
$count = $users->count()
資料 建立 ViewServiceProvider 後, 需要到config/app.php
, 加 ViewServiceProvider 加到providers
array
# Attaching A Composer To Multiple Views
以下的 Laravel example code 的意思是?
- Example:
<?php
use App\Http\Views\Composers\MultiComposer;
View::composer(
['profile', 'dashboard'],
MultiComposer::class
);
- Answer: 可以將 view composer 附加到多個 view 上
以下的 Laravel example code 的意思是?
- Example:
<?php
View::composer('*', function ($view) {
//
});
- Answer: 可將 view composer 附加到所有的 view 上
# View Creators
以下的 Laravel example code 的意思是?
- Example:
<?php
use App\Http\View\Creators\ProfileCreator;
use Illuminate\Support\Facades\View;
View::creator('profile', ProfileCreator::class);
- Answer: 註冊 view creator, 效果跟 view composer 差不多, 差別在於 creator 在 instantiate 時就執行, composer 會在 render 時才執行, 具體的差別在於, 當使用 creator 時, 可在 controller overwrite creator 定義的 variable, 而 composer 則不行
# Optimizing Views
以下的 Laravel example code 的意思是?
- Example:
<?php
php artisan view:cache
php artisan view:clear
- Answer: Laravel 在每次 request 都會檢查並 compile blade view, 這對效能會有負面影響, 可將之 cache 住以避免每次都 compile, 當然, 若是修改了 code 之後, 也要 clear 並重新 cache