Cách đặt biến trong mẫu lưỡi kiếm


247

Tôi đang đọc tài liệu của Laravel Blade và tôi không thể tìm ra cách gán biến trong mẫu để sử dụng sau này. Tôi không thể làm điều đó {{ $old_section = "whatever" }}bởi vì điều đó sẽ lặp lại "bất cứ điều gì" và tôi không muốn điều đó.

Tôi hiểu rằng tôi có thể làm <?php $old_section = "whatever"; ?>, nhưng điều đó không thanh lịch.

Có cách nào hay hơn, tao nhã hơn để làm điều đó trong mẫu Blade không?


1
Kiểm tra kéo này: github.com/laravel/laravel/pull/866
Spir

Điều này thường hữu ích để thử nghiệm, đặc biệt nếu bạn đang làm việc trên mẫu nhưng có người khác làm việc trên phần PHP. Chỉ cần cẩn thận để loại bỏ khai báo khi bạn đã hoàn thành thử nghiệm.
phân chia

Có gì sai khi chỉ đơn giản là làm <?php $old_section = "whatever"; ?>. Tôi thấy nó khá dễ đọc.
Jaime Hablutzel

@JaimeHablutzel câu trả lời, theo tôi, là trong câu hỏi: nó không thanh lịch.
duality_

Câu trả lời:


122

Nó không được khuyến khích để làm trong một chế độ xem vì vậy không có thẻ lưỡi cho nó. Nếu bạn muốn làm điều này trong chế độ xem lưỡi của mình, bạn có thể chỉ cần mở một thẻ php khi bạn viết nó hoặc đăng ký một thẻ lưỡi mới. Chỉ là một ví dụ:

<?php
/**
 * <code>
 * {? $old_section = "whatever" ?}
 * </code>
 */
Blade::extend(function($value) {
    return preg_replace('/\{\?(.+)\?\}/', '<?php ${1} ?>', $value);
});

9
Các biến trong các khung nhìn có một số cách sử dụng. Điều này có vẻ tuyệt vời! Nơi nào sẽ là một nơi tốt để đặt mã này?
duality_

1
Bạn có thể đặt nó trong ứng dụng / start.php của bạn hoặc nếu bạn sẽ có nhiều thứ như thế này hãy đặt nó vào một tệp riêng biệt và đưa nó vào đó. Laravel rất lỏng lẻo theo cách này, bạn thậm chí có thể đặt một bộ điều khiển mỏng. Điều duy nhất bạn phải làm những điều này kéo dài trước khi chế độ xem được hiển thị.
TLGreg

