一、数据表使用 uuid 作为主键,需要注意哪些事情?
可以在 boot 方法中增加生成 uuid 为主键的方法。如果在生成主键之后需要获取 id,那么需要设置 $incrementing = false。具体如下:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Uuid;
class Order extends Model
{
public $incrementing = false;
/**
* Setup model event hooks
*/
public static function boot()
{
parent::boot();
self::creating(function ($model) {
$model->id = (string) Uuid::generate(4);
});
}
}
二、路由变量含有“/”,该如何定义路由?
有时候,我们需要在路由中传入复杂的变量,比如一段路径,这个时候可以通过在 routeServiceProvider 中定义一个 pattern 来实现变量被正确的解析。
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Route;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
class RouteServiceProvider extends ServiceProvider
{
protected $namespace = 'App\Http\Controllers';
public function boot()
{
//
Route::pattern('path', '[a-zA-Z0-9-_/.:\?]+');
parent::boot();
}
}
这样,比如有以下一张动态剪裁的图片,图片的 path 为:
images/201911/bd484d1ef139b1d7f257d6f96baa3ac2.jpeg
构造的 url 为:
http://inspection.test/image/500x335/90/1/c296c89eb4c0fe68/images/201911/bd484d1ef139b1d7f257d6f96baa3ac2.jpeg
路由就可以这样定义了:
Route::get('/image/{width}x{height}/{quality}/{type}/{signature}/{path}', "[email protected]");
三、laravel 的 访问控制策略
laravel 提供了针对模型数据访问控制
的方法,称之为 Policy,通过定义 Policy,我们可以非常方便的解决细粒度的权限问题。
比如,我们允许用户编辑,删除自己的文章,而不能编辑和删除他人的文章,这个该怎么做呢?
一般情况下,我们需要在控制器的代码段中做一下判断,判断一下该文章是否属于该用户,在这里 laravel 帮我们做了很好的封装,可以非常方便的定义这样的访问控制
。
3.1 第一步: 生成策略
使用 artisan 命令,可以生成一个策略类,该类默认被写入到 AppPolicies 目录下:
php artisan make:policy PostPolicy
所生成的类,大致上是这样的:
<?php
namespace App\Policies;
use App\User;
use App\Post;
class PostPolicy
{
/**
* 判断该方法能否被用户操作。
*
* @param \App\User $user
* @param \App\Post $post
* @return bool
*/
public function update(User $user, Post $post)
{
return $user->id === $post->user_id;
}
}
3.2 第二步: 注册策略
一旦策略存在,它就需要进行注册。新的 Laravel 应用中包含的 AuthServiceProvider 有一个 policies 属性,可以将各种模型对应到它们的策略中。注册一个策略将引导 Laravel 在授权动作访问指定模型的时候使用哪种策略:
<?php
namespace App\Providers;
use App\Post;
use App\Policies\PostPolicy;
use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
class AuthServiceProvider extends ServiceProvider
{
/**
* 应用的策略映射。
*
* @var array
*/
protected $policies = [
Post::class => PostPolicy::class,
];
/**
* 注册任意应用认证、应用授权服务
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
}
}
3.3 第三步: 执行策略
- 通过控制器:
$this->authorize('create', Post::class);
- 通过中间件:
Route::post('/post', '[email protected]')->middleware('can:update,post');
- 通过模版:
@can('update', $post)
<!-- The Current User Can Update The Post -->
@elsecan('create', App\Post::class)
<!-- The Current User Can Create New Post -->
@endcan