Temat: znów trasowanie
1/3. Wygodniej. Parametry są przekazywane jako argumenty do funkcji: id -> $postId, slug -> $postSlug
public function view($postId, $postSlug) {
//masz je też dostępnę tutaj
if (!empty($this->request->params['pass'[0])) {
$id = $this->request->params['pass'][0];
}
if (!empty($this->request->params['pass'[1])) {
$slug = $this->request->params['pass'][1];
}
}
a) Najprościej. Brak kontroli nad tym ile i jakie parametry są akceptowane.
Router::connect('/blog/post/*', array('plugin' => 'blog', 'controller' => 'posts', 'action' => 'view'));
b) Dużo lepsza opcja. Kontrolujesz zarówno liczbę jak i typ parametrów.
Router::connect('/blog/post/:id/:slug', array('plugin' => 'blog', 'controller' => 'posts', 'action' => 'view'), array('pass' => array('id', 'slug'), 'id' => $ID, 'slug' => '[a-z]{3,10}'));
2. Tak jak opisany jest ten przykład w dokumentacji, możesz zdefiniować globalne (rozpoznawane przez wszystkie routes) named params np.
Router::connectNamed(array('category', 'tag'), array('default' => true));
lub zdefiniować je dla konkretnej ścieżki (przykład, który wkleiłeś).
To odnośnie samego definiowania named params.
Inna sprawa to gdzie warto wykorzystywać i dlaczego to może być lepsza od passed params.
Chyba najczęściej wykorzystywanym miejscem dla named params jest stronnicowanie z filtrowaniem.
Router::connectNamed(array('category' => '^[a-z]{5,10}$', 'tag'), array('default' => true, 'greedy' => false));
Router::connect('/blog/*', array('plugin' => 'blog', 'controller' => 'posts', 'action' => 'index'));
Powyższe obsłuży np:
/blog/category:gotowanie
/blog/tag:kolacja
/blog/category:gotowanie/tag:kolacja
/blog/tag:kolacja/page:2
ale już nie:
/blog/category:moje (w tym wypadku całe "category:moje" wpadnie do pass)
W kontrolerze robisz:
public function index() {
if (!empty($this->request->params['named']['category'])) {
$category = $this->request->params['named']['category'];
}
if (!empty($this->request->params['named']['tag'])) {
$tag = $this->request->params['named']['tag'];
}
//...
}
To samo można by osiągnąć za pomocą passed params, ale było by dużo mniej wygodnie. Trzeba by zadbać o odpowiednią kolejność i dla category i tag wykorzystywać jakieś domyślne wartości.
Zernij na Cake/Test/Case/Routing/RouterTest.php