我如何将请求类传递给我的抽象类?

时间:2014-10-03 17:04:06

标签: php design-patterns laravel laravel-5

我正在开发一个API,因为我(大部分)具有相同的功能,我已经创建了一个抽象类,可以在我的控制器上进行扩展。

我的抽象类看起来像:http://laravel.io/bin/23Bzj

在控制器中我将用模型和响应构建(稍后可能会将响应移动到ApiController构造函数)。

class EventController extends ApiController
{

  public function __construct(Event $model, ResponseRepository $response)
  {
     $this->model = $model;
     $this->response = $response;
  }
}

但问题是:我如何能够在我的ApiController中使用特定的Request类来验证方法/什么是最佳实践。

我可以使用普通的Request课程,但之后我不会在方法之前进行任何验证。

当我在EventController时,我可以使用UpdateEventRequestCreateEventRequest等等。

1 个答案:

答案 0 :(得分:1)

据我所知,如果你在控制器中使用任何方法

public function edit(UpdateEventRequest $req) {
  // any code
}
在启动// any code之前

将完成部分验证。

你可以尝试做什么:

  1. 将抽象类中的update方法更改为protected
  2. 将此方法的签名从public function update(Request $request, $id)更改为public function update($request, $id) - 我不知道此步骤是否必要
  3. 使用以下代码创建示例realUpdate的新方法:

    public function realUpdate(UpdateEventRequest $req, $id) {
       parent::update($req, $id);
    }
    
  4. 我不确定第2步,因为如果您在抽象类中使用Request,我不知道Laravel是否会尝试运行任何验证。它也可能会再次针对UpdateEventRequest运行此验证 - 您应该尝试一下,我还没有对其进行测试。

    基本上你会有类似的代码:

    <?php
    
    class X
    {
    
    }
    
    class Y extends X
    {
    
    }
    
    
    abstract class ApiController
    {
    
        protected function update(X $x, $id)
        {
            echo "I have " . get_class($x) . ' and id ' . $id;
        }
    }
    
    
    class Controller extends ApiController
    {
    
        public function realUpdate(Y $y, $id)
        {
            parent::update($y, $id);
        }
    }
    
    $c = new Controller();
    $c->realUpdate(new Y, 2);
    

    并且Laravel应该至少运行一次基于UpdateEventRequest规则的验证器。

    在子类中,此方法的名称不能相同,因为您将收到警告:

      

    严格标准:Controller :: update()的声明应该是   与......第31行中的ApiController :: update(X $ x,$ id)兼容

    然而它仍然可以工作,但我认为你不想发出任何警告。