如何在没有构建仪表板模型的情况下在 cakephp 3 中创建 page/view?

How to create a page/view in cakephp 3 without a model for building a dashboard?

我的目标是创建一个没有数据库模型的 page/view - 本质上我想构建一个仪表板,它最终将充当访问多个数据表(即国家、州和性别)的门户页面) 我在 Cakephp 3x 中使用 cake-bake-all 方法创建的。

通过做一些研究,我了解到使用内置的 PagesController,我无法访问模型。如果我想构建一个仪表板,我将不得不创建自己的 PagesController,但我不知道要使用什么代码。有没有其他更简单的方法可以在一个页面上访问多个不相关的模型?任何帮助将不胜感激。

更新-

这就是我创建 Dashboard 原型的方式,感谢 Chriss 的建议!

这是我的代码 -

DashboardsController.php (/src/controller/)

<?php
namespace App\Controller;

use App\Controller\AppController;


class DashboardsController extends AppController
{

public function index()
{
  $this->loadModel ('States'); //Load models from States
  $states = $this->States->find('all');  // query all states
  $this->set('states', $states); // save states inside view

}
}
?>

index.ctp (src/Template/Dashboards/)

<?php //index function of dashboardscontroller ?>

<table>

<h2 class="col span_2_of_2"><?= ('State-Details') ?></h2>

<thead>

<tr>
<th scope="col"><?= $this->Paginator->sort('id') ?></th>
<th scope="col"><?= $this->Paginator->sort('state_name') ?></th>
<th scope="col"><?= $this->Paginator->sort('country_name') ?></th>
</tr>

</thead>

<tbody>
<?PHP foreach ($states as $state) : ?>

<tr>
<td>
<?= $this->Number->format($state->id) ?>
</td>

<td>
<?= h($state->state_name) ?>
</td>

<td>
<?= $state->has('country') ? 
$this->Html->link($state->country->country_name, ['controller' => 
'Countries', 'action' => 'view', 
 $state->country->id]) : '' ?>
</td>

<td class="actions">
<?= $this->Html->link(('View'), ['action' => 'view', $state->id]) ?>
<?= $this->Html->link(('Edit'), ['action' => 'edit', $state->id]) ?>
<?= $this->Form->postLink(('Delete'), ['action' => 'delete', $state->id], 
['confirm' => ('Are you sure you want to delete # {0}?', $state->id)]) ?>
</td>

</tr>

<?PHP endforeach; ?>
</tbody>
</table>

创建一个控制器,例如。 DasboardController 并使用 \Cake\Orm\TableRegistry::get(tableName)

您也可以使用 PagesController,但更常见的是用它传送静态页面

TableRegistry

首先在 ./src/Controller/ 中创建一个仪表板控制器,文件名为 DashboardsController.php。通常情况下,仪表板只有一个索引功能,除非您准备了多个小节。这里我们假设你只有一页。

<?PHP
  namespace App\Controller;

  use App\Controller\AppController;

  class DashboardsController extends AppController {

    public function index(){
      $this->loadModel ('States');
      $states = $this->States->find('all');  // query all states
      $this->set ('states', $states); // save states inside view
    }
  }  // end class DashboardsController
?>

那是来自 MVC 的 C。

除非您的 table 和实体中有特殊功能,否则没有必要创建 Table class 或实体 class 除非您需要 PHPDoc声明。 Cake ORM 为您接管(默认 class)。 那么让我们回顾一下 MVC 中的 M。

$this->loadModel ('States'); 只加载控制器内部的模型。不会少,但不会多。如果您已将模型加载到控制器中,您可以使用 $this->States(例如 $this->States->find('all');)访问该模型。

现在您必须将结果保存在视图中(来自控制器:$this->set ('states', $states);)。

最后一部分是来自 MVC 的视图 (V)。

./src/Template/Dashboards/ 中创建一个名称为 index.ctp 的文件(这是 Dashboards Controller 中索引函数(操作)的模板文件)。

<?PHP /* index function of Dashboards Controller */ ?>
<ul>
  <?PHP foreach ($states as $state) : ?>
    <li><?=$state->title; ?></li>
  <?PHP endforeach; ?>
</ul>

现在您可以使用 url 后跟控制器名称(例如 http://{url-to-your-cake-system}/dashboards/)访问仪表板。

就是这样。 Cake 使用概念"convention over configuration"。因此,如果您坚持约定(文件结构、文件名、class 名称、table 名称等),Cake 或多或少会自动为您完成。

P.S。在我看来,使用 TableRegistry 的方法只有几种(甚至更不正确)。你应该从一开始就尽量避免它。

  1. 使用 index 方法创建 DashboradController 或在 PageController 添加 dashboard() 方法。
  2. 创建Dashborad\index.ctp 或Page\dashboard.ctp
  3. 为各种数据展示创建简单的 Cells(例如:每小时、每天、每周......)并包含在您的 index.ctp / dashboard.ctp
  4. 路由到您的仪表板