如何在VPS上使用CakePHP创建小型Web应用程序(第1部分)

来自菜鸟教程
跳转至:导航、​搜索

关于 CakePHP

CakePHP 是一个强大而健壮的 PHP 框架,它围绕模型-视图-控制器 (MVC) 编程范式构建。 除了可以使用它来构建应用程序的灵活方式之外,它还提供了用于组织文件和数据库表名的基本结构 - 保持一切一致和合乎逻辑。

上一篇教程 中,我们看到了如何将 CakePHP 安装到您的 VPS 上并进行一些初始配置。 此外,我们已经建立了一个数据库,它将为我们的小型 Web 应用程序服务,我们将从本教程开始并在下一个教程中完成。 因此,目的是使用 CakePHP 来更好地了解如何使用它来构建您想要的应用程序。 我们将介绍一些主要概念(控制器、模型、视图等)并使用示例来演示它们是什么。 最后,我们将有一个小型应用程序,对我们的数据库表执行 CRUD(创建、读取、更新、删除)操作。

本教程假定您已遵循上一教程中介绍的所有步骤。 这意味着可以通过命令行访问您自己的运行 LAMP 堆栈的 VPS,并且已经安装和配置了 CakePHP。 换句话说,它将从上一个教程结束的地方继续。

如果你还记得,我们的应用程序的状态是一个简单的 CakePHP 安装在 /var/www/project 文件夹和一个名为 cake 的数据库,其中包含一个名为 posts[ 的表X192X],当前有一行。 让我们进入 mysql 命令行并添加另一行:

INSERT INTO posts (title,body,created)
    VALUES ('Another title', 'Another body text', NOW());

现在我们有了 2 行,我们可以继续使用 CakePHP 与这些数据进行交互。 但在此之前,先说几句关于命名约定的内容。

命名约定

如果您遵循它建议的命名约定,CakePHP 会提供一些很棒的特性。 这也可以很好地保持您的应用程序逻辑和一致性。 例如,控制器名称应该是 CamelCased,应该是复数形式,以单词 Controller 结尾(例如 PostsController)并存储在以相同方式命名的文件中(PostsController .php)。

另一方面,模型类名称是单数的,反映了单个数据模型(Post)。 此外,Model 类——如果按照约定命名——将自动推断其数据位于以复数形式命名的同名数据库表中(在本例中为 posts),并且它将被控制器具有相同的复数名称,并在末尾带有单词 Controller(在我们的示例中为 PostsController)。

这只是一个简短的介绍,有关 CakePHP 中的约定的更多信息,您可以访问 这个页面

该模型

模型类是应用程序的业务层,因为它们用于与数据交互。 在 CakePHP 中,模型通常表示一个数据库表,但它们也可以用于访问其他类型的数据。 在这方面,模型是您的数据模型(例如博客文章、评论、用户是数据模型),它们的声明位于 /app/Model 文件夹中的文件中。

在我们的应用程序中,我们将遵循命名约定,因此我们将模型类命名为 Post 并将其放入位于 app/Model 的名为 Post.php 的文件中] 文件夹。 这样,它将自动知道它应该使用我们数据库中的 posts 表,并将被 PostsController 使用。

因此,让我们继续创建文件并将其放置在以下类声明中,我们通过它扩展默认的 CakePHP 模型类来为我们的博客文章创建一个(确保在文件的开头添加 PHP 开始标记):

class Post extends AppModel {
}

保存文件并退出。 通过扩展默认的 CakePHP 模型类并遵循命名约定,这就是我们在此表上进行简单 CRUD 操作所需的全部内容,因为 CakePHP 知道该做什么。 但是,您应该知道它用于查询表的方法名称,以便您可以在控制器中实际调用它们。 我们接下来会介绍一些。

控制器

控制器用于将浏览器中的用户请求路由到应用程序中的操作。 然后,它解释请求并使用您必须以特定格式(由特定视图确定)传递请求的信息的模型。

对于我们的应用程序,我们将在文件夹 app/Controller 中名为 PostsController.php 的文件中创建一个名为 PostsController 的控制器。 然后,我们最初粘贴以下代码(确保在文件开头添加 PHP 开始标记):

class PostsController extends AppController {
    public $helpers = array('Form');
    
    public function index() {
        $this->set('posts', $this->Post->find('all'));
    }
}

