Ray Lee | 李宗叡
Learn or Die
Published in
9 min readJan 5, 2021

--

Photo by Guilherme Vasconcelos on Unsplash

# 版本

Laravel 8.x

# 前言

我喜歡使用 Laravel 開發的感覺, 除了開發快速, 程式碼簡潔且優雅之外, Laravel 框架本身也是一個很好的學習參照物。 本篇主要將官方文件重點整理成 Q&A 的形式呈現, 原子化的概念, 這方式並不適用於每個人, 但若對你有幫助, 我會很開心。

# 目錄

Laravel — 官方文件原子化翻譯 — 目錄

# 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

--

--

Ray Lee | 李宗叡
Learn or Die

It's Ray. I do both backend and frontend, but more focus on backend. I like coding, and would like to see the whole picture of a product.