Laravel не может поймать исключение и перенаправить с сообщением об ошибке

Вы можете расширить класс PDOStatement, чтобы захватить ограниченные переменные и сохранить их для последующего использования. Затем могут быть добавлены 2 метода: один для переменной sanitizing (debugBindedVariables), а другой для печати запроса с этими переменными (debugQuery):

class DebugPDOStatement extends \PDOStatement{
  private $bound_variables=array();
  protected $pdo;

  protected function __construct($pdo) {
    $this->pdo = $pdo;
  }

  public function bindValue($parameter, $value, $data_type=\PDO::PARAM_STR){
    $this->bound_variables[$parameter] = (object) array('type'=>$data_type, 'value'=>$value);
    return parent::bindValue($parameter, $value, $data_type);
  }

  public function bindParam($parameter, &$variable, $data_type=\PDO::PARAM_STR, $length=NULL , $driver_options=NULL){
    $this->bound_variables[$parameter] = (object) array('type'=>$data_type, 'value'=>&$variable);
    return parent::bindParam($parameter, $variable, $data_type, $length, $driver_options);
  }

  public function debugBindedVariables(){
    $vars=array();

    foreach($this->bound_variables as $key=>$val){
      $vars[$key] = $val->value;

      if($vars[$key]===NULL)
        continue;

      switch($val->type){
        case \PDO::PARAM_STR: $type = 'string'; break;
        case \PDO::PARAM_BOOL: $type = 'boolean'; break;
        case \PDO::PARAM_INT: $type = 'integer'; break;
        case \PDO::PARAM_NULL: $type = 'null'; break;
        default: $type = FALSE;
      }

      if($type !== FALSE)
        settype($vars[$key], $type);
    }

    if(is_numeric(key($vars)))
      ksort($vars);

    return $vars;
  }

  public function debugQuery(){
    $queryString = $this->queryString;

    $vars=$this->debugBindedVariables();
    $params_are_numeric=is_numeric(key($vars));

    foreach($vars as $key=>&$var){
      switch(gettype($var)){
        case 'string': $var = "'{$var}'"; break;
        case 'integer': $var = "{$var}"; break;
        case 'boolean': $var = $var ? 'TRUE' : 'FALSE'; break;
        case 'NULL': $var = 'NULL';
        default:
      }
    }

    if($params_are_numeric){
      $queryString = preg_replace_callback( '/\?/', function($match) use( &$vars) { return array_shift($vars); }, $queryString);
    }else{
      $queryString = strtr($queryString, $vars);
    }

    echo $queryString.PHP_EOL;
  }
}


class DebugPDO extends \PDO{
  public function __construct($dsn, $username="", $password="", $driver_options=array()) {
    $driver_options[\PDO::ATTR_STATEMENT_CLASS] = array('DebugPDOStatement', array($this));
    $driver_options[\PDO::ATTR_PERSISTENT] = FALSE;
    parent::__construct($dsn,$username,$password, $driver_options);
  }
}

И тогда вы можете использовать этот унаследованный класс для отладки purpouses.

$dbh = new DebugPDO('mysql:host=localhost;dbname=test;','user','pass');

$var='user_test';
$sql=$dbh->prepare("SELECT user FROM users WHERE user = :test");
$sql->bindValue(':test', $var, PDO::PARAM_STR);
$sql->execute();

$sql->debugQuery();
print_r($sql->debugBindedVariables());

Результат в

SELECT user FROM users WHERE user = 'user_test'

Array ([: test] => user_test)

1
задан Areg 24 February 2019 в 18:13
поделиться

2 ответа

Вы можете добавить свой обработчик перенаправления в метод render метода app/Exceptions/Handler.php, как показано ниже:

/**
 * Render an exception into an HTTP response.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Exception  $exception
 * @return \Illuminate\Http\Response
 */
public function render($request, Exception $exception)
{
    if ($exception instanceof \Illuminate\Http\Exceptions\PostTooLargeException) {

       return \Illuminate\Support\Facades\Redirect::back()->withErrors(['msg' => 'The Message']);
    }

    return parent::render($request, $exception);
}

Затем он отправит вам ошибки во флэш-сессии, которые будут показаны на веб-интерфейсе.

0
ответ дан Mihir Bhende 24 February 2019 в 18:13
поделиться

Я думаю, что вы пытаетесь использовать 'msg' в качестве ключа для 'Post слишком большой', и если это так, то это должен быть ассоциативный массив.

->withErrors(['msg' => 'Post is too large'])

Но даже с вашим кодом должно отображаться сообщение об ошибке «msg» и «Post is too large» в вашем элементе ul. Таким образом, у вас будет 2 элемента списка в этом контейнере. Не видеть ничего технически неправильного в том, чем вы поделились, где вы не увидите ошибок при перенаправлении.

0
ответ дан balistikbill 24 February 2019 в 18:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: