数组到字符串转换错误-Slim Twig-

时间:2018-05-18 06:50:07

标签: php twig slim

设置:我有一个苗条的应用程序,我拉入了Illuminate DB和Twig视图。

if (!$validator->passed()) {
        $errors = $validator->errors();
        $users = User::all();
        return $this->view($response, 'auth.login', compact('errors','users'));
    }

问题:当我运行上面的代码时,我能够在视图中检索用户变量,但是errors变量会引发以下错误。

  

注意:/Users/davidchen/Documents/sites/slim.com/vendor/twig/twig/lib/Twig/Environment.php(378)中的数组到字符串转换:eval()' d代码       在线       70阵列

errors变量返回一个多维数组,在你下面找到我从print_r得到的结果($ errors)。

Array ( 
    [username] => Array ( 
        [0] => username already exists 
    ) 
    [password] => Array ( 
        [0] => password must consist of at least 6 characters 
    ) 
)

以下是我的相关项目文件:

  1. Twig设置文件(app.php)
  2. $c = $app->getContainer();
    
    $capsule = new \Illuminate\Database\Capsule\Manager;
    $capsule->addConnection($config['config']['db']);
    $capsule->setAsGlobal();
    $capsule->bootEloquent();
    
    $c['db'] = function($c) use ($capsule){
        return $capsule;
    };
    
    $c['view'] = function($c){
        $options['cache']=false;
        $view = new \Slim\Views\Twig(__DIR__."/../views", $options);
        $view->addExtension(new \Slim\Views\TwigExtension(
            $c->router,
            $c->request->getUri()
        ));
        $view->getEnvironment()->addGlobal('flash', $c->flash);
        return $view;
    };
    
    $c['flash'] = function($c){
        return new Slim\Flash\Messages();
    };
    
    1. Validator Class
    2. namespace App\Models\Auth;
      use Illuminate\Database\Eloquent\Model;
      use Illuminate\Database\Capsule\Manager as DB;
      use Carbon\Carbon;
      use DateTime;
      
      
      class Validator extends Model
      {
          protected   $field_name,
                      $data,
                      $errors = [];
      
      /*
      * Main validator
      */
      
          public function __construct($request, $fields = []){
              $data = $request->getParams();
              $this->data = $data;
              foreach ($fields as $field => $constraints) {
                  $this->field_name = $field;
                  if (isset($data[$field])) {
                      $field_value = $data[$field];
                      foreach (explode("|", $constraints) as  $constraint) {
                          $obj = explode(":", $constraint);
                          $function_name = $obj[0];
                          if (isset($obj[1])) {
                              if(method_exists($this, $function_name))
                              {
                                  $this->$function_name($obj[1],$field_value);
                              }
                          }
                      }
                  }else{
                      if (strpos($constraints, 'required') !== false) {
                          $validator->report($validator->field_name.' field is requried');
                      }   
                  }
              }
              return $this;
          }
      /*
      * Object Interface Methods
      */
          private function report($message){
              $this->errors[$this->field_name][]= $message;
          }
      
          public function errors(){
      
              return $this->errors;
          }
      
          public function passed(){
              if (!count($this->errors)) {
                  return true;
              }
          }
      
      /*
      * Validation Rules
      */
      
          public function max($length,$value){
              if (strlen($value)>$length) {
                  $this->report("{$this->field_name} must consist of less than {$length} characters");
              }
          }
      
          public function min($length,$value){
              if (strlen($value)<$length) {
                  $this->report("{$this->field_name} must consist of atleast {$length} characters");
              }
          }
      
          public function distinct($tableName,$value){
              if (DB::table($tableName)->where($this->field_name, $value)->exists()) {
                  $this->report("{$this->field_name} already exists");
              }
          }
      
          public function date($format,$date){     
      
              if (!preg_match("/\d{4}-\d{2}-\d{2}\b/",$date)) {
                  $this->report("incorrect {$this->field_name} values");
              }else{
                  $d = DateTime::createFromFormat($format, $date); 
                  if ($d && $d->format($format) !== $date) {
                      $this->report("{$this->field_name} format should be {$format}");
                  }
              }        
          }
      
          public function match($matchField,$value){
              if (isset($this->data[$matchField])) {
                  $valueTwo = $this->data[$matchField];
                  if ($value !== $valueTwo) {
                      $this->report("{$this->field_name} does not match {$matchField}");
                  }
              }else{
                  $this->report("{$matchField} is required");
              }
      
      
          }
      
          public function format($type,$value){
              switch ($type) {
                  case 'noWhiteSpace':
                      if (preg_match("/\s/",$value)) {
                          $this->report("{$this->field_name} may not contain any spaces");
                  }break;
      
                  case 'alpha':
                      if (preg_match("/[^a-zA-Z]/",$value)) {
                          $this->report("{$this->field_name} may only contain letters");
                  }break;
      
                  case 'alphaNum':
                      if (preg_match("/[^a-zA-Z0-9]/",$value)) {
                          $this->report("{$this->field_name} may only contain letters");
                  }break;
      
                  case 'email':
                      if (!filter_var($value, FILTER_VALIDATE_EMAIL)) {
                          $this->report("in correct {$this->field_name} format");
                  }break;
      
                  default:
                      # code...
                      break;
              }
          }
      
      }
      
      1. 基本控制器
      2. namespace App\Controllers;
        /**
        * 
        */
        class Controller 
        {
            protected $c;
            function __construct($container)
            {
                $this->c = $container;
            }
        
            public function view($response, $path,$variables = []){
                $this->c->view->render($response, str_replace(".","/",$path).".twig", $variables);
            }
        
            public function pathFor($routeName,$data = []){
                return $this->c->router->pathFor($routeName,$data);
            }
        }
        
        1. Auth Controller
        2. namespace App\Controllers\Auth;
          use App\Models\User\User;
          use App\Controllers\Controller;
          use App\Models\Auth\Validator;
          /**
          * 
          */
          class AuthController extends Controller
          {
              public function getLogin($request, $response){
                  return $this->view($response, 'auth.login');
              }
          
              public function postLogin($request, $response){
                  $validator =  new Validator($request,[
                      'username'=>'required|min:3|max:64|format:alphaNum|distinct:users',
                      'password'=>'required|min:6|max:64|',
                  ]);
          
                  if (!$validator->passed()) {
                      $errors = $validator->errors();
                      $users = User::all();
                      return $this->view($response, 'auth.login', compact('errors','users'));
                  }
                  return $this->view($response, 'home.login');
              }
          }
          
          1. login.twig file
          2. login.twig文件

            enter image description here

            希望你们中的一个人能够解决这个问题。我整个上午一直在努力解决这个问题。

1 个答案:

答案 0 :(得分:1)

您可以尝试循环遍历序列中的每个项目。例如,要显示名为users的变量中提供的用户列表:

<h1>Members</h1>
<ul>
    {% for user in users %}
        <li>{{ user.username|e }}</li>
    {% endfor %}
</ul>

Read more

相关问题