在CakePHP v3中使用slug

时间:2015-06-02 01:07:56

标签: cakephp cakephp-3.0

我计划将CakePHP v2升级到v3网站。所以我开始通过查看博客教程&它工作正常。

接下来,我开始在我的CakePHP v2站点上进行自定义。

我想要做的第一件事就是在URL而不是id中使用slug。我在数据库中添加了slug列。

但是当我点击带有slug的网址时,我总是会收到错误。错误是

注意(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; ?>

1 个答案:

答案 0 :(得分:1)

find()方法返回一个查询对象。由于您需要与该slug匹配的单个实体,请在查询对象上调用first()

$article = $this->Articles->findBySlug($slug)->first();