19
Lý do cho việc thêm mã bổ sung này chỉ để sử dụng {?thay vì chỉ sử dụng bản địa là <?gì?
Justin

1
Nếu nó không được khuyến khích để làm, có cách nào "phù hợp" hơn để làm như sau không? Tôi có một trang web có tiêu đề được hiển thị trong chế độ xem ứng dụng chính là {{$ title}}, trong đó có một hệ thống con cần nối số trang vào tiêu đề ("Trang mẫu ứng dụng {{$ page}}") và Tôi đang chuyển trang $ cho chế độ xem (được sử dụng theo cách khác trong chế độ xem). Tôi không muốn xây dựng tiêu đề trong mỗi cuộc gọi của bộ điều khiển, tôi chỉ muốn gửi chế độ xem số trang - chỉ trong trường hợp một ngày nào đó tôi muốn thay đổi tiêu đề cơ sở. Hiện tôi đang sử dụng <? Php $ title = ...?>, Nhưng có cách nào chính xác hơn không?
jdavidbakr

4
Các biến phải được truyền từ bộ điều khiển, không được khai báo nội tuyến trong chế độ xem của bạn. Nếu một mẫu toàn cầu cần một biến, bạn có thể đặt nó trong một nhà cung cấp dịch vụ stackoverflow.com/a/36780419/922522 . Nếu một mẫu cụ thể của trang cần một biến, hãy sử dụng @yield và chuyển nó từ chế độ xem con có bộ điều khiển. laravel.com/docs/5.1/blade#template-inherribution
Justin

361

LARAVEL 5.5 VÀ LÊN

Lệnh @php blade không còn chấp nhận thẻ nội tuyến. Thay vào đó, hãy sử dụng hình thức đầy đủ của lệnh:

@php
$i = 1
@endphp

LARAVEL 5.2 VÀ LÊN

Bạn chỉ có thể sử dụng:

@php ($i = 1)

Hoặc bạn có thể sử dụng nó trong một tuyên bố khối:

@php
$i = 1
@endphp

LỚN 5

Mở rộng Blade như thế này:

/*
|--------------------------------------------------------------------------
| Extend blade so we can define a variable
| <code>
| @define $variable = "whatever"
| </code>
|--------------------------------------------------------------------------
*/

\Blade::extend(function($value) {
    return preg_replace('/\@define(.+)/', '<?php ${1}; ?>', $value);
});

Sau đó thực hiện một trong những điều sau đây:

Giải pháp nhanh: Nếu bạn lười biếng, chỉ cần đặt mã vào hàm boot () của AppServiceProvider.php.

Giải pháp Nicer: Tạo một nhà cung cấp dịch vụ riêng. Xem https://stackoverflow.com/a/28641054/2169147 về cách mở rộng lưỡi kiếm trong Laravel 5. Cách này hiệu quả hơn một chút theo cách này, nhưng là một bài tập tốt về cách sử dụng Nhà cung cấp :)

LỚN 4

Bạn chỉ có thể đặt mã ở trên dưới cùng của ứng dụng / start / global.php (hoặc bất kỳ nơi nào khác nếu bạn cảm thấy điều đó tốt hơn).


Sau những thay đổi trên, bạn có thể sử dụng:

@define $i = 1

để xác định một biến.


5
Đẹp! Xin lưu ý rằng bạn có thể thực thi bất kỳ câu lệnh php nào với việc triển khai của bạn. Tôi sẽ đổi tên nó thành từ xa như @php. Rất tiện dụng ...
igaster

Rất đúng, igaster. Bạn có thể đổi tên 'định nghĩa' thành 'php' nếu bạn muốn, nhưng điều đó mở ra cạm bẫy cho việc sử dụng quá mức php trong các mẫu của bạn :)
Pim

1
Cảm ơn @ C.delaFonteijne, nếu bạn đang sử dụng không gian tên (và bạn nên), \ thực sự cần thiết. Tôi đã thêm \ trong mã ở trên.
Pim

1
Xin lưu ý rằng hầu như việc triển khai chính xác của bạn là tiêu chuẩn kể từ Laravel 5.2 . Bạn có thể sử dụng @php(@i = 1)hoặc sử dụng nó trong một tuyên bố khối (gần với @endphp)
Daan

1
Tôi không thấy "@php" "@endphp" "thanh lịch" hơn "<? Php" "?>". Nó thậm chí còn dài hơn một vài ký tự! Có phải chỉ vì nó bắt đầu bằng "@" như các chỉ thị Blade khác? Chúng tôi phát triển là một số bó ám ảnh cưỡng chế! ;-)
OMA

116

Trong , bạn có thể sử dụng cú pháp nhận xét mẫu để xác định / đặt biến.

Cú pháp bình luận là {{-- anything here is comment --}}và nó được hiển thị bởi động cơ như

<?php /* anything here is comment */ ?>

Vì vậy, với mẹo nhỏ, chúng ta có thể sử dụng nó để xác định các biến, ví dụ

