【问题标题】:Codeigniter 3 blog application: overwriting default "static" variable with a "dynamic" one failsCodeigniter 3 博客应用程序:用“动态”变量覆盖默认的“静态”变量失败
【发布时间】:2018-09-17 07:34:29
【问题描述】:

我正在使用 Codeigniter 3.1.8 开发一个博客应用程序

我有一个带有“静态”数据的模型,例如网站标题、联系电子邮件地址等:

class Static_model extends CI_Model {
    public function get_static_data() {
        $data['site_title'] = "My Blog";
        $data['tagline'] = "A simple blog application made with Codeigniter 3";
        $data['company_name'] = "My Company";
        $data['company_email'] = "company@domain.com";
        return $data;
    }
}

在我的帖子控制器中,我尝试以这种方式传递 DRY 原则:

class Posts extends CI_Controller {

    public function __construct()
    {
      parent::__construct();
      // Load static data
      $this->load->model('Static_model');
      $data = $this->Static_model->get_static_data();
      // Load Header
      $this->load->view('partials/header', $data);
    }

    public function index()
    {
        $this->load->model('Posts_model');
        $data['posts'] = $this->Posts_model->get_posts();
        $this->load->view('posts', $data);
        $this->load->view('partials/footer');
    }

    public function post($id)
    {
        $this->load->model('Posts_model');
        $data['post'] = $this->Posts_model->get_post($id);

        if (!empty($data['post'])) {
            // Overwrite the default tagline with the post title
            $data['tagline'] = $data['post']->title;
        } else {
            $data['tagline'] = "Page not found";
            show_404();
        }

        $this->load->view('post', $data);
        $this->load->view('partials/footer');
    }

}

this topic 中查看我是如何编写上述代码的详细信息。

上述代码的问题在于$data['tagline'] = $data['post']->title; 行不再用帖子标题覆盖静态标语$data['tagline'] = "A simple blog application made with Codeigniter 3";。当控制器看起来像这样时,它确实覆盖了它:

类帖子扩展 CI_Controller {

    public function index()
    {
        $this->load->model('Static_model');
        $data = $this->Static_model->get_static_data();

        $this->load->model('Posts_model');
        $data['posts'] = $this->Posts_model->get_posts();

        $this->load->view('partials/header', $data);
        $this->load->view('posts');
        $this->load->view('partials/footer');
    }

    public function post($id) {
        $this->load->model('Static_model');
        $data = $this->Static_model->get_static_data();

        $this->load->model('Posts_model');
        $data['post'] = $this->Posts_model->get_post($id);

        // Overwrite the default tagline with the post title
        $data['tagline'] = $data['post']->title;

        $this->load->view('partials/header', $data);
        $this->load->view('post');
        $this->load->view('partials/footer');
    }

}

这个旧版本的 Bot 违反了 DRY 原则。

如何在不违反“DRY 戒律”的情况下进行所需的覆盖?

【问题讨论】:

  • 错误是什么?
  • 没有错误,只是$data['tagline'] = $data['post']->title;不再起作用了。

标签: php codeigniter


【解决方案1】:

您可以简单地创建一个新属性:

$this->_data$this->staticData 而不是 $data

然后您将能够访问/更新您的类中的对象属性。

静态变量不能在现有方法/函数之外访问

这就是为什么当您尝试使用新值更新 $data['tagline'] 时,这将起作用,但仅适用于您的 public function post($id)

http://php.net/manual/en/language.variables.scope.php

例子:

$data = $this->Static_model->get_static_data();

$this->data = $this->Static_model->get_static_data();

然后

$this->data['post'] = $this->Posts_model->get_post($id);
$this->data['tagline'] = $this->data['post']->title;

已编辑

【讨论】:

    【解决方案2】:

    在模型中分配全局变量。

    class Static_model extends CI_Model {
    
        public $taglinge= "A simple blog application made with Codeigniter 3";
        public function get_static_data() {
            $data['site_title'] = "My Blog";
            $data['tagline'] = $this->tagline;
            $data['company_name'] = "My Company";
            $data['company_email'] = "company@domain.com";
            return $data;
        }
    }
    

    在您的控制器中:

    public function post($id)
        {
            $this->load->model('Posts_model');
            $data['post'] = $this->Posts_model->get_post($id);
    
            if (!empty($data['post'])) {
                // Overwrite the default tagline with the post title
                $this->Static_model->tagline = $data['post']->title;
            } else {
                $data['tagline'] = "Page not found";
                show_404();
            }
    
            $this->load->view('post', $data);
            $this->load->view('partials/footer');
        }
    

    【讨论】:

    • 我已经在模型中有这个变量:$data['tagline'] = "A simple blog application made with Codeigniter 3";。我想覆盖它。
    • 在你的模型中看看我做了什么
    • Parse error: syntax error, unexpected '$taglinge' (T_VARIABLE), expecting function (T_FUNCTION) in path/to/file
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    相关资源
    最近更新 更多