2015-04-18 22 views

Trả lời

60

Lựa chọn 1:

Bạn có thể sử dụng view::share() như vậy:

<?php namespace App\Http\Controllers; 

use View; 

//You can create a BaseController: 

class BaseController extends Controller { 

    public $variable1 = "I am Data"; 

    public function __construct() { 

     $variable2 = "I am Data 2"; 


     View::share ('variable1', $this->variable1); 
     View::share ('variable2', $variable2); 
     View::share ('variable3', 'I am Data 3'); 
     View::share ('variable4', ['name'=>'Franky','address'=>'Mars']); 
    } 

} 

class HomeController extends BaseController { 

    //if you have a constructor in other controllers you need call constructor of parent controller (i.e. BaseController) like so: 

    public function __construct(){ 
     parent::__construct(); 
    } 

    public function Index(){ 
     //All variable will be available in views 
     return view('home'); 
    } 

} 

Phương án 2: Sử dụng một nhà soạn nhạc:

  1. Tạo một file soạn nhạc tại app\Composers\HomeComposer.php

NB: tạo app\Composers nếu nó không tồn tại

<?php namespace App\Composers; 

class HomeComposer 
{ 

    public function compose($view) 
    { 
     //Add your variables 
     $view->with('variable1',  'I am Data') 
      ->with('variable2',  'I am Data 2'); 
    } 
} 

Sau đó, bạn có thể kèm theo các nhà soạn nhạc cho bất kỳ quan điểm bằng cách làm này

<?php namespace App\Http\Controllers; 

use View; 

class HomeController extends Controller{ 


    public function __construct(){ 

     View::composers([ 
      'App\Composers\HomeComposer' => ['home'] //attaches HomeComposer to home.blade.php 
     ]); 

    } 

    public function Index(){ 
     return view('home'); 
    } 

} 
+1

Phản hồi của bạn thực sự đã giúp tôi với Tùy chọn 1, mặc dù điều gì sẽ xảy ra nếu bạn đang cố truy cập vào '$ user = Auth :: user();' và chuyển biến $ user tới tất cả các mẫu lưỡi bao gồm phần đầu và phần nội dung ? Tôi đã thử điều này bằng cách đặt biến $ user trong BaseController và sau đó chia sẻ nó, nhưng nếu tôi var_dump $ user tôi nhận được một loạt các giá trị được bảo vệ trong mảng. Về cơ bản tôi muốn có thể truy cập tất cả các biến người dùng auth trong suốt ứng dụng trong tất cả các mẫu và khung nhìn. Có vẻ đơn giản nhưng đã dành nhiều giờ cố gắng tìm ra nó. –

+1

Thực tế điều này đã làm việc: ' 'nhưng điều này không hoạt động:' {{$ user-> name}} ' –

+0

@Chad Priddle Điều này sẽ làm việc cho một mảng' {{$ user ['name']}} 'trong khi điều này làm việc cho một đối tượng '{{$ user-> name}}' – Digitlimit

6

Bạn có thể thực hiện việc này với view composers. Xem các nhà soạn nhạc được thực hiện khi một mẫu được tải. Bạn có thể vượt qua trong phần Đóng với chức năng bổ sung cho chế độ xem đó. Với các nhà soạn nhạc chế độ xem, bạn có thể sử dụng các ký tự đại diện. Để tạo trình xem cho mỗi chế độ xem, chỉ cần sử dụng *.

View::composer('*', function($view) 
{ 
    $view->with('variable','Test value'); 
}); 

Bạn cũng có thể thực hiện việc này mà không bị đóng như bạn có thể thấy trong tài liệu.

View::composer('*', 'App\Http\ViewComposers\ProfileComposer'); 

Lớp trình soạn thảo tiểu sử phải có phương pháp soạn thư.

Xem trình tổng hợp được thực thi khi chế độ xem được hiển thị. Laravel cũng đã xem người sáng tạo. Chúng được thực thi khi một khung nhìn được khởi tạo.

Bạn cũng có thể chọn sử dụng BaseController bằng phương thức setupLayout. Sau đó, mỗi chế độ xem mà bạn sẽ tải được tải thông qua phương thức setupLayout để thêm một số dữ liệu bổ sung. Tuy nhiên, bằng cách sử dụng trình soạn thảo chế độ xem, bạn chắc chắn rằng mã được thực thi. Nhưng với cách tiếp cận BaseController bạn đã linh hoạt hơn bởi vì bạn có thể bỏ qua việc tải dữ liệu bổ sung.

EDIT: Như đã đề cập bởi Nic Gutierrez, bạn cũng có thể sử dụng chia sẻ lượt xem.

+0

Sự khác biệt giữa điều này và 'view() -> share' là điều này chỉ chạy khi một view được sử dụng - nhưng với 'view() -> share' nó chạy bất kể cái gì - bạn có thể trả về một số JSON trong một cuộc gọi API chẳng hạn - cái mà không sử dụng một khung nhìn . – Petecoop

14

Create a new Service Provider as suggested in here

Thêm nhà cung cấp dịch vụ mới vào tệp cấu hình (config/app.php).

Trong phương thức khởi động sử dụng cung cấp dịch vụ mới của bạn:

View::share('something_cool', 'this is a cool shared variable'); 

Bây giờ bạn đã sẵn sàng để sử dụng $ something_cool trong tất cả các quan điểm của bạn.

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

+0

plus, đó là giải pháp tối ưu cho ** biến được sử dụng trên nhiều dịp một trang 503 sau khi 'artisan down'. ** Đưa chuỗi phiên bản của ứng dụng dưới dạng tham số bộ nhớ cache hoặc hiển thị ở chân trang trong khi cập nhật là công việc vặt với các giải pháp khác . (sử dụng một biến env cho rằng có lẽ sẽ là giải pháp sạch nhất) – luchaos

+0

đây là giải pháp tốt hơn câu trả lời được phê duyệt – Christophvh

+0

Tôi nghĩ sự khác biệt chính là người dùng đang hỏi về cách có biến * global * có sẵn trong tất cả các mẫu . Với giải pháp được chấp nhận, người dùng cần phải nhớ mở rộng BaseController và gọi parent :: construct và với giải pháp ViewComposer, anh ta cần gọi View :: composers trong mọi phương thức xây dựng bộ điều khiển để làm cho các biến có sẵn. –

-6

bạn có thể flash nó vào phiên giao dịch, bạn có thể xác định nó trong.tệp env (static vars)

8

Tìm kiếm giải pháp cho cùng một vấn đề và tìm ra giải pháp tốt nhất trong tài liệu Laravel. Chỉ cần sử dụng View::share trong AppServiceProvider như thế này:

View::share('key', 'value'); 

Chi tiết here.

1

Ngoài ra, bạn có thể làm điều này trong các tập tin Route.php:

view()->share('variableName', $variable); 
Các vấn đề liên quan