Làm cách nào để chuyển một biến vào layout bằng cách sử dụng Laravel 'Blade templating?


91

Trong Laravel 4, bộ điều khiển của tôi sử dụng bố cục Blade:

class PagesController extends BaseController {
    protected $layout = 'layouts.master';
}

Bố cục chính có đầu ra tiêu đề biến và sau đó hiển thị dạng xem:

...
<title>{{ $title }}</title>
...
@yield('content')
....

Tuy nhiên, trong bộ điều khiển của tôi, tôi dường như chỉ có thể chuyển các biến cho chế độ xem phụ chứ không phải bố cục. Ví dụ, một hành động có thể là:

public function index()
{
    $this->layout->content = View::make('pages/index', array('title' => 'Home page'));
}

Điều này sẽ chỉ chuyển $titlebiến đến phần nội dung của dạng xem. Làm cách nào để cung cấp biến đó cho toàn bộ chế độ xem hoặc ít nhất là bố cục chính?

Câu trả lời:


217

Nếu bạn đang sử dụng @extendstrong bố cục nội dung của mình, bạn có thể sử dụng cái này:

@extends('master', ['title' => $title])

1
Tôi đã mất rất nhiều googling để tìm thấy điều này! Nó chỉ là cú pháp này mà bạn phải có để có được hoàn hảo và tài liệu không hiển thị tất cả những sự tinh tế này. Ý tôi là đây là những gì tài liệu chính thức nói @component('alert', ['foo' => 'bar'])......
Arthur Tarasov

Tôi đang làm điều này và tôi gặp lỗi không xác định trên trang bố cục. Có ý kiến ​​gì không?
LucyTurtle

45

Đối với những người của Google trong tương lai sử dụng Laravel 5, bây giờ bạn cũng có thể sử dụng nó với bao gồm,

@include('views.otherView', ['variable' => 1])

đây là những gì tôi đang tìm kiếm để cuối cùng tạo một ứng dụng dựa trên thành phần trên laravel, cảm ơn!
Ron Michael

nếu tôi chỉ vượt qua ["một"], làm cách nào để lấy nó trong mẫu?
Javier J Solis Flores

20

Tôi đã có thể giải quyết vấn đề đó bằng cách thêm cái này vào phương thức bộ điều khiển của mình:

    $title = 'My Title Here';
    View::share('title', $title);

$ this-> layout-> title = 'Trang chủ'; cũng không hoạt động.


Điều này đã làm việc cho tôi trong laravel 5.1. Cách dễ nhất để giải quyết vấn đề.
CodeChuck

16

Trong Blade Template: xác định một biến như thế này

@extends('app',['title' => 'Your Title Goes Here'])
@section('content')

Và trong app.blade.php hoặc bất kỳ lựa chọn nào khác của bạn (tôi chỉ đang làm theo thiết lập Laravel 5 mặc định)

<title>{{ $title or 'Default title Information if not set explicitly' }}</title>

Đây là câu trả lời đầu tiên của tôi ở đây. Hy vọng nó hoạt động. Chúc may mắn!


Điều này đã giúp tôi tiết kiệm vài giờ ..! Đã sử dụng nó trong Laravel 5.4 và nó hoạt động tuyệt vời .. Cảm ơn vì câu trả lời ...
Saiyan Prince

2
Tôi phải làm:{{ $title ?? 'Default Title' }}
Damien Ó Ceallaigh

5

Cách đơn giản nhất để giải quyết:

view()->share('title', 'My Title Here');

Hoặc sử dụng chế độ xem Mặt tiền:

use View;

...

View::share('title', 'My Title Here');

tôi có thể thực thi nó trong một phần mềm trung gian không?
mukade

4

Có vẻ như tôi có thể chuyển các biến cho toàn bộ bố cục bằng cách sử dụng các thuộc tính trên đối tượng bố cục, ví dụ: để giải quyết vấn đề của tôi, tôi có thể làm như sau:

$this->layout->title = 'Home page';

8
Điều này không hiệu quả với tôi. Tôi hiện gặp lỗi cho biết rằng nó không tồn tại dưới dạng một biến.
Adam Libonatti-Roche

Tôi có thể tìm đối tượng bố cục ở đâu?
Yevgeniy Afanasyev

1
class PagesController extends BaseController {
    protected $layout = 'layouts.master';

    public function index()
    {
        $this->layout->title = "Home page";
        $this->layout->content = View::make('pages/index');
    }
}

Tại tệp Blade Template, NHỚ sử dụng @ ở phía trước biến.

...
<title>{{ $title or '' }}</title>
...
@yield('content')
...

@YevgeniyAfanasyev, câu hỏi này bạn nên hỏi lại chủ sở hữu bài đăng. Tôi chỉ tham khảo lại mã của anh ấy. Loại kỳ lạ bạn hỏi lại tôi .... Và điều này đã được trả lời trong năm 2014. Tất nhiên tôi đã đề cập trên phiên bản anh hỏi đó là Laravel 4.
Shiro

0

Bạn co thể thử:

public function index()
{
    return View::make('pages/index', array('title' => 'Home page'));
}

0

chỉ cần thử phương pháp đơn giản này: trong bộ điều khiển: -

 public function index()
   {
        $data = array(
            'title' => 'Home',
            'otherData' => 'Data Here'
        );
        return view('front.landing')->with($data);
   }

Và trong bố cục của bạn (app.blade.php):

<title>{{ $title }} - {{ config('app.name') }} </title>

Đó là tất cả.


Bạn có thể giải thích làm thế nào điều này giải quyết vấn đề? Và nó có gì mới so với các câu trả lời trước đó (được chấp nhận đặc biệt)?
gst

Chào mừng đến với SO! Khi bạn đặt một câu trả lời, ngay cả khi nó ổn, bạn nên giải thích nó một chút, và trong trường hợp của bạn, vì có một câu trả lời tương tự, hãy cố gắng giải thích những ưu và nhược điểm của câu trả lời của bạn.
David García Bodego

0

nếu bạn muốn nhận các biến của các phần, bạn có thể trả tiền như sau:

$_view      = new \View;
$_sections  = $_view->getFacadeRoot()->getSections();
dd($_sections);
/*
Out:
array:1 [▼
  "title" => "Painel"
]
*/

-2
$data['title'] = $this->layout->title = 'The Home Page';
$this->layout->content = View::make('home', $data);

Tôi đã làm điều này cho đến nay bởi vì tôi cần trong cả chế độ xem và tệp chính. Có vẻ như nếu bạn không sử dụng tiêu đề $ this-> layout-> thì nó sẽ không có sẵn trong bố cục chính. Cải tiến được chào đón!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.