{{-- */$i=0;/* --}}

sẽ được kết xuất bởi như <?php /* */$i=0;/* */ ?>thiết lập các biến cho chúng ta. Không thay đổi bất kỳ dòng mã.


2
@ cố gắng tự làm +1 | Không phải là cách thực hành tốt nhất, nhưng hoàn hảo để hack mã nhanh trong các mẫu như với kiểu nội tuyến cho html.
Markus Hofmann

121
Tôi không khuyên bạn nên thực hiện hack này vì bất kỳ ai nhìn vào mã này sau khi bạn sẽ ghét bạn.
Justin

2
Đồng ý với Justin, các thẻ nhận xét là để bình luận, không chú ý đến bình luận và bắt đầu làm điều gì đó khác đang yêu cầu sự cố
Leon

27
Điều này không tốt hơn php php đơn giản <?php $i=0; ?>
gyo

3
Quan điểm của việc này là gì thay vì sử dụng thẻ php ?? Nó không thể đọc được (trông giống như một bình luận), yêu cầu nhập nhiều hơn và có thể bị hỏng khi cập nhật hệ thống phân tích cú pháp. Ngay cả khi nó có một điểm, nó không phải là câu trả lời cho cách xác định một biến trong mẫu lưỡi cắt. Không biết có gì sai với cử tri, có lẽ họ thấy điều này thật 'táo bạo'?

52

Có một cách giải quyết đơn giản không yêu cầu bạn thay đổi bất kỳ mã nào và nó cũng hoạt động trong Laravel 4.

Bạn chỉ cần sử dụng một toán tử gán ( =) trong biểu thức được truyền cho một @ifcâu lệnh, thay vì (ví dụ) một toán tử như ==.

@if ($variable = 'any data, be it string, variable or OOP') @endif

Sau đó, bạn có thể sử dụng nó bất cứ nơi nào bạn có thể sử dụng bất kỳ biến nào khác

{{ $variable }}

Nhược điểm duy nhất là sự phân công của bạn sẽ trông giống như một sai lầm nếu ai đó không nhận thức được rằng bạn đang làm điều này như một cách giải quyết khác.


27

Bạn sẽ làm cho nó quá phức tạp.

Chỉ cần sử dụng php đơn giản

<?php $i = 1; ?>
{{$i}}

bánh ngọt

(hoặc https://github.com/alexdover/blade-set trông cũng khá căng thẳng)

Tất cả chúng ta đều "hack" hệ thống bằng cách đặt các biến trong chế độ xem, vậy tại sao làm cho "hack" trở nên phức tạp hơn thì nó cần phải như vậy?

Đã thử nghiệm ở Laravel 4.

Một lợi ích khác là làm nổi bật cú pháp hoạt động đúng (tôi đã sử dụng hack bình luận trước đó và thật tuyệt khi đọc)


21

Bạn có thể đặt các biến trong công cụ tạo khuôn lưỡi Các cách sau:

1.
Biến cài đặt khối PHP chung Biến: <?php $hello = "Hello World!"; ?>
Đầu ra: {{$hello}}

2.
Biến cài đặt khối PHP : Biến @php $hello = "Hello World!"; @endphp
đầu ra: {{$hello}}


19

Kể từ Laravel 5.2.23, bạn có lệnh @php Blade , bạn có thể sử dụng câu lệnh chặn hoặc nội tuyến:

@php($old_section = "whatever")

hoặc là

@php
    $old_section = "whatever"
@endphp

15

Bạn có thể đặt một biến trong tệp xem, nhưng nó sẽ được in giống như bạn đặt. Dù sao, có một cách giải quyết. Bạn có thể đặt biến trong một phần không sử dụng. Thí dụ:

@section('someSection')
  {{ $yourVar = 'Your value' }}
@endsection

Sau đó {{ $yourVar }}sẽ in Your valuebất cứ nơi nào bạn muốn, nhưng bạn không nhận được đầu ra khi bạn lưu biến.

EDIT: đặt tên cho phần này là bắt buộc nếu không sẽ có ngoại lệ.


Không hoạt động một cái gì đó khác cần phải được bao gồm Thuộc tính không xác định: Illuminate \ View \ Factory :: $ startSection (Xem: /home/vagrant/Code/dompetspy/resource/view/reviews/index.blade.php)
MaXi32

14

Trong Laravel 4:

Nếu bạn muốn biến có thể truy cập trong tất cả các chế độ xem của bạn, không chỉ mẫu của bạn, View::sharelà một phương pháp tuyệt vời ( thông tin thêm về blog này ).

Chỉ cần thêm các mục sau trong app / controls / BaseControll.php

class BaseController extends Controller
{
  public function __construct()
  {                   
    // Share a var with all views
    View::share('myvar', 'some value');
  }
}

và bây giờ $myvarsẽ có sẵn cho tất cả các chế độ xem của bạn - bao gồm cả mẫu của bạn.

Tôi đã sử dụng điều này để đặt URL tài sản cụ thể cho môi trường cho hình ảnh của mình.


1
Đây là những gì tôi đang tìm kiếm: cách tuyệt vời để tránh các cuộc gọi trùng lặp tại cơ sở dữ liệu!
clod986

Điều này dường như không phải là một lựa chọn trong Laravel 5?
Goddard

@Goddard Bạn vẫn có thể. Cú pháp đã thay đổi mặc dù: stackoverflow.com/a/36780419/922522
Justin

8

Và đột nhiên sẽ không có gì xuất hiện. Theo kinh nghiệm của tôi, nếu bạn phải làm một cái gì đó như thế này, hãy chuẩn bị html theo phương thức của một mô hình hoặc thực hiện sắp xếp lại mã của bạn thành các mảng hoặc một cái gì đó.

Không bao giờ chỉ có 1 cách.

{{ $x = 1 ? '' : '' }}

11
Chuẩn bị HTML trong mô hình? Đó là điều xấu nhất có thể tưởng tượng.
duality_

@duality_ Bạn đang khai báo và thay đổi các biến trong chế độ xem của bạn. Tôi nói có lẽ bạn đang tổ chức mã của bạn sai. Kiến trúc sư Lrn 2.
Michael J. Calkins

3
Chắc chắn rồi, Michael ... Những biến đó không phải là biến như $users = ..., mà là thứ gì đó dọc theo dòng $css_class = ..., vì vậy các biến thiết kế nghiêm ngặt không thuộc về mô hình hoặc bộ điều khiển, do chúng được xác định bởi nhà thiết kế.
ngẫu_

2
nếu bạn cần đi theo con đường đó, tôi thích giải pháp đơn giản và thanh lịch hơn: {{''; $ x = 1}}
Daniel

6

Tôi sẽ mở rộng câu trả lời được đưa ra bởi @Pim.

Thêm phần này vào phương thức khởi động của AppServiceProvider của bạn

<?php
/*
|--------------------------------------------------------------------------
| Extend blade so we can define a variable
| <code>
| @set(name, value)
| </code>
|--------------------------------------------------------------------------
*/

Blade::directive('set', function($expression) {
    list($name, $val) = explode(',', $expression);
    return "<?php {$name} = {$val}; ?>";
});

Bằng cách này, bạn không bộc lộ khả năng viết bất kỳ biểu thức php nào.

Bạn có thể sử dụng chỉ thị này như:

@set($var, 10)
@set($var2, 'some string')


5

Trong Laravel 5.1, 5.2 :

https://laravel.com/docs/5.2/view#shaming-data-with-all-view

Bạn có thể cần chia sẻ một phần dữ liệu với tất cả các chế độ xem được hiển thị bởi ứng dụng của bạn. Bạn có thể làm như vậy bằng cách sử dụng phương pháp chia sẻ của nhà máy xem. Thông thường, bạn nên thực hiện các cuộc gọi để chia sẻ trong phương thức khởi động của nhà cung cấp dịch vụ. Bạn có thể tự do thêm chúng vào AppServiceProvider hoặc tạo một nhà cung cấp dịch vụ riêng để chứa chúng.

Chỉnh sửa tập tin: /app/Providers/AppServiceProvider.php

<?php

namespace App\Providers;

class AppServiceProvider extends ServiceProvider
{        
    public function boot()
    {
        view()->share('key', 'value');
    }

    public function register()
    {
        // ...
    }
}


3

Đối với cách thanh lịch của tôi là như sau

{{ ''; $old_section = "whatever"; }}

Và chỉ lặp lại $old_sectionbiến của bạn .

{{ $old_section }}

3

Nếu bạn có PHP 7.0:

Cách đơn giản và hiệu quả nhất là gán trong ngoặc .

Quy tắc rất đơn giản: Bạn có sử dụng biến của mình nhiều lần không? Sau đó khai báo lần đầu tiên nó được sử dụng trong ngoặc, giữ bình tĩnh và tiếp tục.

@if(($users = User::all())->count())
  @foreach($users as $user)
    {{ $user->name }}
  @endforeach
@else
  There are no users.
@endif

Và vâng, tôi biết @forelse, đây chỉ là một bản demo.

Vì các biến của bạn bây giờ được khai báo là và khi chúng được sử dụng, nên không cần bất kỳ cách giải quyết nào.


2

Tôi không nghĩ rằng bạn có thể - nhưng một lần nữa, loại logic này có lẽ nên được xử lý trong bộ điều khiển của bạn và chuyển vào chế độ xem đã được đặt.


6
Một số biến là đúng cho quan điểm. $previous_group_name, $separator_printedv.v.
duality_

2
Nếu nó chỉ dành cho chế độ xem, bạn chỉ nên chuyển nó vào chế độ xem từ bộ điều khiển. Nếu bạn muốn nó có sẵn cho tất cả các chế độ xem, hãy xem câu trả lời của tôi ở trên bằng cách sử dụng app/controllers/BaseController.php.
Justin

1
Tôi đang sử dụng nhiều mảng để gửi tất cả dữ liệu $ của mình đến chế độ xem
Hos Mercury

2

Gán biến cho mẫu lưỡi cắt, Dưới đây là các giải pháp

Chúng tôi có thể sử dụng <?php ?>thẻ trong trang lưỡi

<?php $var = 'test'; ?>
{{ $var }

HOẶC LÀ

Chúng ta có thể sử dụng nhận xét lưỡi với cú pháp đặc biệt

{{--*/ $var = 'test' /*--}}
{{ $var }}

1

Hack bình luận không phải là một cách rất dễ đọc để làm điều đó. Ngoài ra các biên tập viên sẽ tô màu nó như một bình luận và ai đó có thể bỏ lỡ nó khi xem qua mã.

Hãy thử một cái gì đó như thế này:

{{ ''; $hello = 'world' }}

Nó sẽ biên dịch thành:

<?php echo ''; $hello = 'world'; ?>

... và làm bài tập và không lặp lại bất cứ điều gì.


1

Tốt hơn là thực hành để xác định biến trong Bộ điều khiển và sau đó chuyển sang xem bằng cách sử dụng compact()hoặc ->with()phương thức.

Nếu không, #TLGreg đã đưa ra câu trả lời tốt nhất.



1

Tôi đang tìm cách gán giá trị cho khóa và sử dụng nó nhiều lần trong chế độ xem của tôi. Trong trường hợp này, bạn có thể sử dụng @section{"key", "value"}ở vị trí đầu tiên và sau đó gọi @yield{"key"}để xuất giá trị ở các vị trí khác trong chế độ xem của bạn hoặc con của nó.


0

Theo tôi, tốt hơn hết là giữ logic trong bộ điều khiển và chuyển nó sang dạng xem để sử dụng. Điều này có thể được thực hiện theo một trong hai cách bằng phương pháp 'View :: make'. Tôi hiện đang sử dụng Laravel 3 nhưng tôi khá chắc chắn rằng đó là cách tương tự trong Laravel 4.

public function action_hello($userName)
{
    return View::make('hello')->with('name', $userName);
}

hoặc là

public function action_hello($first, $last)
{
    $data = array(
        'forename'  => $first,
        'surname' => $last
    );
    return View::make('hello', $data);
}

Phương pháp 'với' có thể kết nối được. Sau đó, bạn sẽ sử dụng như trên:

<p>Hello {{$name}}</p>

Thêm thông tin ở đây:

http://three.laravel.com/docs/view

http://codehappy.daylerees.com/USE-controllers


Logic trình bày là tốt nhất giữ trong xem. Đôi khi, bạn cần tạo một biến từ bên trong khung nhìn. ví dụ để định dạng một ngày. $format='Y-m-d H:i:s';bằng cách đó bạn có thể sử dụng lại định dạng đó trong chế độ xem. Điều này chắc chắn không thuộc về bộ điều khiển. Điều đó nói rằng, để trả lời cho câu hỏi ... Không có gì sai với <?php ?>các thẻ.
Nước thịt

0

Tôi đã có một câu hỏi tương tự và tìm thấy những gì tôi nghĩ là giải pháp chính xác với View Composers

Trình soạn thảo chế độ xem cho phép bạn đặt các biến mỗi khi một chế độ xem nhất định được gọi và chúng có thể là các chế độ xem cụ thể hoặc toàn bộ các mẫu xem. Dù sao, tôi biết đó không phải là câu trả lời trực tiếp cho câu hỏi (và 2 năm quá muộn) nhưng có vẻ như đó là một giải pháp duyên dáng hơn là đặt các biến trong chế độ xem bằng lưỡi dao.

View::composer(array('AdminViewPath', 'LoginView/subview'), function($view) {
    $view->with(array('bodyClass' => 'admin'));
});

0

laravel 5 bạn có thể dễ dàng làm điều này. xem bên dưới

{{--*/ @$variable_name = 'value'  /*--}}

0

Bạn có thể mở rộng lưỡi bằng cách sử dụng phương pháp mở rộng như hình dưới đây ..

Blade::extend(function($value) {
    return preg_replace('/\@var(.+)/', '<?php ${1}; ?>', $value);
});

sau đó khởi tạo các biến như sau.

@var $var = "var"

-1

hoạt động trong tất cả các phiên bản của lưỡi dao.

{{--*/  $optionsArray = ['A', 'B', 'C', 'D','E','F','G','H','J','K'] /*--}}
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.