laravel 的一些小技巧

一、数据表使用 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
添加新评论