zoukankan      html  css  js  c++  java
  • 分享一个Laravel中的管道的使用实例

    从代码的角度介绍管道的实际使用方式。有关管道的说明,网上已有较多的篇幅介绍,自行查阅。
    本篇博客是使用管道处理名字, 实现统一处理的目的。

    背景:
    目前能找到的使用管道的介绍也很多,大多停留在对其介绍和引导,真正的深入到代码的部分不多。根据介绍,使用管道也有一定的阻碍,这里分享一篇关于使用管道的详细的代码实例,仅供参考。
    本篇介绍是自己真实使用的过程的代码摘录,亲自测试,真实可用。只为抛砖引玉,不喜勿喷。

    一、控制器

    路由器部分

    Route::get('/pipe', ['as'=>'pipe', 'uses'=>'PipeController@index']);
    

    控制代码

    <?php
    
    namespace AppHttpControllers;
    
    use AppPipesLeftWords;
    use AppPipesRightWords;
    use AppPipesBothSidesWords;
    use IlluminateHttpRequest;
    use IlluminatePipelinePipeline;
    use AppUser;
    use IlluminateSupportStr;
    use IlluminateSupportFacadesHash;
    
    class PipeController extends Controller
    {
        /* 定义管道
         *
         * 第一步处理
         * 第二部处理
         * 第三部处理
         * */
        protected $pipes = [
            LeftWords::class,
            RightWords::class,
            BothSidesWords::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
    │  │  │  BothSidesWords.php
    │  │  │  LeftWords.php
    │  │  │  RightWords.php
    │  │  │
    │  │  └─Contracts
    │  │          PipeContracts.php
    
    1. interface的代码
      路径app/Pipes/Contracts/Pipe.php下的代码如下:
      <?php
      namespace AppPipesContracts;
      
      use Closure;
      
      interface PipeContracts
      {
          public function handle($body, Closure $next);
      }
      
      
    2. 三个管道的类的代码
      LeftWords.php的代码
      <?php
      namespace AppPipes;
      
      use AppPipesContractsPipeContracts;
      use Closure;
      
      class LeftWords implements PipeContracts{
          public function handle($body, Closure $next)
          {
              // TODO: Implement handle() method.
      
              $body = 'left-'.$body;
      
              return $next($body);
          }
      }
      
      LeftWords.php的代码
      <?php
      namespace AppPipes;
      
      use AppPipesContractsPipeContracts;
      use Closure;
      
      class RightWords implements PipeContracts{
          public function handle($body, Closure $next)
          {
              // TODO: Implement handle() method.
      
              $body = $body.'-right';
      
              return $next($body);
          }
      }
      
      BothSidesWords.php的代码
      <?php
      namespace AppPipes;
      
      use AppPipesContractsPipeContracts;
      use Closure;
      
      class BothSidesWords implements PipeContracts{
          public function handle($body, Closure $next)
          {
              // TODO: Implement handle() method.
      
              $body = '['.$body.']';
      
              return $next($body);
          }
      }
      

    这里我们使用管道默认的方法handle,你可以自定义方法名。像下面这样定义myHandleMethod为处理方法名称。

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

    你这样定义后,修改你的interface,同时修改你的实现类即可。

    三、结果说明

    访问http://localhost/pipe?name=lisa之后,能成功打印出获取的结果。User表内部,有数据保存成功。

    {
    "name": "[left-lisa-right]",
    "email": "3riSrDuBFv@gmail.com",
    "updated_at": "2020-09-05T05:57:14.000000Z",
    "created_at": "2020-09-05T05:57:14.000000Z",
    "id": 15
    }
    
  • 相关阅读:
    Keep at Most 100 Characters
    Larry and Inversions
    计算指数
    简单题
    重要的话说三遍
    I Love GPLT
    猜数字
    打印沙漏
    多态性(polymorphism),封装性(encapsulation),内聚(cohesion)以及耦合(coupling)的基本概念
    Hibernate面试题
  • 原文地址:https://www.cnblogs.com/hxsen/p/13618912.html
Copyright © 2011-2022 走看看