这个类扩展了默认的 CakePHP Controller 类并声明了一个属性 ($helpers),它在其中存储了一些我们稍后将使用的 CakePHP 帮助程序库。 然后它创建一个 index() 方法(如果控制器没有收到关于使用哪种方法的指示,则默认调用该方法)。 CakePHP 中的方法也称为 actions

我们刚刚创建的 index() 动作使用从父控制器继承的 set() 方法将数据从控制器传递到视图(我们将在稍后创建)。 此数据存储在 posts 变量中,并从 Post 模型中检索,该模型使用 find('all') 方法检索所有我们数据库表中的帖子。 使用 $this->Post 可以使用模型的原因是我们遵循 CakePHP 命名约定。

现在我们要做的就是创建一个视图,我们将获得一个显示所有帖子的页面。

风景

视图的目的是显示控制器请求并由模型传递的数据。 使用视图,我们确保将表示与应用程序的业务逻辑分开。 现在手头的任务是创建一个视图文件来显示我们上面声明的 index() 方法检索到的信息。

CakePHP 视图位于 app/View 文件夹中,该文件夹内的文件夹以它们所属的控制器命名。 然后,我们需要将我们的视图文件放在一个名为 Posts 的文件夹中,并将其命名为 index.ctp(在请求它的方法之后)。 在里面,让我们放置以下代码:

&lth1>Blog posts&lt/h1>

&lt?php foreach ($posts as $post): ?>
&ltp>&lt?php echo $post['Post']['title']; ?> | &lt?php echo $post['Post']['created']; ?>
&lt?php endforeach; ?>
&lt?php unset($post); ?>

这将输出一个非常简单和丑陋的页面,但你会明白的。 它遍历数组 $posts(我们在控制器的 set() 方法中设置和传递),并从表中输出帖子的标题和创建日期。 因此,要获取此信息,请将浏览器指向 www.example.com/project/posts/index 或直接指向 www.example.com/project/posts(如 index() 是在未指定方法时调用的默认操作)。

如您所见,应用程序已经可以执行读取操作,而无需您编写任何代码来查询数据库。

您会注意到您的数据显示在默认的 CakePHP 布局中(位于 app/View/Layouts)。 所有视图都是布局的一部分,您可以根据需要创建任意数量的视图。 然后你所要做的就是在你的控制器中指定你想要使用的布局。 我们将在本教程的其余部分继续使用默认的,因为它是自动使用的。 有关布局的更多信息,您可以在 此处 阅读。

现在让我们看看如何在单独的视图中显示单个帖子。

为此,我们需要向 PostsController 添加另一个方法。 因此,在您定义 index() 方法的地方,粘贴以下代码:

 public function view($id = null) {
        $post = $this->Post->findById($id);
        $this->set('post', $post);
    }

在这里,由于我们只查找一个帖子,因此 Post 模型将使用 findById() 方法并将我们想要的 ID 传递给它。 此 ID 将来自 view() 操作,该操作通过以下方式从 URL 获取传递给它的参数: www.example.com/posts/view/1, 1是我们需要的帖子的ID。 然后相同的 set() 方法将传递给 View 一个名为 post 的变量,其中包含从表中检索到的帖子信息。 简单的。 在这一点上,这种方法实际上包含了最低限度。 建议您还执行一些检查以查看传递给控制器的内容是否是有效的 ID 等。

现在让我们在与之前创建的文件夹相同的文件夹中创建视图本身,命名为 view.ctp,我们将在其中放入以下代码:

&lth1>&lt?php echo h($post['Post']['title']); ?>&lt/h1>
&ltp>&ltsmall>Created: &lt?php echo $post['Post']['created']; ?>&lt/small>&lt/p>
&ltp>&lt?php echo h($post['Post']['body']); ?>&lt/p>

现在,如果您导航到 www.example.com/project/posts/view/1,您将获得 ID 为 1(标题、创建日期和正文)的帖子。

结论

在本教程中,我们了解了如何使用 CakePHP 对我们的数据创建基本的读取操作。 我们已经为我们的数据模型(帖子)声明了一个模型类,使用一个控制器来请求这些数据,并创建了几个简单的视图来在浏览器中显示它。 此外,我们已经看到了遵循 CakePHP 实现的命名约定的力量。 这样做我们不需要为我们的数据编写任何数据库查询,并且模型、控制器和视图可以轻松地“连接”起来,而无需我们指定太多。

在下一个教程中,我们将通过添加将帖子添加到表中、编辑它们并最终删除它们的可能性来完成我们的小应用程序。

文章提交者:Danny