MVC模式运用

今天开始尝试写 Codeigniter 的代码了,学着写了一个基础的 MVC 的代码,说实话,写过 Laravel 之后看到其他的框架都觉得不够优雅,看到一些冗余的操作我就会觉得这个应该不是最佳实践吧,可这分明就是官方的教程。可能我领悟的还不够深吧,暂时还没发现优点。( 我偷偷下了一个 Codeigniter 4 尝了下鲜,首页就比 3 美观很多,而且配了贴心的 debug 工具,可人家是 开发板呀,线上还不稳,如果以后真的学下去了可以等一下这个稳定版,应该还不错)。

Codeigniter 4 👇


4 自带 debug 工具 👇

V 层( 视图层 )

V 层代码
这个是查看全部新闻的页面

1
2
3
4
5
6
7
8
9
10
11
<h2><?php echo $title; ?></h2>

<?php foreach ($news as $news_item): ?>

<h3><?php echo $news_item['title']; ?></h3>
<div class="main">
<?php echo $news_item['text']; ?>
</div>
<p><a href="<?php echo site_url('news/'.$news_item['slug']); ?>">View article</a></p>

<?php endforeach; ?>

这个是创建一个新闻的页面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<h2><?php echo $title; ?></h2>

<?php echo validation_errors(); ?>

<?php echo form_open('http://localhost:8888/news/create'); ?>

<label for="title">Title</label>
<input type="input" name="title" /><br />

<label for="text">Text</label>
<textarea name="text"></textarea><br />

<input type="submit" name="submit" value="Create news item" />

</form>

确实是没 laravel 的 blade 模板优雅, 感觉有点乱,是原生的 php 在 html 中插入了 php 代码。
不过我以后应该会做前后端分离。

C 层 ( 控制器层 )

C 层代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<?php
class News extends CI_Controller {

public function __construct()
{
parent::__construct();
$this->load->model('news_model');
$this->load->helper('url_helper');
}

public function index()
{
$data['news'] = $this->news_model->get_news();
$data['title'] = 'News archive';

$this->load->view('templates/header', $data);
$this->load->view('news/index', $data);
$this->load->view('templates/footer');
}

public function view($slug = NULL)
{
$data['news_item'] = $this->news_model->get_news($slug);

if (empty($data['news_item']))
{
show_404();
}

$data['title'] = $data['news_item']['title'];

$this->load->view('templates/header', $data);
$this->load->view('news/view', $data);
$this->load->view('templates/footer');
}
public function create()
{
$this->load->helper('form');
$this->load->library('form_validation');

$data['title'] = 'Create a news item';

$this->form_validation->set_rules('title', 'Title', 'required');
$this->form_validation->set_rules('text', 'Text', 'required');

if ($this->form_validation->run() === FALSE)
{
$this->load->view('templates/header', $data);
$this->load->view('news/create');
$this->load->view('templates/footer');

}
else
{
$this->news_model->set_news();
$this->load->view('news/success');
}
}
}

😂感觉每个方法里要写好多东西,感觉处理的有点多了,不是很简洁,但步骤确实是要这样,CSRF也确实是不可少的,后端判断字段是否填写也是要的。

M 层 ( 数据层 )

M 层代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php

/**
* Created by PhpStorm.
* User: bbche
* Date: 2017/7/12
* Time: 12:48
*/
class News_model extends CI_Model
{
public function __construct()
{
$this->load->database();
}
public function get_news($slug = FALSE)
{
if ($slug === FALSE)
{
$query = $this->db->get('news');
return $query->result_array();
}

$query = $this->db->get_where('news', array('slug' => $slug));
return $query->row_array();
}
public function set_news()
{
$this->load->helper('url');

$slug = url_title($this->input->post('title'), 'dash', TRUE);

$data = array(
'title' => $this->input->post('title'),
'slug' => $slug,
'text' => $this->input->post('text')
);

return $this->db->insert('news', $data);
}
}

看这个框架的时候我忽然明白了一些,我发觉我以前写的代码有点问题,我把太多的数据库操作放在了 C 层,我应该像上面一样在 M 层写方法,然后在 C 层调用,嗯,还是有点帮助的。不过这个 M 层写的有点,怎么说呢,就是觉得不够优雅,但又都不能少,可能被 Laraverl 惯坏了吧。

最后

明天继续看手册,深入了解一下,即使没有像 Laravel 那样的优雅,但对我了解一些 PHP 知识还是很有帮助的。