如何使用Lithium创建Web应用程序
状态: 已弃用
本文介绍了不再受支持的 Ubuntu 版本。 如果您当前正在运行运行 Ubuntu 12.04 的服务器,我们强烈建议您升级或迁移到受支持的 Ubuntu 版本:
原因: Ubuntu 12.04 已于 2017 年 4 月 28 日终止生命周期 (EOL) and no longer receives security patches or updates. This guide is no longer maintained.
请参阅: 本指南可能仍可用作参考,但可能不适用于其他 Ubuntu 版本。 如果可用,我们强烈建议使用为您正在使用的 Ubuntu 版本编写的指南。 您可以使用页面顶部的搜索功能来查找更新的版本。
关于锂
Lithium 是一个用于开发 Web 应用程序的全栈 PHP 框架。 它基于模型-视图-控制器 (MVC) 架构,专为 PHP 5.3+ 构建,并与 MongoDB 或 CouchDB 等最新存储技术集成。
它旨在提供出色的项目组织以及在您开发自己独特的 Web 应用程序时在框架之外编写代码的可能性。 此外,它具有强大的插件系统,允许您从框架外部使用您最喜欢的组件(例如用于模板的 Twig 或用于 ORM 的 Doctrine2)。
在本教程中,当我们 在我们的 Ubuntu 12.04 VPS 上安装 Lithium 并配置构建我们的 Web 应用程序的所有必要要求时,我们将继续我们之前中断的地方。 如果您还记得,我们还连接了一个 MySQL 数据库,并了解了如何在页面上打印出“Hello World”。 下面将说明如何将三个 MVC 组件(模型、视图和控制器)与 Lithium 框架一起使用。
控制器
我们已经看到了一个简单的控制器类(HelloController)和它的索引(即它的默认)方法。 我们将继续构建它来说明另外 3 个与 MVC 相关的方面:
- 使用其他控制器类方法以及它们与我们在浏览器中调用的 URL 的关系
- 从控制器传递信息以显示在视图中(这是一种最佳实践,而不是直接从控制器方法中直接使用 echo-ing 字符串)。
- 创建一个模型来表示我们在数据库中的数据
路由
为了说明控制器如何映射到我们需要在浏览器中访问的 URL,让我们在 HelloController 中创建另一个方法:
public function goodbye() { echo "Goodbye!"; }
现在,当我们将浏览器指向 your-ip/sites/hello/goodbye
时,我们会看到屏幕上打印出“再见”字样。 这是 Lithium 的默认路由行为,我们传递的第一个 url 参数是控制器的名称( 你好 <- 注意缺少“Controller”一词),第二个是方法的名称( 再见 )。
我们可以采取 if 进一步,甚至将参数传递给方法,如下所示:
public function goodbye($name) { echo "Goodbye " . $name . '!'; }
然后我们可以将浏览器指向 your-ip/sites/hello/goodbye/danny
,你会看到打印的“Goodbye danny!” 屏幕上。 所以它非常方便和合乎逻辑,类似于 CodeIgniter。
尽管这可能很简单,但它并不能满足每个项目的需求。 在这种情况下,您可以根据需要定义自定义路由规则并将 url 映射到控制器方法。 在 Lithium 文档站点上阅读 更多信息 。
意见
正如我所提到的,MVC 架构促进了逻辑与表示的分离,所以让我们看看我们如何使用 Lithium 视图来显示在我们的 HelloController
类中构建的信息。 回到我们之前创建的 goodbye()
方法,假设我们需要在视图中打印出我们传递给它的参数($name
)。
我们需要做的第一件事是让这个方法将变量传递给视图。 实现这一点的方法之一是返回键和值的关联数组。 因此,将 goodbye()
方法更改为如下所示:
public function goodbye($name) { return array( 'name' => $name, ); }
如您所见,该方法所做的只是返回一个包含变量(从 URL 传递)的数组。 与 $name
变量相关的键将在视图中可用以作为变量输出。
现在,让我们继续在 app/views/ 文件夹中创建一个与控制器方法同名的 View 文件,并驻留在以控制器命名的文件夹中。 所以在我们的例子中(在项目根文件夹中):
nano app/views/hello/goodbye.html.php
现在在此文件中粘贴以下内容:
<h1>Goodbye <?=$name;?>!</h1>
现在,当您导航到上一个网址时:
your-ip/sites/hello/goodbye/danny
您应该在标题标签之间看到我们从传递给控制器获得的 $name
变量是如何传递给视图并由视图打印的。 另一个很酷的事情是锂会自动转义该值。
您还会注意到,我们的视图被注入到现有的布局中,该布局默认使用 Lithium(顶部有一个小菜单等)。 但有关使用视图和布局的更多信息,请查看 Lithium 文档。
楷模
了解了我们如何路由请求和显示信息之后,让我们看看如何通过创建模型来从数据库中获取信息来表示信息。 而且由于锂离子的约定很长,我们不需要做很多事情就可以看到一些很棒的结果。
首先,确保你有数据库和一个表。 我将调用我的新闻,它将有 3 列:id、title 和 body。 此外,用一些虚拟内容填充此表,以便您可以玩一些东西。 有关使用 MySQL 的更多信息,您可以阅读 DigitalOcean 上的这篇很棒的 tutorial。 但不要忘记,使用 Lithium,您可以选择使用其他存储引擎。
为了加快速度,您可以在登录 MySQL 服务器后通过运行以下命令从命令行快速创建此表:
CREATE TABLE `news` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL, `body` text NOT NULL, PRIMARY KEY (`id`) );
您还可以使用以下两个命令插入两个虚拟行:
INSERT INTO `news` (title, body) VALUES ('This is the first news article', 'some article body'); INSERT INTO `news` (title, body) VALUES ('This is other news', 'some more article body');
现在我们有了一些内容,让我们创建一个 News.php 文件来将我们的模型类保存在 app/models/ 文件夹中:
nano app/models/News.php
在里面,粘贴以下内容:
<?php namespace app\models; class News extends \lithium\data\Model { } ?>
现在,这就是我们在这个文件中所需要的。 我们扩展的基类提供了很多我们可以用来与数据交互的方法。
回到我们的 HelloController
类,在类声明上方添加以下行:
use app\models\News;
现在让我们在类中添加另一个方法:
public function news($id) { $news = News::first(array( 'conditions' => array('id' => $id) )); return array( 'news' => $news->data() ); }
此方法从 URL(新闻 id)中获取参数,检索具有该 id 的新闻,并将结果传递给视图。 它使用 Lithium Model 基类使用 find()
方法进行查询,然后使用 data()
方法在结果对象中访问数据。 现在让我们创建视图来显示新闻文章:
nano app/views/hello/news.html.php
并粘贴以下内容:
<h1><?=$news['title'];?></h1> <p><?=$news['body'];?></p>
进行这些更改时,请确保您在配置文件中具有正确的 MySQL 凭据:
nano /var/www/site/app/config/bootstrap/connections.php
如您所见,$news
变量是一个数组,其中的键以表列命名。 整洁的。 现在将您的浏览器指向以下网址:
your-ip/site/hello/news/1
你应该看到第一篇新闻文章。 将 2
作为最后一个参数传递,您应该会看到第二篇新闻文章,等等。 有关使用锂模型的更多详细信息,请阅读相应的文档 此处 。
结论
在本教程中,我们使用了 Lithium,了解了基本路由系统的工作原理以及 URL 如何转换为控制器请求。 此外,我们还了解了如何使用视图来显示从控制器传递的信息,以及如何使用模型集成我们的数据库信息。