2015-03-16 19 views
12

Từ Laravel docs, bạn có thể bao gồm bố trí bên trong 'khu vực' sử dụng hai phương pháp:Laravel - Sự khác biệt giữa @yield và @section?

<html> 
    <body> 
     @section('sidebar') 
      This is the master sidebar. 
     @show 

     <div class="container"> 
      @yield('content') 
     </div> 
    </body> 
</html> 

Kể từ @yield cũng có thể vượt qua trong một số nội dung mặc định sử dụng @yield('section', 'Default Content'), là @yield chỉ là một viết tắt cho một @section mà không sử dụng @parent ?

@section 
    <!-- Nothing here --> 
@show 

Có sự khác biệt nào khác?

Trả lời

18

Dòng này xóa bỏ sự nhầm lẫn: "Lưu ý rằng chế độ xem mở rộng bố cục lưỡi chỉ cần ghi đè các phần từ bố cục. Nội dung của bố cục có thể được bao gồm trong chế độ xem con bằng cách sử dụng chỉ thị @parent trong phần".

Vì vậy, nếu bạn đã có @section được xác định trong bố cục chính, nó sẽ bị ghi đè trừ khi bạn chỉ định @parent bên trong bố cục của trẻ là @section.

Nhưng đối với @yield, nó luôn nhận được phần từ bố cục con. Điều đó có nghĩa là nó luôn ghi đè phần @yield, ngay cả khi nó được định nghĩa mặc định là @yield('section', 'Default Content').

Tôi hy vọng điều đó sẽ xóa bỏ sự nhầm lẫn của bạn. Hãy cho tôi biết nếu bạn có thêm câu hỏi. Cảm ơn

+0

Vì vậy, để làm móng ngôi nhà này - '@ yield' chỉ là một cách viết tắt cho một' @ section' không sử dụng @parent? Chính xác? – dayuloli

+0

Có, bạn có thể đặt nó theo cách đó. '@ yield' luôn được sử dụng để lấy nội dung từ trang con tới trang chính. Vì vậy, khi Laravel thực hiện tệp blade của bạn, trước tiên nó sẽ kiểm tra xem bạn đã mở rộng bố cục chính chưa, nếu bạn đã mở rộng bố cục, nó sẽ chuyển sang bố cục chính và bắt đầu nhận '@ sections' mà bạn đã ghi đè và nội dung chính '@ yield' từ bố cục con. Và tất nhiên, cuối cùng, nó phân tích định dạng lưỡi thành php thô và cung cấp đầu ra bằng html/css/js. –

+13

Tôi vẫn không hiểu. – pvaitonis

1

Về cơ bản yield('content') là điểm đánh dấu. Ví dụ: trong thẻ nếu bạn đặt yield('content'), câu nói của bạn phần này có tên của nội dung và nhân tiện, bạn có thể đặt tên bên trong dấu ngoặc đơn bất cứ thứ gì bạn muốn. nó không phải là nội dung. nó có thể sinh lời ('bên trong'). hoặc bất cứ điều gì bạn muốn.

Và sau đó trong trang con bạn muốn nhập html từ trang bố cục, bạn chỉ cần nói phần ('name of the section'). Ví dụ:
, nếu bạn đã đánh dấu tiêu đề của mình trong trang bố cục là lợi nhuận ('my_head_band') < - hoặc bất kỳ thứ gì khác bạn muốn, thì trong trang con bạn chỉ cần nói @section('my_head_band').

Điều này sẽ nhập tiêu đề từ trang bố cục vào trang con của bạn. ngược lại với phần cơ thể của bạn mà trong trường hợp này được đặt tên là nội dung.

Hy vọng điều này sẽ hữu ích.

2

Trả lời ngắn: Luôn sử dụng @yield trừ khi bạn muốn làm điều gì đó phức tạp hơn, sau đó cung cấp mặc định string.


dài trả lời: Cả @yield@section .. @show được sử dụng để được ghi đè tùy chọn bất cứ khi nào bạn mở rộng mẫu lưỡi. Mọi thứ bạn có thể làm với @yield cũng có thể được thực hiện với @section .. @show nhưng không phải cách khác.Dưới đây là những gì họ làm:

@yield ('chính')

  • có thể được thay thế bằng @section ('chính') .. @endsection
  • có thể được cung cấp một chuỗi mặc định nhưng không có HTML! Chuỗi mặc định sẽ được hiển thị trong sub-blade-template khi không có @section ('main') .. @endection được cung cấp.

@section ('chính') .. @show

  • có thể được thay thế bằng @section ('chính') .. @endsection
  • có thể được cung cấp một mã HTML mặc định. Mã HTML mặc định sẽ được hiển thị trong sub-blade-template khi không có @section ('main') được cung cấp.
  • Có thể được thay thế bằng @section ('main') @ parent .. @endsection và bổ sung hiển thị mã HTML mặc định.

Dưới đây một số ví dụ: test.blade.php

<!DOCTYPE html> 
<html> 
    <head> 
    <meta charset="utf-8"> 
    <title>Test</title> 
    </head> 
    <body> 
    <h1>This is a test</h1> 

    @yield('mainA') 
    @yield('mainB', 'This is the alternative 1') 
    @yield('mainC', '<p>This is the alternative 2</p>') 
    @yield('mainD', 'This is the alternative 3') 

    @section('testA') 
    @show 

    @section('testB') 
     This is the alternative 4 
    @show 

    @section('testC') 
     <p>This is the alternative 5</p> 
    @show 

    @section('testD') 
     <p>This is the alternative 6</p> 
    @show 


    </body> 
</html> 

đây là một tập tin gọi là testA.blade.php kéo dài file cánh khác:

@extends('test') 

@section('mainD') 
    <div> 
    <p>First replacement!</p> 
    <hr> 
    </div> 
@endsection 

@section('testC') 
    <div> 
    <p>Second replacement!</p> 
    <hr> 
    </div> 
@endsection 

@section('testD') 
    @parent 
    <div> 
    <p>Additional content</p> 
    <hr> 
    </div> 
@endsection 

Và đó là kết quả:

enter image description here

Các vấn đề liên quan