從程式碼的角度介紹管道的實際使用方式。有關管道的說明,網上已有較多的篇幅介紹,自行查閱。
本篇部落格是使用管道處理名字, 實現統一處理的目的。
一、控制器部分
<?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
interface
的程式碼
路徑app/Pipes/Contracts/Pipe.php
下的程式碼如下:<?php namespace App\Pipes\Contracts; use Closure; interface Pipe { public function handle($content, Closure $next); }
三個管道的類的程式碼
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 協議》,轉載必須註明作者和本文連結