今天开始尝试写 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
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 知识还是很有帮助的。