-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
prohorry-me
committed
Aug 12, 2018
1 parent
2d629f0
commit 6016a2b
Showing
1 changed file
with
123 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,123 @@ | ||
# 处理之前的逻辑: | ||
> 站长和管理员不应该有能申请开店和权限,因为他们能自己审核自己申请开的门店,用 Policy 禁止这两种身份的用户访问 StoresController@create 和 StoresController@store 方法。 | ||
* 这里因为只设计用户的身份,所以直接在 UserPolicy 中定义权限认证方法 | ||
``` | ||
/** | ||
* 禁止已经登陆用户中的管理员以上级别的用户创建自己的门店 | ||
*/ | ||
public function createStore(User $currentUser, User $user) | ||
{ | ||
return $currentUser->level < 2 && !$currentUser->can('manage_stroes'); | ||
} | ||
``` | ||
> 这里已登陆的用户是用 `auth` 中间件确保的,并且这个 Policy 已经在 AuthServiceProvider 中注册,直接在控制器层调用即可: `$this->authorize('createStore', Auth::user());` 。 | ||
* 创建 ../layouts/footer.blade.php 给增加一个申请开店的入口链接(暂时没管样式) | ||
|
||
# 完成商店后台部署 | ||
1. 配置路由 `Route::get('/stores/admin', 'StoresController@admin')->name('stores.admin');` | ||
2. 完成 StoresController@admin 方法 | ||
``` | ||
public function admin() | ||
{ | ||
// 获取当前用户旗下的门店 | ||
$store = Auth::user()->stores()->first(); | ||
// 跳转到后台 | ||
return view('stores.admin', compact('store')); | ||
} | ||
``` | ||
> 这里再回头修正一个逻辑:虽然绑定了1:n的关系,但是我们还是要求一个用户只能开一个门店。因此编辑 StoresController@create 和 StoresController@store,在验证权限后,都加上这一句:如果有门店,再点击申请看点,直接跳到自己的后台管理。 | ||
``` | ||
$check = Auth::user()->hasStore(); | ||
if($check) { | ||
return redirect()->route('stores.admin'); | ||
} | ||
``` | ||
* 关于 hasStore 方法:定义在 User 模型中 | ||
``` | ||
/** | ||
* 判断用户是否有门店了 | ||
*/ | ||
public function hasStore() | ||
{ | ||
$flag = $this->stores->first(); | ||
if($flag) { | ||
return true; | ||
} | ||
return false; | ||
} | ||
``` | ||
* 后台模板略。(暂时就做一个首页展示门店信息的效果) | ||
``` | ||
# 后台有以下模板 | ||
1. admin -> 后台整体框架 | ||
2. admin_index -> 后台首页,显示门店信息 | ||
3. admin_edit -> 后台编辑页 | ||
4. admin_goods -> 后台商品管理页 | ||
5. admin_orders -> 后台订单管理页 | ||
``` | ||
|
||
# 用 hieu-le/active 判断路由,激活按钮样式,挂在不同的页面 | ||
* 安装 `composer require "hieu-le/active:~3.5"` | ||
* 扩展包提供一下全局函数 | ||
``` | ||
active_class(BOOLEAN, 样式名1='默认active', 样式名2='默认为空字符串'); | ||
// 最常用:判断第一个参数,第一个参数为真,用样式1,否则,用样式2。 | ||
// 这个方法位于 vendor/hieu-le/active/src/Facades/helpers.php 中 | ||
// 因为默认为 'active' 所以如果用 bootstrap337 作为前端 ui 框架,那么就不用给这个函数后面的参数了。 | ||
/* 一下这些方法常常作为上面函数的第一参数,返回值都是布尔 */ | ||
if_route('路由名称') // 判断当前路由的路由名称 | ||
if_route_param('参数名', 值) // 判断当前路由的隐性参数是否等于给的值 | ||
if_query('参数名', 值) // 判断当前路由的参数(这里的参数是说:网站?参数名=值,就是判断问号后面的那个) | ||
``` | ||
|
||
# 权限控制 | ||
* 新建权限策略类 `php artisan make:policy StorePolicy --model=Store`, 编辑 | ||
``` | ||
/** | ||
* 后台访问权限 | ||
*/ | ||
public function view(User $user, Store $store) | ||
{ | ||
return $user->level === 1 && $user->can('manage_goods'); | ||
} | ||
/** | ||
* 更新资料权限 | ||
*/ | ||
public function update(User $user, Store $store) | ||
{ | ||
return $user->id === $store->user_id; | ||
} | ||
/** | ||
* 删除权限 | ||
*/ | ||
public function delete(User $user, Store $store) | ||
{ | ||
return $user->id === $store->user_id || ($user->level > 1 && $user->can('manage_stores')); | ||
} | ||
``` | ||
> 这里需要注意 Policy 中的每个方法都需要2个参数:第一个 $user 是当前用户,不用我们传,第二个是当前模型的实例,即使你不用它,也需要在形参中声明,在实参中赋值:因为这样它才能确定你调用的是针对哪个模型的 Policy 中的哪个方法。(UserPolicy 也有 update, 我们在控制器中用 `$this->authorize('update', 参数2)` 这样的形式调用,那么参数2除了提供一些必要的数据以外,还可以用于确定我们调用的具体是哪个 Policy 的 update 方法),所以即使 view 我们没用 $store,也需要定义和传递。 | ||
* 在 StoresController 控制器层完成权限认证逻辑: | ||
``` | ||
# edit & update | ||
$this->authorize('update', $store); | ||
# admin => 需要先通过用户找当前用户的门店 | ||
public function admin() | ||
{ | ||
// 获取当前用户的门店 | ||
$store = Auth::user()->stores()->first(); | ||
// 授权 | ||
$this->authorize('view', $store); | ||
// 跳转到后台 | ||
return view('stores.admin', compact('store')); | ||
} | ||
``` |