【问题标题】:Slim Respect Validation issueSlim Respect 验证问题
【发布时间】:2018-10-03 10:23:00
【问题描述】:

尊重\验证\验证器。我有一个验证器类 validator.php

<?php

namespace app\http\validations;
use Respect\Validation\Validator as Respect;
use Respect\Validation\Exceptins\NestedValidationException;

class Validator {

    protected $errors = [];
    public function validate($request, array $rules){
        foreach ($rules as $field => $rule) {
            try{
               $rule->setName(ucfirst($field))->assert($request->getParam($field)); 
            } catch (NestedValidationException $ex) {
                $this->errors[$field] = $ex->getMessages();
            }

        }
        return $this;
    }

    public function failed(){
        return !empty($this->errors);
    }
}

然后我在控制器中使用此验证,这是我的控制器:

<?php

namespace app\http\controllers\v1;


use Slim\Http\Request;
use Slim\Http\Response;
use Respect\Validation\Validator as v;

use app\providers\v1\CompanyServiceProvider;

class CompanyController extends BaseApiController {

    public $companyServiceProvider;

    public function __construct() {
        $this->companyServiceProvider = new CompanyServiceProvider();
    }

    public function saveBasicDetails(Request $request, Response $response) {
        $validator = new \app\http\validations\Validator();
        $validation = $validator->validate($request, [
            'company_name' => v::notEmpty()->alpha()
         ]);

        if($validation->failed()){
            print_r($validation); die;
        }

        $result = $this->companyServiceProvider->saveBasicDetails($request);
        return BaseApiController::returnResponse($response, $result);
    }

}

这是我的路线,我正在从路线中调用 saveBasicDetails 函数。

$app->post('/save-basic-details', \app\http\controllers\v1\CompanyController::class. ':saveBasicDetails');

我收到以下错误:Company_name 必须通过这些规则

我想以 JSON 格式返回验证错误。

【问题讨论】:

  • 您需要从容器中将$this-&gt;validator 设置为您的验证器。它是空的,所以我猜你没有这样做
  • saverUserDetails 方法从何而来?请添加更多代码。我认为问题在于,您无法在 saveUserDetails 方法中访问容器。
  • 我正在从路由中调用 saveUserDetails 方法。我也更新了该代码。
  • 好的,请出示您的CompanyController 班级。我认为会有问题。
  • 我已经更新了我的问题。因为容器概念有点混乱。所以我删除了这个。我已经把我的控制器代码。

标签: php slim slim-3


【解决方案1】:

在控制器中,您必须在构造函数中注入容器,然后定义一个 getter 来获取您的验证器。检查这个link,到目前为止,没有什么像symfony autowire这样的,你必须显式地注入容器并获得你需要的服务afaik。检查下面的代码将对您有所帮助!

//use Psr\Container\ContainerInterface;


/**
 * @param ContainerInterface $container
 */
public function __construct(ContainerInterface $container)
{
    $this->container = $container;
}


//Then define a getter

/**
 * @return Validator
 */
protected function getValidator()
{
    if (!$this->validator instanceof Validator) {
        $this->validator = $this->container->get('Validator');
    }

    return $this->validator;
}


//Then access the validator
$this->getValidator()->validate...

【讨论】:

  • 我去掉了容器概念 public function saveBasicDetails(Request $request, Response $response) { $validator = new \app\http\validations\Validator(); $validation = $validator->validate($request, [ 'company_name' => v::notEmpty()->alpha() ]); if($validation->failed()){ print_r($validation);死; } $result = $this->companyServiceProvider->saveBasicDetails($request);返回 BaseApiController::returnResponse($response, $result); }
  • 我已经删除了容器的概念。但仍然得到错误但不同的错误。
  • 我收到以下错误:Company_name 必须通过这些规则
【解决方案2】:

伙计们,我犯了一个愚蠢的错误,其中有一个拼写错误

use Respect\Validation\Exceptins\NestedValidationException;

改为

use Respect\Validation\Exceptions\NestedValidationException;

解决了我的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    • 2018-11-21
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    • 2016-11-07
    相关资源
    最近更新 更多