Хорошо, это потребует некоторой настройки:
Я работаю над методом использования красивых заголовков сообщений в URL-адресах моего блога на cakePHP.
Например: /blog/post-title-here
вместо /blog/view_post/123
.
Поскольку я, очевидно, не собираюсь писать новый метод для каждого поста, я пытаюсь быть ловким и использовать обратные вызовы CakePHP, чтобы эмулировать поведение магического метода __call()
в PHP 5. Для тех, кто не знает, диспетчер CakePHP проверяет, существует ли метод, и выдает ошибку cakePHP, прежде чем __call()
можно будет вызвать в контроллере.
Что я сделал до сих пор:
В интересах полного раскрытия информации (потому что я понятия не имею, почему у меня возникла проблема), у меня есть два маршрута:
Router::connect('/blog/:action/*', array('controller' => 'blog_posts'));
Router::connect('/blog/*', array('controller' => 'blog_posts'));
Они устанавливают псевдоним для BlogPostsController, чтобы мой URL-адрес не выглядел как /blog_posts/action
Затем в BlogPostsController:
public function beforeFilter() {
parent::beforeFilter();
if (!in_array($this->params['action'], $this->methods)) {
$this->setAction('single_post', $this->params['action']);
}
}
public function single_post($slug = NULL) {
$post = $this->BlogPost->get_post_by_slug($slug);
$this->set('post', $post);
//$this->render('single_post');
}
beforeFilter
перехватывает несуществующие действия и передает их моему методу single_post
. single_post
получает данные из модели и устанавливает переменную $post
для представления.
Также есть метод index
, который отображает 10 последних сообщений.
Вот сбивающая с толку часть:
Вы заметите, что есть метод $this->render
, закомментированный выше.
- Когда я не вызываю
$this->render('single_post')
, представление отображается один раз, но переменная$post
не устанавливается. - Когда я делаю вызов
$this->render('single_post')
, представление отображается с установленной переменной$post
, а затем снова отображается с ее не заданной. Таким образом, я получаю два полных макета один за другим в одном и том же документе. Один с содержанием, другой без.
Я пробовал использовать метод с именем single_post
и метод с именем __single_post
, и у обоих одна и та же проблема. Я бы предпочел, чтобы конечным результатом был метод с именем __single_post
, чтобы к нему нельзя было получить прямой доступ с помощью URL-адреса /blog/single_post
.
Также
Я еще не закодировал обработку ошибок, когда сообщение не существует (так что, когда люди вводят случайные вещи в URL-адрес, они не получают представление single_post). Я планирую сделать это после того, как выясню эту проблему.