วิธีสไตล์ 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.php
missing-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