Codelgniter4中文手册,版本4.0.0 等)来运行稍后教程里提供的创建数据库表和插入测试数据所需的SQL代码。 下面我们就来教你如何为本教程创建一个数据库,并且正确配置CodeIgniter来使用这 个数据库。 用你安装好的数据库客户端工具打开数据库,然后运行下面的两段SQL代码(MySQL 适用)来创建一个数据表和插入一些测试数据。随着你对Codelgniter的熟悉程度越来 越高,这些数据库相关的操作也可以通过程序代码在Codelgniter框架下完成,你可以 阅读数据迁移和数据填充这两个章节来了解相关内容,以便掌握用程序代码操作数据 库的相关技能。 CREATE TABLE news id int(11)NOT NULL AUTO_INCREMENT, title varchar(128)NOT NULL, slug varchar(128)NOT NULL, body text NOT NULL, PRIMARY KEY (id), KEY slug (slug) Note:数据表里的slug字段在基于互联网访问的网站上是个非常有用的字段。一般在 这个字段里存放简短的词语来概括性描述数据内容,这将提升用户打开网址时候的访 问体验,并且这种网址也是搜索引擎友好的网址,有利于网站内容的SE0优化。 然后我们在数据表里插入如下测试数据: INSERT INTO news VALUES (1,'Elvis sighted','elvis-sighted','Elvis was sighted at the Podunku -internet cafe.It looked like he was writing a CodeIgniter app.'), (2,'Say it isn\'t so!','say-it-isnt-so','Scientists conclude that someu -programmers have a sense of humor.'), (3,'Caffeination,Yes!','caffeination-yes','World\'s largest coffee shopu -open onsite nested coffee shop for staff only.'); 连接到你的数据库 CodeIgniter安装时会自动生成一个.env文件,确保里面的配置信息没有被注释掉, 并且和你本地的数据库实际情况相吻合: database.default.hostname localhost database.default.database ci4tutorial database.default.username root database.default.password root database.default.DBDriver MySQLi 3.1.构建你的第一个应用 23
CodeIgniter4 中文手册, 版本 4.0.0 等)来运行稍后教程里提供的创建数据库表和插入测试数据所需的 SQL 代码。 下面我们就来教你如何为本教程创建一个数据库,并且正确配置 CodeIgniter 来使用这 个数据库。 用你安装好的数据库客户端工具打开数据库,然后运行下面的两段 SQL 代码(MySQL 适用)来创建一个数据表和插入一些测试数据。随着你对 CodeIgniter 的熟悉程度越来 越高,这些数据库相关的操作也可以通过程序代码在 CodeIgniter 框架下完成,你可以 阅读数据迁移 和数据填充 这两个章节来了解相关内容,以便掌握用程序代码操作数据 库的相关技能。 CREATE TABLE news ( id int(11) NOT NULL AUTO_INCREMENT, title varchar(128) NOT NULL, slug varchar(128) NOT NULL, body text NOT NULL, PRIMARY KEY (id), KEY slug (slug) ); Note: 数据表里的 slug 字段在基于互联网访问的网站上是个非常有用的字段。一般在 这个字段里存放简短的词语来概括性描述数据内容,这将提升用户打开网址时候的访 问体验,并且这种网址也是搜索引擎友好的网址,有利于网站内容的 SEO 优化。 然后我们在数据表里插入如下测试数据: INSERT INTO news VALUES (1,'Elvis sighted','elvis-sighted','Elvis was sighted at the Podunk␣ ,→internet cafe. It looked like he was writing a CodeIgniter app.'), (2,'Say it isn\'t so!','say-it-isnt-so','Scientists conclude that some␣ ,→programmers have a sense of humor.'), (3,'Caffeination, Yes!','caffeination-yes','World\'s largest coffee shop␣ ,→open onsite nested coffee shop for staff only.'); 连接到你的数据库 CodeIgniter 安装时会自动生成一个 .env 文件,确保里面的配置信息没有被注释掉, 并且和你本地的数据库实际情况相吻合: database.default.hostname = localhost database.default.database = ci4tutorial database.default.username = root database.default.password = root database.default.DBDriver = MySQLi 3.1. 构建你的第一个应用 23
Codelgniter4中文手册,版本4.0.0 创建你的数据模型文件 我们要求你将数据库的操作代码写在模型(Modl)文件里面,以便以后代码重用,不 要将这些代码写在控制器(Controller)里。你的模型文件们应该成为你处理数据库相 关的增、删、改、查操作的默认地方。交由模型文件来操作数据库或者其他格数的数据 文件。 打开app/Models/目录,在这个目录下面创建一个名字为NewsModel.php的文件 并在文件里加入如下代码。为了保证代码运行顺利,你需要确认一下已经正确的完成 了数据库的相关配置:doc:这里<./database/configuration>。 <?php namespace App\Models; class NewsModel extends \CodeIgniter\Model { protected $table ='news'; 这段代码和我们上一个章节里创建的控制器里的代码类似。我们通过继承 CodeIgniter\Model创建了一个新的模型文件,并加载了CI4内置的数据库操作类 库。后面我们可以在代码里通过$this->db来调用数据库的相关操作类库。 现在我们的数据库和数据模型文件已经建立好了。我们首先写一个方法从数据库中获 取所有的新闻文章。为实现这点,我们将使用CodeIgniter的数据库抽象层工具查询 构建器,通过它你可以编写你的查询代码,并在所有支持的数据库平台上运行。数据 模型文件可以方便的和查询构建器一起工作,并且提供了一些方法让你操作数据的时 候更加简单。现在向你的模型中添加如下代码。 public function getNews($slug false) if ($slug ==false) { return $this->findAll(); return $this->asArray() ->where(['slug'=>$slug]) ->first(); 通过这段代码,你可以执行两种不同的查询,一种是获取所有的新闻条目,另一种是 根据特定的sug来获取指定的新闻条目。你可能注意到了,我们直接的进行了基于 “$slug“变量的数据对比命令,并不需要预先执行相应字段的查询操作,因为:doc:查询 构建器<./database/query_builder>自动帮我们完成了这个工作。 我们在这里用到的findAll()和first()都是CodeIgniter4的数据模型(Model)基 础类里面内置的方法。他们根据我们在数据模型文件里(本例中是NewsModel文 件)声明的$table变量而知道该对哪个数据表进行操作。这些方法通过查询构建器 24 章节3.构建你的第一个应用
CodeIgniter4 中文手册, 版本 4.0.0 创建你的数据模型文件 我们要求你将数据库的操作代码写在模型(Model)文件里面,以便以后代码重用,不 要将这些代码写在控制器(Controller)里。你的模型文件们应该成为你处理数据库相 关的增、删、改、查操作的默认地方。交由模型文件来操作数据库或者其他格数的数据 文件。 打开 app/Models/ 目录,在这个目录下面创建一个名字为 NewsModel.php 的文件, 并在文件里加入如下代码。为了保证代码运行顺利,你需要确认一下已经正确的完成 了数据库的相关配置:doc: 这里 <../database/configuration>。 <?php namespace App\Models; class NewsModel extends \CodeIgniter\Model { protected $table = 'news'; } 这 段 代 码 和 我 们 上 一 个 章 节 里 创 建 的 控 制 器 里 的 代 码 类 似。 我 们 通 过 继 承 CodeIgniter\Model 创建了一个新的模型文件,并加载了 CI4 内置的数据库操作类 库。后面我们可以在代码里通过 $this->db 来调用数据库的相关操作类库。 现在我们的数据库和数据模型文件已经建立好了。我们首先写一个方法从数据库中获 取所有的新闻文章。为实现这点,我们将使用 CodeIgniter 的数据库抽象层工具查询 构建器,通过它你可以编写你的查询代码,并在所有支持的数据库平台 上运行。数据 模型文件可以方便的和 查询构建器一起工作,并且提供了一些方法让你操作数据的时 候更加简单。现在向你的模型中添加如下代码。 public function getNews($slug = false) { if ($slug === false) { return $this->findAll(); } return $this->asArray() ->where(['slug' => $slug]) ->first(); } 通过这段代码,你可以执行两种不同的查询,一种是获取所有的新闻条目,另一种是 根据特定的 slug 来获取指定的新闻条目。你可能注意到了,我们直接的进行了基于 ‘‘$slug‘‘ 变量的数据对比命令,并不需要预先执行相应字段的查询操作,因为:doc: 查询 构建器 <../database/query_builder> 自动帮我们完成了这个工作。 我们在这里用到的 findAll() 和 first() 都是 CodeIgniter4 的数据模型(Model)基 础类里面内置的方法。他们根据我们在数据模型文件里(本例中是 NewsModel 文 件)声明的 $table 变量而知道该对哪个数据表进行操作。这些方法通过 查询构建器 24 章节 3. 构建你的第一个应用
Codelgniter4中文手册,版本4.0.0 运行指令操作当前数据表,并且会以数组的形式返回数据查询结果。在这个例子里面, findA11()的返回值是包含了指定数据表中的所有数据对象的一个数组。 显示新闻 现在,查询已经在数据模型文件里写好了,接下来我们需要将数据模型绑定到视图上 向用户显示新闻条目了。这可以在之前写的Pages控制器里来做,但为了更清楚的阐 述,我们定义了一个新的News控制器,创建在app/controllers/Nes.php文件中。 <?php namespace App\Controllers; use App\Models\NewsModel; class News extends \CodeIgniter\Controller public function index() $model new NewsModel(); $data['news']$model->getNews(); public function view($slug null) { $model new NewsModel(); $data['news']$model->getNews($slug); 阅读上面的代码你会发现,这和之前写的代码有些相似之处。首先,它继承了 *CodeIgniter*的一个核心类,Controller,这个核心类提供了很多非常有用的方法 它确保你可以操作当前的Request和Response对象,也可以操作“Logger“类,方便 你把日志文件写到磁盘里。 其次,有两个方法用来显示新闻条目,一个显示所有的,另一个显示特定的。你可以看 到第二个方法中调用模型方法时传入了$s1ug参数,模型根据这个sug返回特定的新 闻条目。 现在,通过模型,控制器已经获取到数据了,但还没有显示出来。下一步要做的就是将 数据传递给视图。我们修改index()方法成下面的样子:: public function index() $model new NewsModel(); $data = 'news =$model->getNews(), (下页继续) 3.1.构建你的第一个应用 25
CodeIgniter4 中文手册, 版本 4.0.0 运行指令操作当前数据表,并且会以数组的形式返回数据查询结果。在这个例子里面, findAll() 的返回值是包含了指定数据表中的所有数据对象的一个数组。 显示新闻 现在,查询已经在数据模型文件里写好了,接下来我们需要将数据模型绑定到视图上, 向用户显示新闻条目了。这可以在之前写的 Pages 控制器里来做,但为了更清楚的阐 述,我们定义了一个新的 News 控制器,创建在 app/controllers/News.php 文件中。 <?php namespace App\Controllers; use App\Models\NewsModel; class News extends \CodeIgniter\Controller { public function index() { $model = new NewsModel(); $data['news'] = $model->getNews(); } public function view($slug = null) { $model = new NewsModel(); $data['news'] = $model->getNews($slug); } } 阅读上面的代码你会发现,这和之前写的代码有些相似之处。首先,它继承了 *CodeIgniter* 的一个核心类,Controller,这个核心类提供了很多非常有用的方法, 它确保你可以操作当前的 Request 和 Response 对象,也可以操作 ‘‘Logger‘‘ 类, 方便 你把日志文件写到磁盘里。 其次,有两个方法用来显示新闻条目,一个显示所有的,另一个显示特定的。你可以看 到第二个方法中调用模型方法时传入了 $slug 参数,模型根据这个 slug 返回特定的新 闻条目。 现在,通过模型,控制器已经获取到数据了,但还没有显示出来。下一步要做的就是将 数据传递给视图。我们修改 index() 方法成下面的样子:: public function index() { $model = new NewsModel(); $data = [ 'news' => $model->getNews(), (下页继续) 3.1. 构建你的第一个应用 25
Codelgniter4中文手册,版本4.0.0 (续上页) 'title'='News archive', ]; echo view('templates/header',$data); echo view('news/index',$data); echo view('templates/footer'); 上面的代码从模型中获取所有的新闻条目,并赋值给一个变量(news)。另外页面的标 题赋值给了$data['title']元素,然后所有的数据被传递给视图。现在你需要创建一 个视图文件来显示新闻条目了,新建app/Views/news/index.php文件并添加如下代码。 <h2><?=$title?></h2> <?php if (empty(Snews)&&is array(Snews)):? <?php foreach ($news as $news_item):? <h3><?=$news_item['title']?></h3> <div class="main"> <?=$news_item['text']? </div> <p><a href="<?='/news/'.$news_item['slug']?>">Viewu -article</a></p> <?php endforeach;? <?php else ? <h3>No News</h3> <p>Unable to find any news for you.</p> <?php endif ? 这里,我们通过一个循环将所有的新闻条目显示给用户,你可以看到我们直接采用了 HTML和PHP混用的写法创建了一个视图页面。如果你希望使用一种模板语言,你可 以使用CodeIgniter的视图模版解析类<./outgoing//view_parser>,或其他的第三方 解析器。 新闻的列表页就做好了,但是我们还缺少一个显示特定新闻条目的页面。我们可以调 用之前创建的模型里的数据来实现这个功能,你只需要向控制器中添加一些代码,然 后再新建一个视图就可以了。回到News控制器,使用下面的代码替换掉view()方法: public function view($slug NULL) (下页继续) 26 章节3.构建你的第一个应用
CodeIgniter4 中文手册, 版本 4.0.0 (续上页) 'title' => 'News archive', ]; echo view('templates/header', $data); echo view('news/index', $data); echo view('templates/footer'); } 上面的代码从模型中获取所有的新闻条目,并赋值给一个变量(news)。另外页面的标 题赋值给了 $data['title'] 元素,然后所有的数据被传递给视图。现在你需要创建一 个视图文件来显示新闻条目了,新建 app/Views/news/index.php 文件并添加如下代码。 <h2><?= $title ?></h2> <?php if (! empty($news) && is_array($news)) : ?> <?php foreach ($news as $news_item): ?> <h3><?= $news_item['title'] ?></h3> <div class="main"> <?= $news_item['text'] ?> </div> <p><a href="<?= '/news/'.$news_item['slug'] ?>">View␣ ,→article</a></p> <?php endforeach; ?> <?php else : ?> <h3>No News</h3> <p>Unable to find any news for you.</p> <?php endif ?> 这里,我们通过一个循环将所有的新闻条目显示给用户,你可以看到我们直接采用了 HTML 和 PHP 混用的写法创建了一个视图页面。如果你希望使用一种模板语言,你可 以使用 CodeIgniter 的 视图模版解析类 <../outgoing/view_parser> ,或其他的第三方 解析器。 新闻的列表页就做好了,但是我们还缺少一个显示特定新闻条目的页面。我们可以调 用之前创建的模型里的数据来实现这个功能,你只需要向控制器中添加一些代码,然 后再新建一个视图就可以了。回到 News 控制器,使用下面的代码替换掉 view() 方法: public function view($slug = NULL) { (下页继续) 26 章节 3. 构建你的第一个应用
Codelgniter4中文手册,版本4.0.0 (续上页) $model new NewsModel(); $data['news']$model->getNews($slug); if (empty($data['news'])) throw new \CodeIgniter\PageNotFoundException('Cannotu -find the page:'$slug); $data['title']$data['news']['title']; echo view('templates/header',$data); echo view('news/view',$data); echo view('templates/footer'); 我们并没有直接调用getNews()方法,而是传入了一个$slug参数,所以它会返回相 应的新闻条目。最后剩下的事是创建视图文件app/Views/,news/view.php并添加如下 代码。 <?php echo‘<h2>'$news[‘title'].’</h2>’;echo$news[body']; 路由 由于之前我们创建了基于通配符的路由规则,所以现在需要新增一条路由以便能访问 到你刚刚创建的控制器。修改路由配置文件(app/config/routes.php)添加类似下面 的代码。该规则可以让地址中带*news*的请求访问News控制器而不是去访问之前默 认的Pages控制器。第一行代码可以让访问news/slug地址的URI重定向到News控 制器的view)方法。 Sroutes->get ('news/(segment)','News:view/$1'); Sroutes->get('news','News:index'); Sroutes->get('(:any)','Pages:view/$1') 在地址栏里输入localhost:8080/news来访问你创建好的新闻列表页面吧。你将会看到 如下图一样的一个展示新闻列表的网页,列表里的每个文章都带一个可以打开该条新 闻详情页面的超级链接。 3.1.构建你的第一个应用 27
CodeIgniter4 中文手册, 版本 4.0.0 (续上页) $model = new NewsModel(); $data['news'] = $model->getNews($slug); if (empty($data['news'])) { throw new \CodeIgniter\PageNotFoundException('Cannot␣ ,→find the page: '. $slug); } $data['title'] = $data['news']['title']; echo view('templates/header', $data); echo view('news/view', $data); echo view('templates/footer'); } 我们并没有直接调用 getNews() 方法,而是传入了一个 $slug 参数,所以它会返回相 应的新闻条目。最后剩下的事是创建视图文件 app/Views/news/view.php 并添加如下 代码。 <?php echo ‘<h2>’.$news[‘title’].’</h2>’; echo $news[‘body’]; 路由 由于之前我们创建了基于通配符的路由规则,所以现在需要新增一条路由以便能访问 到你刚刚创建的控制器。修改路由配置文件(app/config/routes.php)添加类似下面 的代码。该规则可以让地址中带 *news* 的请求访问 News 控制器而不是去访问之前默 认的 Pages 控制器。第一行代码可以让访问 news/slug 地址的 URI 重定向到 News 控 制器的 view() 方法。 $routes->get('news/(:segment)', 'News::view/$1'); $routes->get('news', 'News::index'); $routes->get('(:any)', 'Pages::view/$1'); 在地址栏里输入 localhost:8080/news 来访问你创建好的新闻列表页面吧。你将会看到 如下图一样的一个展示新闻列表的网页,列表里的每个文章都带一个可以打开该条新 闻详情页面的超级链接。 3.1. 构建你的第一个应用 27