如何使用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 如何转换为控制器请求。 此外,我们还了解了如何使用视图来显示从控制器传递的信息,以及如何使用模型集成我们的数据库信息。

文章提交者: [[“%3Ca|http]] ://www.webomelette.com/ [[“%3C/a|”>丹尼]]