在前面的兩篇文章裡,我一步一步介紹了 Laravel Nova 的一些特性,這裡我將針對第二篇文章新建的那個 CRM 做一些改進。
在本教程中,我們將瞭解如何使用 Nova 的操作(Action)和授權。
開始
如果您是 Nova 的新手,我建議您檢視下我以前的文章,我詳細解釋瞭如何在您的機器上安裝和設定 Nova。 在本教程中,我將假設我們在一個新的 Laravel 專案中安裝了 Nova。 所以,你應該能夠登入並看到下面這個圖片:
優化一些CSS樣式
上一篇文章的首頁介面有點醜陋,我這裡增加一點CSS樣式,讓他好看點。
<!doctype html>
<html lang="{{ app()->getLocale() }}">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Nova CRM Demo</title>
<!-- Fonts -->
<link href="https://fonts.googleapis.com/css?family=Nunito:200,600" rel="stylesheet" type="text/css">
<!-- Styles -->
<link href="https://cdn.jsdelivr.net/npm/tailwindcss/dist/tailwind.min.css" rel="stylesheet">
<title>Nova CRM 演示</title>
</head>
<body>
<div class="flex flex-col items-center justify-center md:h-screen md:bg-blue-lightest">
<form class="w-full max-w-md bg-white rounded p-10 md:shadow" action="/form-submit" method="POST">
<h1 class="text-grey-darkest mb-8 text-center">註冊我們的Nova程式</h1>
{{ csrf_field() }}
<div class="flex flex-wrap -mx-3 mb-6">
<label class="block uppercase tracking-wide text-grey-darker text-xs font-bold mb-2" for="name">姓名:</label>
<input class="appearance-none block w-full bg-grey-lighter text-grey-darker border rounded py-3 px-4 leading-tight focus:outline-none focus:bg-white {{ $errors->has('name') ? 'border-red mb-3' : 'border-grey-lighter' }} id="name" name="name" type="text" placeholder="Lei">
</div>
<div>
<div class="flex flex-wrap -mx-3 mb-6">
<label class="block uppercase tracking-wide text-grey-darker text-xs font-bold mb-2" for="email">
郵箱
</label>
<input class="appearance-none block w-full bg-grey-lighter text-grey-darker border rounded py-3 px-4 leading-tight focus:outline-none focus:bg-white focus:border-grey {{ $errors->has('email') ? 'border-red mb-3' : 'border-grey-lighter' }}" id="email" name="email" type="email" placeholder="lei@example.com">
@if($errors->has('email'))
<p class="text-red text-xs italic">{{ $errors->first('email') }}</p>
@endif
</div>
</div>
<button class="block bg-blue px-6 py-4 text-white rounded mx-auto hover:bg-blue-dark" type="submit">提交</button>
</form>
@if (session('form-success'))
<div class="bg-green mt-8 p-6 rounded shadow">
<p class="text-white">{{ session('form-success') }}</p>
</div>
@endif
</div>
</body>
</html>
更改後的樣式
Actions
對於我們的CRM,如果我們可以直接從索引頁面更新我們的潛在客戶狀態,那就太棒了。 這樣,我們的銷售團隊可以在他們打銷售電話時快速管理潛在客戶。
首先,我們將使用Nova cli生成器使用以下命令為我們啟動Action。
php artisan nova:action UpdateVisitorStatus
找到app\Nova\Actions 資料夾下面的 UpdateVisitorStatus.php檔案,你可以看到兩個方法,一個handle 一個 fields 方法。
讓我們首先定義我們的fields(),這樣我們就可以在handle()中使用它們。 在我們的這個例子中,我們想詢問使用者他們希望訪客擁有哪種狀態。 為此,我們可以使用我們在Visitor Resource中使用的相同程式碼。
public function fields()
{
return [
Select::make('Status')
->options(\App\Visitor::getStatuses()),
];
}
注意引入:
use Laravel\Nova\Fields\Select;
現在,我們可以接收使用者的狀態選擇,我們可以編寫我們的handle()方法。
public function handle(ActionFields $fields, Collection $models)
{
foreach ($models as $model) {
$model->status = $fields->status;
$model->save();
}
}
到上面我們的Action就完成了,現在在Visitor Resource裡面註冊。
public function actions(Request $request)
{
return [
new Actions\UpdateVisitorStatus,
];
}
Action
如果你這裡沒有顯示的話,請記住選中任意一條記錄,你不選中是不會顯示的。
另外:下面的兩個引數可以控制Action顯示在首頁還是在詳情頁。
public $onlyOnIndex = true;
public $onlyOnDetail = true;
詳情頁的Action
授權
確保使用者只能與他們有權訪問的功能進行互動是一件大事。 在過去的專案中,這個處理起來很麻煩,不過幸運的是,Nova實現起來輕而易舉。
我們的這個CRM,由於是我們團隊使用的內部工具,因此我們沒有大量的訪問問題需要處理。 所以我們只要確保我們的管理員使用者才能刪除潛在客戶,使用者和標籤。
首先,我們要給使用者模型建立一個isAdmin的方法。
當然我這裡是採用硬編碼的方式來處理,你可以儲存到資料庫裡,也可以用一個許可權包來處理。
public function isAdmin()
{
$admin_emails = [
'rennesusher@gmail.com'
];
return in_array($this->email, $admin_emails);
}
把上面的郵箱換成你的管理員郵箱。
對了,這裡提一下,Nova是開箱即用,它有Laravel的policy功能,你不明白的話去翻文件吧。
php artisan make:policy UserPolicy -m User
php artisan make:policy VisitorPolicy -m Visitor
php artisan make:policy NotePolicy -m Note
在 AuthServiceProvider.php 檔案中註冊。
protected $policies = [
'App\User' => 'App\Policies\UserPolicy',
'App\Visitor' => 'App\Policies\VisitorPolicy',
'App\Note' => 'App\Policies\NotePolicy',
];
通過註冊策略,我們可以執行所有預先生成的方法並定義我們的訪問邏輯。
public function view(User $user, <model> $model)
{
return true;
}
public function create(User $user)
{
return true;
}
public function update(User $user, <model> $model)
{
return true;
}
public function delete(User $user, <model> $model)
{
return $user->isAdmin();
}
public function restore(User $user, <model> $model)
{
return $user->isAdmin();
}
public function forceDelete(User $user, <model> $model)
{
return $user->isAdmin();
}
注意上面的對應的就是我們新建的3個policy。
換一個非管理員登入下nova後臺,你可以看到刪除什麼按鈕都消失了。
沒有刪除選項了
完結
好了,關於nova的三篇文章都結束了,歡迎提意見。
專案原始碼地址:https://github.com/leienshu/learn-nova
提前祝大家新春快樂!