Ślimaki Laravel z Str:: ślimak

Patrząc na Str:: slug dla mojego generowania URL frontend ale tylko zastanawiam się jak wam idzie implementacja go z trasami itp, na przykład, jak byście się zmienili http://www.example.com/courses/1 do http://www.example.com/courses/this-course

Author: Gareth Daine, 2013-07-01

5 answers

OK, zrobiłem to w ten sposób:

// I have a slug field in my courses table and a slug field in my categories table, along with a category_id field in my courses table.

// Route 

Route::get('courses/{categorySlug}/{slug?}', function($categorySlug, $slug) {
    $course = Course::leftJoin('categories', 'categories.id', 'courses.category_id')
        ->where('categories.slug', $categorySlug)
        ->where('courses.slug', $slug)
        ->firstOrFail();

    return View::make('courses.show')->with('course', $course);
});
Działa jak urok. Otrzymuje zmienne $ categorySlug i $slug, a następnie używa ich do filtrowania wymownego kursu modelu, aby uzyskać prawidłowy obiekt kursu z bazy danych.

EDIT : możesz wygenerować adres URL w widoku:

Http://www.example.com/courses/it-training/mcse

Robiąc coś takiego:

<a href="{{ URL::to('courses/'.$course->category->parentCategorySlug($course->category->parent_id).'/'.$course->category->slug.'/'. $course->slug) }}" title="{{ $course->title }}">{{ $course->title }}</a>

A mają metodę w mojej kategorii jak poniżej, która pobiera SLUG kategorii nadrzędnej. To można lepiej osiągnąć, używając jakiejś klasy prezentera, która pozwoliłaby ci po prostu użyć $course- > url, ale jeszcze tego nie zrobiłem. Zaktualizuję odpowiedź, kiedy to zrobię.

public function parentCategorySlug($parentId)
{
    if ($parentId === '0')
    {
        return $this->slug;
    }

    return $this->where('id', $parentId)->first()->slug;
}
 11
Author: Gareth Daine,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-10 14:26:16
 5
Author: cawecoy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-11 14:00:03

Jak dla mnie stworzyłem funkcję helpera i zastosowałem następującą metodę zaczerpniętą z tutaj .

 public static function getSlug($title, $model) {
    $slug = Str::slug($title);
    $slugCount = count( $model->whereRaw("url REGEXP '^{$slug}(-[0-9]*)?$'")->get() );
    return ($slugCount > 0) ? "{$slug}-{$slugCount}" : $slug;
}
 3
Author: Mr. Crowley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-18 19:16:45

Zaimplementowałem również podobne mapowanie URL, ale wolałem mieć zarówno ID, jak i slug w żądanym adresie URL, jak to:

http://www.example.com/courses/1/my-laravel-course

Ta metoda pozwala mi uzyskać żądany obiekt course z identyfikatora podanego w adresie URL, zamiast konieczności przechowywania ślimaków w mojej tabeli DB.

Route::post('courses/(:num)/(:any)', function ($courseid, $slug) {
    $course = Course::where('id', '=', $courseid)->get();
    return View::make('courses.show')->with('course', $course);
}
 1
Author: deepika jain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-01 10:47:01

Możesz utworzyć powiązany Model ślimaka i podejść do kursu w swoich metodach tak:

$course = Slug::where('slug', $slug) -> firstOrFail() -> course;
 1
Author: reshetech,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-22 06:43:57