ฉันจะส่งตัวแปรไปยังเค้าโครงโดยใช้ Laravel 'Blade templating ได้อย่างไร


92

ใน Laravel 4 คอนโทรลเลอร์ของฉันใช้เลย์เอาต์ Blade:

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

เค้าโครงหลักมีเอาต์พุตชื่อตัวแปรจากนั้นแสดงมุมมอง:

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

อย่างไรก็ตามในคอนโทรลเลอร์ของฉันดูเหมือนว่าจะสามารถส่งผ่านตัวแปรไปยังมุมมองย่อยเท่านั้นไม่ใช่เลย์เอาต์ ตัวอย่างเช่นการกระทำอาจเป็น:

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

สิ่งนี้จะส่งผ่าน$titleตัวแปรไปยังส่วนเนื้อหาของมุมมองเท่านั้น ฉันจะระบุตัวแปรนั้นให้กับมุมมองทั้งหมดหรืออย่างน้อยที่สุดในเค้าโครงหลักได้อย่างไร

คำตอบ:


218

หากคุณใช้@extendsในเค้าโครงเนื้อหาของคุณคุณสามารถใช้สิ่งนี้:

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

1
ฉันต้องใช้เวลามากในการค้นหาสิ่งนี้! มันเป็นเพียงไวยากรณ์นี้ที่คุณต้องทำให้สมบูรณ์และเอกสารจะไม่แสดงรายละเอียดปลีกย่อยเหล่านี้ทั้งหมด ฉันหมายความว่านี่คือสิ่งที่เอกสารอย่างเป็นทางการพูด@component('alert', ['foo' => 'bar'])......
Arthur Tarasov

ฉันกำลังทำสิ่งนี้และได้รับข้อผิดพลาดที่ไม่ได้กำหนดในหน้าเค้าโครง ความคิดใด ๆ ?
LucyTurtle

45

สำหรับ Google'rs ในอนาคตที่ใช้ Laravel 5 ตอนนี้คุณสามารถใช้งานได้โดยมี

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

นี่คือสิ่งที่ฉันต้องการเพื่อสร้างแอปพลิเคชั่นที่ใช้ส่วนประกอบบน laravel ในที่สุดขอบคุณ!
Ron Michael

ถ้าฉันผ่านเพียง ["หนึ่ง"] ฉันจะนำมันไปอยู่ในเทมเพลตได้อย่างไร
Javier J Solis Flores

20

ฉันสามารถแก้ปัญหานั้นได้โดยเพิ่มสิ่งนี้ลงในวิธีการควบคุมของฉัน:

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

$ this-> layout-> title = 'โฮมเพจ'; ไม่ได้ผลเช่นกัน


สิ่งนี้ใช้ได้ผลสำหรับฉันใน laravel 5.1 วิธีที่ง่ายที่สุดในการแก้ปัญหา
CodeChuck

16

ใน Blade Template: กำหนดตัวแปรเช่นนี้

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

และใน app.blade.php หรือตัวเลือกอื่น ๆ ของคุณ (ฉันแค่ทำตามการตั้งค่า Laravel 5 เริ่มต้น)

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

นี่คือคำตอบแรกของฉันที่นี่ หวังว่าจะได้ผลขอให้โชคดี!


ช่วยประหยัดเวลาได้ไม่กี่ชั่วโมง .. ! ใช้ใน Laravel 5.4 และใช้งานได้ดี .. ขอบคุณสำหรับคำตอบ ...
Saiyan Prince

2
ฉันต้องทำ:{{ $title ?? 'Default Title' }}
Damien Bezborodow

5

วิธีที่ง่ายที่สุดในการแก้ปัญหา:

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

หรือใช้มุมมองด้านหน้า:

use View;

...

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

ฉันสามารถดำเนินการในมิดเดิลแวร์เส้นทางได้หรือไม่
mukade

4

ดูเหมือนว่าฉันสามารถส่งผ่านตัวแปรไปยังเค้าโครงทั้งหมดโดยใช้แอตทริบิวต์บนวัตถุโครงร่างตัวอย่างเช่นเพื่อแก้ปัญหาของฉันฉันสามารถทำสิ่งต่อไปนี้

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

8
สิ่งนี้ไม่ได้ผลสำหรับฉัน ขณะนี้ฉันได้รับข้อผิดพลาดที่ระบุว่าไม่มีอยู่เป็นตัวแปร
Adam Libonatti-Roche

ฉันจะหาวัตถุโครงร่างได้ที่ไหน
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');
    }
}

ที่ไฟล์ Blade Template โปรดจำไว้ว่าให้ใช้ @ ข้างหน้าตัวแปร

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

@YevgeniyAfanasyev คำถามนี้คุณควรถามกลับเจ้าของโพสต์ ฉันแค่อ้างถึงการเข้ารหัสของเขา แปลกดีที่คุณถามฉันกลับ .... และนี่ก็ได้รับคำตอบในปี 2014 แน่นอนว่าฉันกำลังอ้างถึงเวอร์ชั่นที่เขาถามว่าคือ Laravel 4
ชิโระ

1

หากคุณต้องการรับตัวแปรของส่วนต่างๆคุณสามารถจ่ายได้ดังนี้:

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


0

ลองใช้วิธีง่ายๆนี้: ในตัวควบคุม: -

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

และในรูปแบบของคุณ (app.blade.php):

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

นั่นคือทั้งหมด


คุณช่วยอธิบายได้ไหมว่าวิธีนี้แก้ปัญหาได้อย่างไร และมีอะไรใหม่ที่มีส่วนช่วยเหนือคำตอบก่อนหน้า (ที่ยอมรับโดยเฉพาะ)?
gst

ยินดีต้อนรับสู่ SO! เมื่อคุณวางคำตอบแม้ว่าจะใช้ได้ แต่คุณควรอธิบายมันสักหน่อยและในกรณีของคุณมีคำตอบที่คล้ายกันพยายามอธิบายข้อดีข้อเสียของคำตอบของคุณ
David García Bodego

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

ฉันได้ทำสิ่งนี้ไปแล้วเพราะฉันต้องการทั้งในมุมมองและไฟล์หลัก ดูเหมือนว่าถ้าคุณไม่ใช้ $ this-> layout-> title มันจะไม่มีในเค้าโครงหลัก ยินดีต้อนรับการปรับปรุง!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.