在 CakePHP v3 中使用 slug
Using slug in CakePHP v3
我计划将我的 CakePHP v2 网站升级到 v3 网站。所以我开始通过查看博客教程来学习并且它工作正常。
接下来,我开始基于我的 CakePHP v2 站点进行自定义。
我想做的第一件事是在 URL 中使用 slug 而不是 id。我在数据库中添加了 slug 列。
但是当我点击带有 slug 的 url 时,我总是得到一个错误。错误是
通知 (8):未定义 属性:Cake\ORM\Query::$created [APP/Template/Articles/view.ctp,第 3 行]
非常感谢对此的帮助。
这是我的路线
$routes->connect('/', ['controller' => 'Articles', 'action' => 'index']);
$routes->connect('/articles/:slug', ['controller' => 'Articles', 'action' => 'view'], ['pass' => ['slug']]);
这是我的控制器
public function index()
{
$this->set('articles', $this->Articles->find('all'));
}
public function view($slug = null)
{
$article = $this->Articles->findBySlug($slug);
$this->set(compact('article'));
}
这是我的index.ctp
<h1>Blog articles</h1>
<table>
<tr>
<th>Id</th>
<th>Title</th>
<th>Created</th>
<th>Slug</th>
</tr>
<?php foreach ($articles as $article): ?>
<tr>
<td><?= $article->id ?></td>
<td>
<?= $this->Html->link($article->title, ['action' => 'view', $article->slug]) ?>
</td>
<td>
<?= $article->created ?>
</td>
<td>
<?= $article->slug ?>
</td>
</tr>
<?php endforeach; ?>
find()
方法returns一个查询对象。由于您想要与该 slug 匹配的单个实体,请在查询对象上调用 first()
:
$article = $this->Articles->findBySlug($slug)->first();
我计划将我的 CakePHP v2 网站升级到 v3 网站。所以我开始通过查看博客教程来学习并且它工作正常。
接下来,我开始基于我的 CakePHP v2 站点进行自定义。
我想做的第一件事是在 URL 中使用 slug 而不是 id。我在数据库中添加了 slug 列。
但是当我点击带有 slug 的 url 时,我总是得到一个错误。错误是
通知 (8):未定义 属性:Cake\ORM\Query::$created [APP/Template/Articles/view.ctp,第 3 行]
非常感谢对此的帮助。
这是我的路线
$routes->connect('/', ['controller' => 'Articles', 'action' => 'index']);
$routes->connect('/articles/:slug', ['controller' => 'Articles', 'action' => 'view'], ['pass' => ['slug']]);
这是我的控制器
public function index()
{
$this->set('articles', $this->Articles->find('all'));
}
public function view($slug = null)
{
$article = $this->Articles->findBySlug($slug);
$this->set(compact('article'));
}
这是我的index.ctp
<h1>Blog articles</h1>
<table>
<tr>
<th>Id</th>
<th>Title</th>
<th>Created</th>
<th>Slug</th>
</tr>
<?php foreach ($articles as $article): ?>
<tr>
<td><?= $article->id ?></td>
<td>
<?= $this->Html->link($article->title, ['action' => 'view', $article->slug]) ?>
</td>
<td>
<?= $article->created ?>
</td>
<td>
<?= $article->slug ?>
</td>
</tr>
<?php endforeach; ?>
find()
方法returns一个查询对象。由于您想要与该 slug 匹配的单个实体,请在查询对象上调用 first()
:
$article = $this->Articles->findBySlug($slug)->first();