瀏覽代碼

基于微服务接口自定义邮箱唯一性验证规则

chenlong 4 年之前
父節點
當前提交
63b62f23b8

+ 16 - 0
app/MicroApi/Services/UserService.php

@@ -107,4 +107,20 @@ class UserService
         $result = $this->decode($response->getBody()->getContents());
         return  $result->valid;
     }
+
+    public function getByEmail($email)
+    {
+        $path = $this->servicePrefix . '/get';
+        $user = new UserItem();
+        $user->email = $email;
+        $options = ['json' => $user];
+        try {
+            $response = HttpClient::post($path, $options);
+        } catch (\Exception $exception) {
+            Log::error("MicroApi.UserService.getByEmail Call Failed: " . $exception->getMessage());
+            throw new RpcException("调用远程服务失败");
+        }
+        $result = $this->decode($response->getBody()->getContents());
+        return isset($result->user) ? $result->user : null;
+    }
 }

+ 5 - 0
app/Providers/AppServiceProvider.php

@@ -5,6 +5,7 @@ namespace App\Providers;
 use Illuminate\Support\ServiceProvider;
 use Laravel\Cashier\Cashier;
 use GuzzleHttp\Client as HttpClient;
+use App\MicroApi\Services\UserService;
 
 class AppServiceProvider extends ServiceProvider
 {
@@ -35,5 +36,9 @@ class AppServiceProvider extends ServiceProvider
                 ]
             ]);
         });
+        // 以单例模式绑定用户服务到服务容器
+        $this->app->singleton('microUserService', function ($app) {
+            return new UserService();
+        });
     }
 }

+ 45 - 0
app/Rules/UniqueEmail.php

@@ -0,0 +1,45 @@
+<?php
+
+namespace App\Rules;
+
+use App\MicroApi\Services\UserService;
+use Illuminate\Contracts\Validation\Rule;
+
+class UniqueEmail implements Rule
+{
+    /**
+     * @var UserService
+     */
+    protected $userService;
+
+    /**
+     * Create a new rule instance.
+     * @return void
+     */
+    public function __construct()
+    {
+        $this->userService = resolve('microUserService');
+    }
+
+    /**
+     * Determine if the validation rule passes.
+     *
+     * @param  string  $attribute
+     * @param  mixed  $value
+     * @return bool
+     */
+    public function passes($attribute, $value)
+    {
+        return $this->userService->getByEmail($value) == null;
+    }
+
+    /**
+     * Get the validation error message.
+     *
+     * @return string
+     */
+    public function message()
+    {
+        return '该邮箱已经被注册,请使用其它邮箱';
+    }
+}

+ 3 - 1
app/Shop/Customers/Requests/CreateCustomerRequest.php

@@ -4,6 +4,8 @@ namespace App\Shop\Customers\Requests;
 
 use App\Shop\Base\BaseFormRequest;
 
+use App\Rules\UniqueEmail;
+
 class CreateCustomerRequest extends BaseFormRequest
 {
     /**
@@ -15,7 +17,7 @@ class CreateCustomerRequest extends BaseFormRequest
     {
         return [
             'name' => ['required'],
-            'email' => ['required', 'email', 'unique:customers'],
+            'email' => ['required', 'email', new UniqueEmail],
             'password' => ['required', 'min:8']
         ];
     }

+ 3 - 1
app/Shop/Customers/Requests/RegisterCustomerRequest.php

@@ -4,6 +4,8 @@ namespace App\Shop\Customers\Requests;
 
 use App\Shop\Base\BaseFormRequest;
 
+use App\Rules\UniqueEmail;
+
 class RegisterCustomerRequest extends BaseFormRequest
 {
     /**
@@ -15,7 +17,7 @@ class RegisterCustomerRequest extends BaseFormRequest
     {
         return [
             'name' => 'required|string|max:255',
-            'email' => 'required|string|email|max:255|unique:customers',
+            'email' => ['required', 'string', 'email', 'max:255', new UniqueEmail],
             'password' => 'required|string|min:6|confirmed',
         ];
     }