分享一個Laravel中的管道的使用例項

houxin發表於2020-09-05

從程式碼的角度介紹管道的實際使用方式。有關管道的說明,網上已有較多的篇幅介紹,自行查閱。
本篇部落格是使用管道處理名字, 實現統一處理的目的。

一、控制器部分

<?php

namespace App\Http\Controllers;

use App\Pipes\RemoveBadWords;
use App\Pipes\RemoveScriptTags;
use App\Pipes\ReplaceLinkTags;
use Illuminate\Http\Request;
use Illuminate\Pipeline\Pipeline;
use App\User;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Hash;

class PipeController extends Controller
{
    /* 定義管道
     *
     * 用純文字替換連結標記;
     * 用 “*” 替換敏感詞;
     * 從內容中完全刪除指令碼標記
     * */
    protected $pipes = [
        RemoveBadWords::class,
        RemoveScriptTags::class,
        ReplaceLinkTags::class,
    ];
    // 首頁
    public function index(Request $request){
        $name = $request->input('name');
        // $name = Str::random(10);

        return app(Pipeline::class)
            ->send($name)
            ->through($this->pipes)
            ->then(function ($content) {
                return User::create([
                    'name' => $content,
                    'email'=>Str::random(10).'@gmail.com',
                    'password'=>Hash::make('password'),
                ]);
            });
    }
}

二、管道部分

目錄結構如下:

├─app
│  │  User.php
│  ├─Http
│  │  ...
│  │
│  ├─Models
│  │  ...
│  │
│  ├─Pipes
│  │  │  RemoveBadWords.php
│  │  │  RemoveScriptTags.php
│  │  │  ReplaceLinkTags.php
│  │  │
│  │  └─Contracts
│  │          Pipe.php
  1. interface的程式碼
    路徑app/Pipes/Contracts/Pipe.php下的程式碼如下:

     <?php
     namespace App\Pipes\Contracts;
    
     use Closure;
    
     interface Pipe
     {
         public function handle($content, Closure $next);
     }
  2. 三個管道的類的程式碼
    RemoveBadWords.php的程式碼

     <?php
     namespace App\Pipes;
    
     use App\Pipes\Contracts\Pipe;
     use Closure;
    
     class RemoveBadWords implements Pipe{
         public function handle($content, Closure $next)
         {
             // TODO: Implement handle() method.
    
             $content = 'left-'.$content;
    
             return $next($content);
         }
     }
    

    RemoveScriptTags.php的程式碼

     <?php
     namespace App\Pipes;
    
     use App\Pipes\Contracts\Pipe;
     use Closure;
    
     class RemoveScriptTags implements Pipe{
         public function handle($content, Closure $next)
         {
             // TODO: Implement handle() method.
    
             $content = $content.'-right';
    
             return $next($content);
         }
     }

    ReplaceLinkTags.php的程式碼

     <?php
     namespace App\Pipes;
    
     use App\Pipes\Contracts\Pipe;
     use Closure;
    
     class ReplaceLinkTags implements Pipe{
         public function handle($content, Closure $next)
         {
             // TODO: Implement handle() method.
    
             $content = '['.$content.']';
    
             return $next($content);
         }
     }

    這裡我們使用管道預設的方法handle,你可以自定義方法名。像下面這樣定義customMethodName為處理方法名稱。

    return app(Pipeline::class)
            ->send($name)
            ->through($this->pipes)
            ->via('customMethodName')
            ->then(function ($content) {
                return User::create([
                    'name' => $content,
                    'email'=>Str::random(10).'@gmail.com',
                    'password'=>Hash::make('password'),
                ]);
            });

    你這樣定義後,修改你的interface,同時修改你的實現類即可。

    三、結果說明

    能成功列印出獲取的結果。User表內部,有資料儲存成功。

    {
    "name": "[left-F4VYGWbHLi-right]",
    "email": "iMPQr6F7ri@gmail.com",
    "updated_at": "2020-09-05T02:43:15.000000Z",
    "created_at": "2020-09-05T02:43:15.000000Z",
    "id": 13
    }
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章