金钱(警告)
** 状态:** 被贬值
如果您目前正在运行运行 Ubuntu 12.04 的服务器,我们强烈建议升级或迁移到支持的 Ubuntu 版本:
** 原因:** Ubuntu 12.04 已于 2017 年 4 月 28 日到期(EOL)并且不再收到安全补丁或更新。
** 相反,请参阅:** 此指南可能仍然有用作为参考,但可能不会在其他Ubuntu版本上工作. 如果可用,我们强烈建议使用为您正在使用的Ubuntu版本撰写的指南。
关于锂
Lithium是一套完整的PHP框架,用于开发Web应用程序,基于模型视图控制器(MVC)架构,用于PHP 5.3+,并与MongoDB或CouchDB等最新存储技术集成。
它旨在提供一个伟大的项目组织,以及在开发自己的独特Web应用程序时将框架编码出来的可能性,此外,它还具有强大的插件系统,允许您从框架外部使用您最喜欢的组件(如TWIG用于模板或Doctrine2 for ORM)。
在本教程中,我们将继续前面我们在Ubuntu 12.04 VPS上安装Lithium时的位置(https://www.digitalocean.com/community/articles/how-to-install-and-start-using-lithium-on-ubuntu-12-04-vps),并配置了构建我们的Web应用程序所需的所有要求。如果你记得,我们还连接了一个MySQL数据库,并对如何在页面上打印Hello World
的见解。
控制者
我们已经在行动中看到一个简单的控制器类(HelloController)及其索引(即默认)方法,我们将继续建立它来说明3个MVC相关的方面:
- 使用其他控制器类方法以及它们如何与我们在浏览器中呼叫的 URL 相关联 * 传输控制器信息以显示在视图中(这是最好的做法,而不是仅仅是 echo-ing 字符串直接从控制器方法)。
路线
为了说明控制器如何地图到我们需要在浏览器中访问的URL,让我们在我们的 HelloController 中创建另一种方法:
1public function goodbye() {
2 echo "Goodbye!";
3}
现在,当我们将我们的浏览器指向your-ip/sites/hello/goodbye
,我们会看到屏幕上打印的Goodbye
一词,这是Lithium的默认路由行为,我们通过的第一个URL参数是控制器的名称(Hello <-注意缺少Controller
一词),第二个是方法的名称(goodbye)。
我们可以进一步采取,甚至将参数传递到方法如下:
1public function goodbye($name) {
2 echo "Goodbye " . $name . '!';
3}
然后我们可以将我们的浏览器指向 your-ip/sites/hello/goodbye/danny
,你会看到屏幕上打印的Goodbye danny!
所以它非常方便和逻辑,工作类似于 CodeIgniter。
虽然这很简单,但它并不能满足每个项目的需求,在这种情况下,您可以根据自己的意愿定义自定义路由规则和地图 URL 到控制器方法。
观点
正如我所提到的,MVC架构促进了逻辑与演示的分离,所以让我们看看我们如何使用锂视图来显示我们在HelloController
类内构建的信息。
我们需要做的第一件事是让这种方法将变量传递到视图中。可以做到这一点的方法之一是返回一个关联数组的键和值。
1public function goodbye($name) {
2 return array(
3 'name' => $name,
4 );
5}
正如您所看到的,该方法只会返回包含变量(从 URL 传输)的数组,与$name
变量相关的密钥将在视图中作为变量输出。
现在,让我们继续创建一个在应用程序 / 视图 / 文件夹中具有与控制器方法相同的名称的视图文件,并居住在一个名为控制器的文件夹中。
1nano app/views/hello/goodbye.html.php
现在,在这个文件里面插入以下内容:
1<h1>Goodbye <?=$name;?>!</h1>
现在,当您导航到前一个URL时:
1your-ip/sites/hello/goodbye/danny
您应该在标题标签之间看到我们从传输到控制器中获得的$name
变量,反过来又被视图传输并打印出来。
您还会注意到我们的视图被注入到现有布局中,该布局默认情况下包含锂(顶部有一个小菜单等)。
模型
看到我们如何路由请求和显示信息,让我们看看我们如何从我们的数据库中获取信息,通过创建一个模型来代表它。
首先,请确保你有数据库和表。我会打电话给我的新闻,它将有3个列:id,标题和身体. 此外,用一些愚蠢的内容填充这个表,以便你可以玩一些东西。 有关与MySQL合作的更多信息,你可以阅读这个伟大的教程(https://www.digitalocean.com/community/articles/how-to-install-linux-apache-mysql-php-lamp-stack-on-ubuntu)在DigitalOcean上。
要加快工作速度,您可以快速从命令行创建此表,然后登录到您的MySQL服务器,运行此命令:
1CREATE TABLE `news` (
2 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
3 `title` varchar(255) NOT NULL,
4 `body` text NOT NULL,
5 PRIMARY KEY (`id`)
6);
您还可以使用以下两个命令插入两行愚蠢的行:
1INSERT INTO `news` (title, body) VALUES ('This is the first news article', 'some article body');
2INSERT INTO `news` (title, body) VALUES ('This is other news', 'some more article body');
现在我们有一些内容,让我们创建一个 News.php 文件,以保持我们的模型类在应用程序 / 模型 / 文件夹:
1nano app/models/News.php
在里面,贴上以下内容:
1<?php
2
3namespace app\models;
类 新闻延伸 \lithium\data\Model { }
?>
目前,这就是我们在这个文件中所需要的一切。
回到我们的HelloController
类,在类声明上方添加以下行:
1use app\models\News;
现在让我们在课堂内添加另一种方法:
1public function news($id) {
2 $news = News::first(array(
3 'conditions' => array('id' => $id)
4 ));
5 return array(
6 'news' => $news->data()
7 );
8 }
该方法从URL(新闻ID)中取出参数,以该ID获取新闻,并将结果传送到视图中。它使用锂模型基类来使用find()
方法执行查询,然后使用data()
方法访问结果对象中的数据。
1nano app/views/hello/news.html.php
然后粘贴下列:
1<h1><?=$news['title'];?></h1>
2<p><?=$news['body'];?></p>
进行这些更改时,请确保配置文件中有正确的 MySQL 凭证:
1nano /var/www/site/app/config/bootstrap/connections.php
正如你所看到的,$news
变量是以表列命名的键组成的数组。
1your-ip/site/hello/news/1
把2
作为最后的论点,你应该看到第二篇新闻文章等 有关使用锂模型的更详细信息,请阅读相应的文件 这里。
结论
在本教程中,我们已经玩了一些Lithium,学习了基本路由系统的运作方式,以及URL如何被翻译成控制器请求。