Hello ! Je suis partie sur mon petit framework favoris avec la nouvelle version de Cake 3, enfin elle n'est plus en beta, bref je suis au niveau de la réecritures d'URL, pour les articles tout fonctionne très bien blog/slug-de-larticle
et pour les catégories j'aimerais blog/categories/slug-de-la-category
Naturellement je réaliser ma route comme ceci

$routes->connect('blog/categories/:category', ['controller' => 'Categories', 'action' => 'view'], ['slug' => $slug]);
// CategoriesController@view
public function view()
    {
        $category = $this->Categories->find('all', [
            'conditions'    => ['Categories.published' => 1, 'Categories.slug' => $this->request->param('slug')],
            'contain'       => ['Posts']
        ])->first();
        $this->layout = 'blog';
        $this->set('category', $category);
        $this->set('_serialize', ['category']);
    }
    // Getter Category.php dans Entity
    public function _getUrl(){
        return ['controller' => 'Categories', 'action' => 'view', 'slug' => $this->slug];
    }

Le soucis c'est que mon getter me génére
categories/view?slug=category-1 ^^ je ne comprend pas pourquoi ...

2 réponses


Bonjour,
Je te conseil de ne pas travailler uniquement avec des slugs mais avec des slugs + id. Car si pour x raison tu te retrouve avec le même slug pour 2 catégories différentes, alors il y aura un problème au moment de retrouver la catégorie en question.

Sinon, tu peut déjà utiliser mon plugin qui permet de slugger automatiquement un field par rapport à un autre field (Exemple : titre d'un article) et il dispose aussi d'un custom finder : https://github.com/Xety/Cake3-Sluggable Tout est marqué dans la doc pour la configuration.

Avec ce plugin ton finder sera :

 $category = $this->Categories
    ->find('slug', [
        'slug' => $this->request->slug,
        'slugField' => 'Categories.slug'
    ])
    ->conditions([
        'Categories.published' => 1,
    ])
    ->contain([
        'Posts'
    ])
    ->first();

Pour les routes :

$routes->connect(
    '/blog/categories/:slug',
    [
        'controller' => 'categories',
        'action' => view'
    ],
    [
        '_name' => 'categories-view',
        'routeClass' => 'SlugRoute',
        'pass' => [
            'slug'
        ]
    ]
);

Pour slug les routes automatiquement, utilise cette routeClass : https://github.com/Xety/Xeta/blob/forum/src/Routing/Route/SlugRoute.php Cette classe va automatiquement slugger tes routes quand tu fera des urls dans tes views, par exemple :

//$categorie->title = "My awesome title";
$this->Url->build([
    '_name' => 'categories-view',
    'slug' => $categorie->title
]);
//Va générer cette url
/blog/categories/my-awesome-title
Muxabble
Auteur

@xeta merci pour ton information, je suit ton projet x) d'ailleurs je n'ai pas du tout pensé à utiliser ton plugin !
Le problème du slug + id c'est que je n'aime pas trop j'aimerais me rapprocher le plus de wordpress pour les url x) d'ailleurs ton blog ne l'utilise pas x)