# 前言
學習一個框架, Ray 的想法是, 在深入理解底層實作的原理之前, 應該先知道這個框架的 使用方法
; 先學習怎麼使用這個前人造的輪子, 再學習怎麼樣造一個輪子。
所以本篇文章重點在於細讀官方文件, 並將內容理解後以 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
留言