วิธีสไตล์ Laravel ง่ายๆ ในการสร้าง breadcrumbs
โปรเจ็กต์นี้เป็นทางแยกอย่างเป็นทางการของ Laravel Breadcrumbs ดั้งเดิมที่น่าอัศจรรย์โดย Dave James Miller และคงเป็นไปไม่ได้หากไม่มีผู้มีส่วนร่วมที่ยอดเยี่ยมในวันแรก ขอบคุณทุกคน!
| ลาราเวล | เกล็ดขนมปัง Laravel |
|---|---|
| 11.x | 9.x |
| 10.x | 9.x |
| 9.x | 9.x |
| 8.x | 9.x |
| 7.x | 8.x |
| 6.x | 8.x |
สำหรับ Laravel เวอร์ชันเก่า ให้อ้างอิงโครงการ GitHub ดั้งเดิม แท็กทั้งหมดได้รับการมิเรอร์หากคุณต้องการอ้างอิงแพ็คเกจนี้ แต่จะไม่มีความแตกต่างในการทำงาน
composer require diglactic/laravel-breadcrumbs สร้างไฟล์ชื่อ routes/breadcrumbs.php ที่มีลักษณะดังนี้:
<?php // routes/breadcrumbs.php
// Note: Laravel will automatically resolve `Breadcrumbs::` without
// this import. This is nice for IDE syntax and refactoring.
use Diglactic Breadcrumbs Breadcrumbs ;
// This import is also not required, and you could replace `BreadcrumbTrail $trail`
// with `$trail`. This is nice for IDE type checking and completion.
use Diglactic Breadcrumbs Generator as BreadcrumbTrail ;
// Home
Breadcrumbs:: for ( ' home ' , function ( BreadcrumbTrail $ trail ) {
$ trail -> push ( ' Home ' , route ( ' home ' ));
});
// Home > Blog
Breadcrumbs:: for ( ' blog ' , function ( BreadcrumbTrail $ trail ) {
$ trail -> parent ( ' home ' );
$ trail -> push ( ' Blog ' , route ( ' blog ' ));
});
// Home > Blog > [Category]
Breadcrumbs:: for ( ' category ' , function ( BreadcrumbTrail $ trail , $ category ) {
$ trail -> parent ( ' blog ' );
$ trail -> push ( $ category -> title , route ( ' category ' , $ category ));
});ดูส่วนการกำหนด Breadcrumbs สำหรับรายละเอียดเพิ่มเติม
ตามค่าเริ่มต้น รายการ Breadcrumb ของ Bootstrap 5 จะถูกเรนเดอร์ หากต้องการเปลี่ยนแปลง ให้เตรียมใช้งานไฟล์กำหนดค่าโดยรันคำสั่งนี้:
php artisan vendor:publish --tag=breadcrumbs-config จากนั้น เปิด config/breadcrumbs.php และแก้ไขบรรทัดนี้:
// config/breadcrumbs.php
' view ' => ' breadcrumbs::bootstrap5 ' ,ค่าที่เป็นไปได้คือ:
breadcrumbs::bootstrap5 – บูทสแตรป 5breadcrumbs::bootstrap4 – บูทสแตรป 4breadcrumbs::bulma – บูลมาbreadcrumbs::foundation6 – รากฐาน 6breadcrumbs::json-ld – ข้อมูลที่มีโครงสร้าง JSON-LDbreadcrumbs::materialize – เป็นรูปธรรมbreadcrumbs::tailwind – CSS ของ Tailwindbreadcrumbs::uikit – UIkitpartials.breadcrumbsดูส่วนเทมเพลตแบบกำหนดเองสำหรับรายละเอียดเพิ่มเติม
คุณยังระบุมุมมองที่กำหนดเองขณะรันไทม์ได้ด้วย
เรียก Breadcrumbs::render() ในมุมมองสำหรับแต่ละหน้า โดยส่งชื่อของ breadcrumb ที่จะใช้และพารามิเตอร์เพิ่มเติมใดๆ:
{{-- resources/views/home.blade.php --}}
{{ Breadcrumbs :: render ( ' home ' ) } }
{{-- resources/views/categories/show.blade.php --}}
{{ Breadcrumbs :: render ( ' category ' , $category ) } }ดูส่วนเอาท์พุตเบรดครัมบ์สำหรับตัวเลือกเอาท์พุตอื่นๆ และดูเบรดครัมบ์ผูกเส้นทางสำหรับวิธีลิงก์ชื่อเบรดครัมบ์กับชื่อเส้นทางโดยอัตโนมัติ
Breadcrumbs มักจะสอดคล้องกับการกระทำหรือประเภทของเพจ สำหรับเบรดครัมบ์แต่ละรายการ คุณต้องระบุชื่อ ชื่อเบรดครัมบ์ และ URL ที่จะลิงก์ไป เนื่องจากสิ่งเหล่านี้มีแนวโน้มที่จะเปลี่ยนแปลงแบบไดนามิก คุณจึงทำเช่นนี้ในการปิด และคุณส่งตัวแปรใดๆ ที่คุณต้องการไปยังการปิด
ตัวอย่างต่อไปนี้ควรทำให้ชัดเจน:
Breadcrumb ที่ง่ายที่สุดน่าจะเป็นหน้าแรกของคุณ ซึ่งจะมีลักษณะดังนี้:
<?php // routes/breadcrumbs.php
use Diglactic Breadcrumbs Breadcrumbs ;
use Diglactic Breadcrumbs Generator as BreadcrumbTrail ;
Breadcrumbs:: for ( ' home ' , function ( BreadcrumbTrail $ trail ) {
$ trail -> push ( ' Home ' , route ( ' home ' ));
});สำหรับการสร้าง URL คุณสามารถใช้วิธีสร้าง URL ของ Laravel มาตรฐานใดก็ได้ รวมถึง:
url('path/to/route') ( URL::to() )secure_url('path/to/route')route('routename') หรือ route('routename', 'param') หรือ route('routename', ['param1', 'param2']) ( URL::route() )action('controller@action') ( URL::action() )'http://www.example.com/' )ตัวอย่างนี้จะแสดงผลดังนี้:
{{ Breadcrumbs :: render ( ' home ' ) } }และผลลัพธ์ที่ได้คือ:
บ้าน
นี่เป็นหน้าคงที่อีกหน้าหนึ่ง แต่มีลิงก์หลักอยู่ข้างหน้า:
<?php // routes/breadcrumbs.php
use Diglactic Breadcrumbs Breadcrumbs ;
use Diglactic Breadcrumbs Generator as BreadcrumbTrail ;
Breadcrumbs:: for ( ' blog ' , function ( BreadcrumbTrail $ trail ) {
$ trail -> parent ( ' home ' );
$ trail -> push ( ' Blog ' , route ( ' blog ' ));
}); มันทำงานโดยการเรียกการปิดสำหรับ home แสดงเส้นทางหลักที่กำหนดไว้ข้างต้น
มันจะแสดงผลเช่นนี้:
{{ Breadcrumbs :: render ( ' blog ' ) } }และผลลัพธ์ที่ได้คือ:
หน้าแรก / บล็อก
โปรดทราบว่าเทมเพลตเริ่มต้นจะไม่สร้างลิงก์สำหรับเบรดครัมบ์สุดท้าย (ลิงก์สำหรับหน้าปัจจุบัน) แม้ว่าจะระบุ URL ก็ตาม คุณสามารถแทนที่สิ่งนี้ได้ด้วยการสร้างเทมเพลตของคุณเอง – ดูเทมเพลตแบบกำหนดเองสำหรับรายละเอียดเพิ่มเติม
นี่คือเพจที่สร้างขึ้นแบบไดนามิกที่ดึงมาจากฐานข้อมูล:
<?php // routes/breadcrumbs.php
use App Models Post ;
use Diglactic Breadcrumbs Breadcrumbs ;
use Diglactic Breadcrumbs Generator as BreadcrumbTrail ;
Breadcrumbs:: for ( ' post ' , function ( BreadcrumbTrail $ trail , Post $ post ) {
$ trail -> parent ( ' blog ' );
$ trail -> push ( $ post -> title , route ( ' post ' , $ post ));
}); วัตถุ $post (อาจเป็น Eloquent Model แต่อาจเป็นอะไรก็ได้) จะถูกส่งผ่านจากมุมมอง:
{{ Breadcrumbs :: render ( ' post ' , $post ) } }ผลลัพธ์ที่ได้คือผลลัพธ์นี้:
หน้าแรก / บล็อก / หัวข้อโพสต์
คุณยังสามารถเรียกเมธอดลูกโซ่ $trail ได้ด้วย หากคุณใช้ PHP 7.4 ขึ้นไปพร้อมการรองรับฟังก์ชันลูกศร คุณอาจต้องการไวยากรณ์ที่กระชับกว่านี้ดังต่อไปนี้:
Breadcrumbs:: for (
' post ' ,
fn ( BreadcrumbTrail $ trail , Post $ post ) => $ trail
-> parent ( ' blog ' )
-> push ( $ post -> title , route ( ' post ' , $ post ))
); สุดท้ายนี้ หากคุณมีหมวดหมู่ที่ซ้อนกันหรือมีข้อกำหนดพิเศษอื่นๆ คุณสามารถเรียก $trail->push() ได้หลายครั้ง:
<?php // routes/breadcrumbs.php
use App Models Category ;
use Diglactic Breadcrumbs Breadcrumbs ;
use Diglactic Breadcrumbs Generator as BreadcrumbTrail ;
Breadcrumbs:: for ( ' category ' , function ( BreadcrumbTrail $ trail , Category $ category ) {
$ trail -> parent ( ' blog ' );
foreach ( $ category -> ancestors as $ ancestor ) {
$ trail -> push ( $ ancestor -> title , route ( ' category ' , $ ancestor ));
}
$ trail -> push ( $ category -> title , route ( ' category ' , $ category ));
});หรือคุณสามารถสร้างฟังก์ชันแบบเรียกซ้ำได้ดังนี้:
<?php // routes/breadcrumbs.php
use App Models Category ;
use Diglactic Breadcrumbs Breadcrumbs ;
use Diglactic Breadcrumbs Generator as BreadcrumbTrail ;
Breadcrumbs:: for ( ' category ' , function ( BreadcrumbTrail $ trail , Category $ category ) {
if ( $ category -> parent ) {
$ trail -> parent ( ' category ' , $ category -> parent );
} else {
$ trail -> parent ( ' blog ' );
}
$ trail -> push ( $ category -> title , route ( ' category ' , $ category -> slug ));
});ทั้งสองจะแสดงผลดังนี้:
{{ Breadcrumbs :: render ( ' category ' , $category ) } }และส่งผลให้สิ่งนี้:
หน้าแรก / บล็อก / หมวดหมู่ปู่ย่าตายาย / หมวดหมู่ผู้ปกครอง / ชื่อหมวดหมู่
หากต้องการปรับแต่ง HTML ให้สร้างไฟล์มุมมองของคุณเองคล้ายกับตัวอย่างต่อไปนี้:
{{-- resources/views/partials/breadcrumbs.blade.php --}}
@unless ( $breadcrumbs -> isEmpty () )
< ol class = " breadcrumb " >
@foreach ( $breadcrumbs as $breadcrumb )
@if ( ! is_null ( $breadcrumb -> url ) && ! $loop -> last )
< li class = " breadcrumb-item " >< a href = " {{ $breadcrumb -> url } } " > {{ $breadcrumb -> title } } </ a ></ li >
@else
< li class = " breadcrumb-item active " > {{ $breadcrumb -> title } } </ li >
@endif
@endforeach
</ ol >
@endunlessหากคุณต้องการทำงานกับเทมเพลตที่มีอยู่แล้วภายใน ให้รันคำสั่งต่อไปนี้:
php artisan vendor:publish --tag=breadcrumbs-views การดำเนินการนี้จะคัดลอกเทมเพลตในตัวทั้งหมดไปยังไดเร็กทอรี resources/views/vendor/breadcrumbs/ ในโปรเจ็กต์ของคุณ เพื่อให้คุณแก้ไขได้โดยตรง
มุมมองจะได้รับคอลเลกชันที่เรียกว่า $breadcrumbs
Breadcrumb แต่ละอันเป็นออบเจ็กต์ที่มีคีย์ต่อไปนี้:
title – ชื่อ breadcrumburl – URL breadcrumb หรือ null หากไม่ได้รับ$data (ดูข้อมูลที่กำหนดเอง)จากนั้น อัปเดตไฟล์กำหนดค่าของคุณด้วยชื่อมุมมองที่กำหนดเอง:
// config/breadcrumbs.php
' view ' => ' partials.breadcrumbs ' , // --> resources/views/partials/breadcrumbs.blade.php หรือคุณสามารถข้ามมุมมองที่กำหนดเองและเรียก Breadcrumbs::generate() เพื่อรับคอลเลกชัน breadcrumbs โดยตรง:
@foreach ( Breadcrumbs :: generate ( ' post ' , $post ) as $breadcrumb )
{{-- ... --}}
@endforeach เรียก Breadcrumbs::render() ในมุมมองสำหรับแต่ละหน้า โดยส่งชื่อของ breadcrumb ที่จะใช้และพารามิเตอร์เพิ่มเติมใดๆ
{{ Breadcrumbs :: render ( ' home ' ) } }หรือด้วยพารามิเตอร์:
{{ Breadcrumbs :: render ( ' category ' , $category ) } } หากต้องการแสดงผลเบรดครัมบ์เป็นข้อมูลที่มีโครงสร้าง JSON-LD (โดยปกติแล้วด้วยเหตุผล SEO) ให้ใช้ Breadcrumbs::view() เพื่อแสดงเทมเพลต breadcrumbs::json-ld นอกเหนือจากเทมเพลตปกติ ตัวอย่างเช่น:
< html >
< head >
...
{{ Breadcrumbs :: view ( ' breadcrumbs::json-ld ' , ' category ' , $category ) } }
...
</ head >
< body >
...
{{ Breadcrumbs :: render ( ' category ' , $category ) } }
...
</ body >
</ html > (หมายเหตุ: หากคุณใช้ Laravel Page Speed คุณอาจต้องปิดการใช้งานมิดเดิลแวร์ TrimUrls )
หากต้องการระบุรูปภาพ ให้เพิ่มรูปภาพนั้นลงในพารามิเตอร์ $data ใน push() :
<?php // routes/breadcrumbs.php
use App Models Post ;
use Diglactic Breadcrumbs Breadcrumbs ;
use Diglactic Breadcrumbs Generator as BreadcrumbTrail ;
Breadcrumbs:: for ( ' post ' , function ( BreadcrumbTrail $ trail , Post $ post ) {
$ trail -> parent ( ' home ' );
$ trail -> push ( $ post -> title , route ( ' post ' , $ post ), [ ' image ' => asset ( $ post -> image )]);
});(หากคุณต้องการใช้ Microdata หรือ RDFa คุณจะต้องสร้างเทมเพลตแบบกำหนดเอง)
ในการใช้งานปกติ คุณต้องเรียก Breadcrumbs::render($name, $params...) เพื่อเรนเดอร์ breadcrumbs ในทุกหน้า หากต้องการ คุณสามารถตั้งชื่อ breadcrumbs ให้เหมือนกับเส้นทางของคุณและหลีกเลี่ยงความซ้ำซ้อนนี้ได้
ตรวจสอบให้แน่ใจว่าแต่ละเส้นทางของคุณมีชื่อ
<?php // routes/web.php
use Illuminate Support Facades Route ;
// Home
Route:: name ( ' home ' )-> get ( ' / ' , ' HomeController@index ' );
// Home > [Post]
Route:: name ( ' post ' )-> get ( ' /post/{id} ' , ' PostController@show ' );สำหรับรายละเอียดเพิ่มเติม โปรดดูที่ Named Routes ในเอกสารประกอบของ Laravel
สำหรับแต่ละเส้นทาง ให้สร้างเบรดครัมบ์ที่มีชื่อและพารามิเตอร์เดียวกัน ตัวอย่างเช่น:
<?php // routes/breadcrumbs.php
use App Models Post ;
use Diglactic Breadcrumbs Breadcrumbs ;
use Diglactic Breadcrumbs Generator as BreadcrumbTrail ;
// Home
Breadcrumbs:: for ( ' home ' , function ( BreadcrumbTrail $ trail ) {
$ trail -> push ( ' Home ' , route ( ' home ' ));
});
// Home > [Post]
Breadcrumbs:: for ( ' post ' , function ( BreadcrumbTrail $ trail , Post $ post ) {
$ trail -> parent ( ' home ' );
$ trail -> push ( $ post -> title , route ( ' post ' , $ post ));
}); หากต้องการเพิ่ม breadcrumbs ให้กับหน้า 404 Not Found ที่กำหนดเอง ให้ใช้ชื่อ errors.404 :
Breadcrumbs:: for ( ' errors.404 ' , function ( BreadcrumbTrail $ trail ) {
$ trail -> parent ( ' home ' );
$ trail -> push ( ' Page Not Found ' );
}); เรียก Breadcrumbs::render() โดยไม่มีพารามิเตอร์ในไฟล์เลย์เอาต์ของคุณ:
{{-- resources/views/app.blade.php --}}
{{ Breadcrumbs :: render () } } สิ่งนี้จะส่งสัญญาณ breadcrumb ที่สอดคล้องกับเส้นทางปัจจุบันโดยอัตโนมัติ เช่นเดียวกับ Breadcrumbs::generate() และ Breadcrumbs::view() :
เราจะโยน InvalidBreadcrumbException หากไม่มี breadcrumb เพื่อเตือนให้คุณสร้างขึ้นใหม่ หากต้องการปิดใช้งานสิ่งนี้ (เช่น หากคุณมีบางหน้าที่ไม่มี breadcrumbs) ให้เริ่มต้นไฟล์กำหนดค่าก่อน หากคุณยังไม่ได้ดำเนินการ:
php artisan vendor:publish --tag=breadcrumbs-configจากนั้นเปิดไฟล์ที่สร้างขึ้นใหม่และตั้งค่านี้:
// config/breadcrumbs.php
' missing-route-bound-breadcrumb-exception ' => false, ในทำนองเดียวกัน เพื่อป้องกันไม่ให้ส่ง UnnamedRouteException หากเส้นทางปัจจุบันไม่มีชื่อ ให้ตั้งค่านี้:
// config/breadcrumbs.php
' unnamed-route-exception ' => false,Laravel Breadcrumbs ใช้การเชื่อมโยงโมเดลเดียวกันกับคอนโทรลเลอร์ ตัวอย่างเช่น:
<?php // routes/web.php
use Illuminate Support Facades Route ;
Route:: name ( ' post ' )-> get ( ' /post/{post} ' , ' PostController@show ' ); <?php // app/Http/Controllers/PostController.php
use App Http Controllers Controller ;
use App Models Post ;
use Illuminate Contracts View View ;
class PostController extends Controller
{
public function show ( Post $ post ): View // <-- Route bound model is injected here
{
return view ( ' post/show ' , [ ' post ' => $ post ]);
}
} <?php // routes/breadcrumbs.php
use App Models Post ;
use Diglactic Breadcrumbs Breadcrumbs ;
use Diglactic Breadcrumbs Generator as BreadcrumbTrail ;
Breadcrumbs:: for ( ' post ' , function ( BreadcrumbTrail $ trail , Post $ post ) { // <-- The same Post model is injected here
$ trail -> parent ( ' home ' );
$ trail -> push ( $ post -> title , route ( ' post ' , $ post ));
});ซึ่งจะทำให้โค้ดของคุณละเอียดน้อยลงและมีประสิทธิภาพมากขึ้นโดยการโหลดโพสต์จากฐานข้อมูลเพียงครั้งเดียว
สำหรับรายละเอียดเพิ่มเติม โปรดดูการเชื่อมโยงโมเดลเส้นทางในเอกสารประกอบของ Laravel
Laravel จะสร้างชื่อเส้นทางโดยอัตโนมัติสำหรับตัวควบคุมที่รอบรู้ เช่น photo.index ซึ่งคุณสามารถใช้เมื่อกำหนด breadcrumbs ของคุณ ตัวอย่างเช่น:
<?php // routes/web.php
use App Http Controllers PhotoController ;
use Illuminate Support Facades Route ;
Route:: resource ( ' photo ' , PhotoController::class); $ php artisan route:list
+--------+----------+--------------------+---------------+-------------------------+------------+
| Domain | Method | URI | Name | Action | Middleware |
+--------+----------+--------------------+---------------+-------------------------+------------+
| | GET|HEAD | photo | photo.index | PhotoController@index | |
| | GET|HEAD | photo/create | photo.create | PhotoController@create | |
| | POST | photo | photo.store | PhotoController@store | |
| | GET|HEAD | photo/{photo} | photo.show | PhotoController@show | |
| | GET|HEAD | photo/{photo}/edit | photo.edit | PhotoController@edit | |
| | PUT | photo/{photo} | photo.update | PhotoController@update | |
| | PATCH | photo/{photo} | | PhotoController@update | |
| | DELETE | photo/{photo} | photo.destroy | PhotoController@destroy | |
+--------+----------+--------------------+---------------+-------------------------+------------+
<?php // routes/breadcrumbs.php
use App Models Photo ;
use Diglactic Breadcrumbs Breadcrumbs ;
use Diglactic Breadcrumbs Generator as BreadcrumbTrail ;
// Photos
Breadcrumbs:: for ( ' photo.index ' , function ( BreadcrumbTrail $ trail ) {
$ trail -> parent ( ' home ' );
$ trail -> push ( ' Photos ' , route ( ' photo.index ' ));
});
// Photos > Upload Photo
Breadcrumbs:: for ( ' photo.create ' , function ( BreadcrumbTrail $ trail ) {
$ trail -> parent ( ' photo.index ' );
$ trail -> push ( ' Upload Photo ' , route ( ' photo.create ' ));
});
// Photos > [Photo Name]
Breadcrumbs:: for ( ' photo.show ' , function ( BreadcrumbTrail $ trail , Photo $ photo ) {
$ trail -> parent ( ' photo.index ' );
$ trail -> push ( $ photo -> title , route ( ' photo.show ' , $ photo ));
});
// Photos > [Photo Name] > Edit Photo
Breadcrumbs:: for ( ' photo.edit ' , function ( BreadcrumbTrail $ trail , Photo $ photo ) {
$ trail -> parent ( ' photo.show ' , $ photo );
$ trail -> push ( ' Edit Photo ' , route ( ' photo.edit ' , $ photo ));
});สำหรับรายละเอียดเพิ่มเติม โปรดดูตัวควบคุมทรัพยากรในเอกสารประกอบของ Laravel
(คำถามที่พบบ่อยที่เกี่ยวข้อง: เหตุใดจึงไม่มีวิธี Breadcrumbs::resource()?.)
พารามิเตอร์ตัวที่สองที่จะ push() เป็นทางเลือก ดังนั้นหากคุณต้องการ breadcrumb ที่ไม่มี URL คุณสามารถทำได้:
$ trail -> push ( ' Sample ' ); ในกรณีนี้ $breadcrumb->url จะเป็น null
เทมเพลต Bootstrap เริ่มต้นจะเรนเดอร์สิ่งนี้ด้วยคลาส CSS "active" เช่นเดียวกับ breadcrumb สุดท้าย เพราะไม่เช่นนั้นจะใช้ข้อความสีดำไม่ใช่สีเทาซึ่งดูไม่ถูกต้อง
เมธอด push() ยอมรับพารามิเตอร์ตัวที่สามซึ่งเป็นทางเลือก $data ซึ่งเป็นอาร์เรย์ของอาร์เรย์ข้อมูลที่เชื่อมโยงตามต้องการที่จะส่งผ่านไปยัง breadcrumb ซึ่งคุณสามารถใช้ในเทมเพลตที่คุณกำหนดเองได้
หากคุณต้องการให้เบรดครัมบ์แต่ละรายการมีไอคอน คุณอาจทำดังนี้
$ trail -> push ( ' Home ' , ' / ' , [ ' icon ' => ' home.png ' ]); รายการของอาร์เรย์ $data จะถูกรวมเข้ากับ breadcrumb เป็นคุณสมบัติ
< li >
< a href = " {{ $breadcrumb -> url } } " >
< img src = " /images/icons/ {{ $breadcrumb -> icon } } " >
{{ $breadcrumb -> title } }
</ a >
</ li > หมายเหตุ: อย่าใช้ title คีย์หรือ url เนื่องจากจะถูกเขียนทับ
คุณสามารถลงทะเบียนการโทรกลับ "ก่อน" และ "หลัง" เพื่อเพิ่ม breadcrumb ที่จุดเริ่มต้น/จุดสิ้นสุดของเส้นทาง ตัวอย่างเช่น หากต้องการเพิ่มหมายเลขหน้าปัจจุบันต่อท้ายโดยอัตโนมัติ:
<?php // routes/breadcrumbs.php
use Diglactic Breadcrumbs Breadcrumbs ;
use Diglactic Breadcrumbs Generator as BreadcrumbTrail ;
Breadcrumbs:: after ( function ( BreadcrumbTrail $ trail ) {
$ page = ( int ) request ( ' page ' , 1 );
if ( $ page > 1 ) {
$ trail -> push ( " Page { $ page }" );
}
}); หากต้องการรับ breadcrumb สุดท้ายสำหรับหน้าปัจจุบัน ให้ใช้ Breadcrumb::current() ตัวอย่างเช่น คุณสามารถใช้สิ่งนี้เพื่อส่งออกชื่อหน้าปัจจุบัน:
< title > {{ ( $breadcrumb = Breadcrumbs :: current ()) ? $breadcrumb -> title : ' Fallback Title ' } } </ title > หากต้องการละเว้น breadcrumb ให้เพิ่ม 'current' => false ให้กับพารามิเตอร์ $data ใน push() สิ่งนี้มีประโยชน์ในการละเว้นเบรดครัมบ์การแบ่งหน้า:
<?php // routes/breadcrumbs.php
use Diglactic Breadcrumbs Breadcrumbs ;
use Diglactic Breadcrumbs Generator as BreadcrumbTrail ;
Breadcrumbs:: after ( function ( BreadcrumbTrail $ trail ) {
$ page = ( int ) request ( ' page ' , 1 );
if ( $ page > 1 ) {
$ trail -> push ( " Page { $ page }" , null , [ ' current ' => false ]);
}
});< title >
{{ ( $breadcrumb = Breadcrumbs :: current ()) ? " $breadcrumb -> title – " : ' ' } }
{{ ( $page = ( int ) request ( ' page ' )) > 1 ? " Page $page – " : ' ' } }
Demo App
</ title > สำหรับการกรองขั้นสูงเพิ่มเติม ให้ใช้เมธอด Breadcrumbs::generate() และ Laravel's Collection แทน:
<?php
use Diglactic Breadcrumbs Breadcrumbs ;
$ current = Breadcrumbs:: generate ()-> where ( ' current ' , ' !== ' , false )-> last (); คุณสามารถใช้ Breadcrumbs::view() แทน Breadcrumbs::render() เพื่อเรนเดอร์เทมเพลตอื่นที่ไม่ใช่เทมเพลตเริ่มต้น:
{{ Breadcrumbs :: view ( ' partials.breadcrumbs2 ' , ' category ' , $category ) } } หรือคุณสามารถแทนที่การตั้งค่าคอนฟิกเพื่อให้ส่งผลต่อการเรียก render() ในอนาคตทั้งหมด:
<?php
use Illuminate Support Facades Config ;
Config:: set ( ' breadcrumbs.view ' , ' partials.breadcrumbs2 ' ); {{ Breadcrumbs :: render ( ' category ' , $category ) } } หรือคุณสามารถเรียก Breadcrumbs::generate() เพื่อรับ breadcrumbs Collection และโหลดมุมมองด้วยตนเอง:
@include ( ' partials.breadcrumbs2 ' , [ ' breadcrumbs ' => Breadcrumbs :: generate ( ' category ' , $category )] ) หากคุณเรียก Breadcrumbs::render() หรือ Breadcrumbs::generate() โดยไม่มีพารามิเตอร์ มันจะใช้ชื่อเส้นทางปัจจุบันและพารามิเตอร์ตามค่าเริ่มต้น (ตามที่ส่งคืนโดย Route::current() ของ Laravel
คุณสามารถแทนที่สิ่งนี้ได้โดยการเรียก Breadcrumbs::setCurrentRoute($name, $param1, $param2...)
หากต้องการตรวจสอบว่า breadcrumb ที่มีชื่อที่กำหนดอยู่หรือไม่ ให้เรียก Breadcrumbs::exists('name') ซึ่งจะส่งคืนบูลีน
หากคุณไม่ต้องการใช้ routes/breadcrumbs.php คุณสามารถเปลี่ยนได้ในไฟล์กำหนดค่า ขั้นแรกให้เริ่มต้นไฟล์ปรับแต่ง หากคุณยังไม่ได้ดำเนินการ:
php artisan vendor:publish --tag=breadcrumbs-configอัปเดตบรรทัดนี้:
// config/breadcrumbs.php
' files ' => base_path ( ' routes/breadcrumbs.php ' ),อาจเป็นเส้นทางที่แน่นอน ดังที่กล่าวข้างต้น หรือเป็นอาร์เรย์:
' files ' => [
base_path ( ' breadcrumbs/admin.php ' ),
base_path ( ' breadcrumbs/frontend.php ' ),
], ดังนั้นคุณสามารถใช้ glob() เพื่อค้นหาไฟล์โดยอัตโนมัติโดยใช้ไวด์การ์ด:
' files ' => glob ( base_path ( ' breadcrumbs/*.php ' )), หรือส่งคืนอาร์เรย์ว่าง [] เพื่อปิดการโหลด
หากคุณกำลังสร้างแพ็คเกจของคุณเอง เพียงโหลดไฟล์ breadcrumbs จากเมธอด boot() ของผู้ให้บริการของคุณ:
use Illuminate Support ServiceProvider ;
class MyServiceProvider extends ServiceProvider
{
public function boot (): void
{
if ( class_exists ( ' Breadcrumbs ' )) {
require __DIR__ . ' /breadcrumbs.php ' ;
}
}
} คุณสามารถใช้การขึ้นต่อกันเพื่อเข้าถึงอินสแตนซ์ Manager ได้หากต้องการ แทนที่จะใช้ส่วนหน้าของ Breadcrumbs::
<?php
use Diglactic Breadcrumbs Manager ;
use Illuminate Support ServiceProvider ;
class MyServiceProvider extends ServiceProvider
{
public function boot ( Manager $ breadcrumbs ): void
{
$ breadcrumbs -> for (...);
}
} คลาส Breadcrumbs Manager สามารถแมโครได้ ดังนั้นคุณจึงสามารถเพิ่มวิธีการของคุณเองได้ ตัวอย่างเช่น:
<?php
use Diglactic Breadcrumbs Breadcrumbs ;
Breadcrumbs:: macro ( ' pageTitle ' , function () {
$ title = ( $ breadcrumb = Breadcrumbs:: current ()) ? "{ $ breadcrumb -> title } – " : '' ;
if (( $ page = ( int ) request ( ' page ' )) > 1 ) {
$ title .= " Page $ page – " ;
}
return "{ $ title } - Demo App " ;
});< title > {{ Breadcrumbs :: pageTitle () } } </ title > สำหรับการปรับแต่งขั้นสูงเพิ่มเติม คุณสามารถซับคลาส BreadcrumbsManager และ/หรือ BreadcrumbsGenerator จากนั้นอัปเดตไฟล์กำหนดค่าด้วยชื่อคลาสใหม่:
// breadcrumbs/config.php
' manager-class ' => Diglactic Breadcrumbs Manager::class,
' generator-class ' => Diglactic Breadcrumbs Generator::class,หมายเหตุ: ไวยากรณ์การกำหนดค่าอาจมีการเปลี่ยนแปลงระหว่างรุ่นต่างๆ
Breadcrumbs::resource() มีคนไม่กี่คนที่แนะนำให้เพิ่ม Breadcrumbs::resource() เพื่อให้ตรงกับ Route::resource() แต่ไม่มีใครคิดการใช้งานที่ดีว่า a) มีความยืดหยุ่นเพียงพอที่จะจัดการกับการแปล ทรัพยากรที่ซ้อนกัน ฯลฯ และ b) ) จึงไม่ซับซ้อนเกินไป
คุณสามารถสร้างของคุณเองได้เสมอโดยใช้ Breadcrumbs::macro() นี่เป็นจุดเริ่มต้นที่ดี:
<?php // routes/breadcrumbs.php
use App Models SomeModel ;
use Diglactic Breadcrumbs Breadcrumbs ;
use Diglactic Breadcrumbs Generator as BreadcrumbTrail ;
Breadcrumbs:: macro ( ' resource ' , function ( string $ name , string $ title ) {
// Home > Blog
Breadcrumbs:: for ( "{ $ name } .index " , function ( BreadcrumbTrail $ trail ) use ( $ name , $ title ) {
$ trail -> parent ( ' home ' );
$ trail -> push ( $ title , route ( "{ $ name } .index " ));
});
// Home > Blog > New
Breadcrumbs:: for ( "{ $ name } .create " , function ( BreadcrumbTrail $ trail ) use ( $ name ) {
$ trail -> parent ( "{ $ name } .index " );
$ trail -> push ( ' New ' , route ( "{ $ name } .create " ));
});
// Home > Blog > Post 123
Breadcrumbs:: for ( "{ $ name } .show " , function ( BreadcrumbTrail $ trail , SomeModel $ model ) use ( $ name ) {
$ trail -> parent ( "{ $ name } .index " );
$ trail -> push ( $ model -> title , route ( "{ $ name } .show " , $ model ));
});
// Home > Blog > Post 123 > Edit
Breadcrumbs:: for ( "{ $ name } .edit " , function ( BreadcrumbTrail $ trail , SomeModel $ model ) use ( $ name ) {
$ trail -> parent ( "{ $ name } .show " , $ model );
$ trail -> push ( ' Edit ' , route ( "{ $ name } .edit " , $ model ));
});
});
Breadcrumbs:: resource ( ' blog ' , ' Blog ' );
Breadcrumbs:: resource ( ' photos ' , ' Photos ' );
Breadcrumbs:: resource ( ' users ' , ' Users ' ); โปรดทราบว่าการดำเนินการนี้ ไม่ เกี่ยวข้องกับการแปลหรือทรัพยากรที่ซ้อนกัน และจะถือว่าโมเดลทั้งหมดมีแอตทริบิวต์ title (ซึ่งผู้ใช้อาจจะไม่) ปรับเปลี่ยนตามที่คุณต้องการ
composer update diglactic/laravel-breadcrumbs เพื่ออัปเกรดphp artisan package:discover เพื่อให้แน่ใจว่า Laravel ตรวจพบผู้ให้บริการ routes/breadcrumbs.php เป็นค่าเริ่มต้น)dd(__FILE__) ลงในไฟล์เพื่อให้แน่ใจว่าไฟล์โหลดแล้วdd($files) ใน ServiceProvider::registerBreadcrumbs() เพื่อตรวจสอบเส้นทางที่ถูกต้องphp artisan config:clear (หรือลบ bootstrap/cache/config.php ด้วยตนเอง) หรืออัปเดตพาธใน config/breadcrumbs.phpmissing-route-bound-breadcrumb-exception เป็น false ในไฟล์กำหนดค่าเพื่อปิดใช้งานการตรวจสอบ (แต่คุณจะไม่ได้รับการเตือนหากคุณพลาดหน้าใด ๆ ) php artisan config:clear (หรือลบ bootstrap/cache/config.php ด้วยตนเอง) หรืออัปเดตพาธใน config/breadcrumbs.php {{ Breadcrumbs::render() }} หรือ {{ Breadcrumbs::view() }} ไม่ใช่ @include() เอกสารประกอบ: หากคุณคิดว่าเอกสารสามารถปรับปรุงได้ในทางใดทางหนึ่ง โปรดแก้ไขไฟล์นี้และส่งคำขอดึง
การแก้ไขข้อบกพร่อง: โปรดแก้ไขและเปิดคำขอดึง (ดูคำแนะนำโดยละเอียดเพิ่มเติมด้านล่าง) จะได้รับคะแนนพิเศษหากคุณเพิ่มการทดสอบหน่วยเพื่อให้แน่ใจว่าจะไม่เกิดขึ้นอีก!
คุณสมบัติใหม่: เฉพาะคุณสมบัติที่มีกรณีการใช้งานที่ชัดเจนและ API ที่ผ่านการพิจารณาอย่างดีเท่านั้นที่จะได้รับการยอมรับ จะต้องจัดทำเป็นเอกสารและรวมการทดสอบหน่วยด้วย หากมีข้อสงสัย ให้พิสูจน์แนวคิด (ทั้งโค้ดหรือเอกสารประกอบ) และเปิดคำขอดึงข้อมูลเพื่อหารือเกี่ยวกับรายละเอียด (เคล็ดลับ: หากคุณต้องการให้ฟีเจอร์ที่เฉพาะเจาะจงเกินไปถูกรวมไว้ตามค่าเริ่มต้น โปรดดูมาโครหรือการใช้งานขั้นสูงเพื่อดูวิธีเพิ่มฟีเจอร์เหล่านั้น)
วิธีที่ง่ายที่สุดในการทำงานกับ Laravel Breadcrumbs คือการบอกให้ Composer ติดตั้งจากซอร์ส (Git) โดยใช้แฟล็ก --prefer-source :
rm -rf vendor/diglactic/laravel-breadcrumbs
composer install --prefer-sourceจากนั้นชำระเงินสาขาหลักและสร้างสาขาในพื้นที่ของคุณเองเพื่อดำเนินการ:
cd vendor/diglactic/laravel-breadcrumbs
git checkout -t origin/main
git checkout -b YOUR_BRANCHตอนนี้ทำการเปลี่ยนแปลงของคุณ รวมถึงการทดสอบหน่วยและเอกสารประกอบ (หากเหมาะสม) รันการทดสอบหน่วยเพื่อให้แน่ใจว่าทุกอย่างยังทำงานอยู่:
vendor/bin/phpunitจากนั้นทำการเปลี่ยนแปลง แยกพื้นที่เก็บข้อมูลบน GitHub หากคุณยังไม่ได้ทำ และผลักดันการเปลี่ยนแปลงของคุณไปที่:
git remote add YOUR_USERNAME [email protected]:YOUR_USERNAME/laravel-breadcrumbs.git
git push -u YOUR_USERNAME YOUR_BRANCHสุดท้าย เรียกดูพื้นที่เก็บข้อมูลบน GitHub และสร้างคำขอดึง
หากต้องการใช้ทางแยกของคุณเองในโปรเจ็กต์ ให้อัปเดต composer.json ในโปรเจ็กต์หลักของคุณดังนี้:
{
// ADD THIS:
"repositories" : [
{
"type" : "vcs" ,
"url" : "https://github.com/YOUR_USERNAME/laravel-breadcrumbs.git"
}
] ,
"require" : {
// UPDATE THIS:
"diglactic/laravel-breadcrumbs" : "dev-YOUR_BRANCH"
}
} แทนที่ YOUR_USERNAME ด้วยชื่อผู้ใช้ GitHub ของคุณและ YOUR_BRANCH ด้วยชื่อสาขา (เช่น develop ) สิ่งนี้จะบอกให้ Composer ใช้พื้นที่เก็บข้อมูลของคุณแทนพื้นที่เก็บข้อมูลเริ่มต้น
หากต้องการรันการทดสอบหน่วย:
vendor/bin/phpunitหากต้องการรันการทดสอบหน่วยและสร้างสแน็ปช็อตใหม่:
vendor/bin/phpunit -d --update-snapshotsวิธีตรวจสอบความครอบคลุมของโค้ด:
vendor/bin/phpunit --coverage-html test-coverage จากนั้นเปิด test-coverage/index.html เพื่อดูผลลัพธ์ ระวังกรณี Edge ใน PHPUnit ที่อาจทำให้ความแม่นยำไม่มากนัก
ไฟล์ต่อไปนี้จะต้องได้รับการอัปเดตเพื่อรันการทดสอบกับ Laravel เวอร์ชันใหม่:
composer.json
laravel/framework (เวอร์ชัน Laravel)php (เวอร์ชัน PHP ขั้นต่ำ) tests.yml
jobs.phpunit.strategy.matrix.laravel (เวอร์ชัน Laravel)jobs.phpunit.strategy.matrix.php (เวอร์ชัน PHP)jobs.phpunit.strategy.matrix.exclude (ชุดค่าผสมที่ไม่รองรับ)และเอกสารดังต่อไปนี้ตามความจำเป็น:
README.md
UPGRADE.md
Laravel Breadcrumbs เป็นซอฟต์แวร์โอเพ่นซอร์สที่ได้รับอนุญาตภายใต้ใบอนุญาต MIT