Slug dengan sandaran ID dalam Laravel

PHPz
Lepaskan: 2024-07-31 02:35:12
asal
342 orang telah melayarinya

Slugs with an ID fallback in Laravel

Asal disiarkan di blog saya, briandouglas.ie

Slug menjadikan URL kelihatan sah. Tiada siapa yang mahu klik pada pautan yang berbunyi seperti https://mysite.com/blog/1. Saya pasti akan digodam jika saya mengkliknya. Tetapi bagaimana jika ia membaca https://mysite.com/blog/1/some-awesome-content. Sekarang ia kelihatan boleh dipercayai. Saya pasti akan melihat beberapa kandungan yang hebat jika saya mengklik pautan itu.

Cara Naif

Jadi bagaimana kita melaksanakannya? Kita boleh menggunakan tajuk sumber blog. Laravel menyediakan Str::slug helper yang mengambil rentetan dan melambatkannya. Maksudnya My Awesome Blog Post menjadi my-awesome-blog-post. Ini nampaknya satu idea yang bagus. Mari kemas kini model Blog kita supaya apabila ia disimpan ia menetapkan nilai slug berdasarkan tajuk.

use Illuminate\Support\Str;
use Illuminate\Database\Eloquent\Model;

class Blog extends Model
{
    protected static function boot()
    {
        parent::boot();

        static::saving(function ($model) {
            if (empty($model->slug)) {
                $model->slug = Str::slug($model->title);
            }
        });
    }
}
Salin selepas log masuk

Kini kita boleh melaksanakan laluan rancangan sumber seperti itu:

public function show(string $slug)
{
    return Blog::withSlug($slug)->first();
}
Salin selepas log masuk

Hebat. Sungguh satu pelaksanaan yang sangat mudah.

Tetapi bagaimana jika kita mengemas kini tajuk?!?

Jika tajuk dikemas kini, slug mungkin tidak lagi sepadan dengan kandungan.

Atau lebih teruk, slug mungkin mengemas kini juga!

Kemudian url sebelumnya akan mengembalikan 404, yang mungkin memecahkan kandungan terbenam.

Cara Pintar

Ya, jadi tidak mudah sekali lagi. Tajuk blog mungkin berubah. Jadi ini bukan sesuatu yang kita mahu asaskan url kita, kerana kita tidak mahu url kita berubah.

Jadi apa yang tidak patut diubah tentang blog kita? ia adalah id. Pada permulaan artikel ini kami menunjukkan url hodoh https://mysite.com/blog/1. Perkara yang baik tentang url hodoh ini ialah ia tidak sepatutnya berubah. Dengan melawatinya anda akan sentiasa melihat blog dengan id 1. Kelemahannya ialah ia tidak deskriptif. Jadi mari kita gabungkan pengecam unik id dengan slug berdasarkan tajuk blog. Dengan melakukan ini, kami mendapat url seperti itu, https://mysite.com/blog/1/my-awesome-content. Caranya di sini ialah bahagian slug url hanya untuk estetika. Ia memberi pengguna idea tentang blog dengan id 1 itu. Mari kita laksanakan ini dalam Laravel supaya url berfungsi tetapi menggunakan id semata-mata untuk mendapatkan blog dan ubah hala ke slug yang dikemas kini jika tajuk berubah.

Kod

Kita boleh mencapai senario di atas seperti itu. Pertama, dalam fail laluan kami, kami akan menentukan laluan persembahan berikut.

Route::get('blog/{blog}/{slug?}', [BlogController::class, 'show'])->name('blog.show');
Salin selepas log masuk

Kini kami akan mengemas kini model Blog kami untuk mengandungi kaedah pembantu, yang membina laluan pertunjukan baharu.

use Illuminate\Support\Str;
use Illuminate\Database\Eloquent\Model;

class Blog extends Model
{
    public function showRoute(array $parameters = [])
    {
        return route('blog.show', [$this, Str::slug($this->title), ...$parameters]);
    }
}
Salin selepas log masuk

Akhir sekali, dalam kaedah persembahan BlogController kami, kami akan menambah yang berikut.

public function show(Request $request, Blog $blog)
{
    if (! Str::contains($blog->showRoute(), $request->path())) {
        return redirect($blog->showRoute($request->query()), status: 301);
    }

    return view('blog.show', compact('blog'));
}
Salin selepas log masuk

Dalam kaedah rancangan di atas, pengikatan model laluan Laravel digunakan untuk mencari blog yang betul berdasarkan id yang dibekalkan. Kami kemudian menambah semakan tambahan untuk memastikan $request->path() sepadan dengan showRoute(). Jika tidak, kami mengubah hala ke showRoute() yang betul dengan status 301 Moved Permanently untuk memberitahu penyemak imbas bahawa slug telah dikemas kini.

Atas ialah kandungan terperinci Slug dengan sandaran ID dalam Laravel. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!