라 라벨 블레이드 템플릿에서 변수를 설정하는 방법


248

Laravel Blade 설명서를 읽고 있는데 나중에 사용할 템플릿 내에 변수를 할당하는 방법을 알 수 없습니다. 나는 {{ $old_section = "whatever" }}그것이 "무엇이든"을 반향시키고 그것을 원하지 않기 때문에 할 수 없습니다 .

나는 할 수 있음을 이해 <?php $old_section = "whatever"; ?>하지만 우아하지 않습니다.

블레이드 템플릿에서 더 좋고 우아한 방법이 있습니까?



이것은 특히 템플릿 작업을하고 있지만 다른 사람이 PHP 부분에서 작업하는 경우 테스트에 유용합니다. 테스트가 끝나면 선언을 제거하십시오.
trysis

단순히하는 것에 문제가 <?php $old_section = "whatever"; ?>있습니다. 나는 그것을 아주 읽기 쉽다는 것을 안다.
Jaime Hablutzel

내 의견으로는 @JaimeHablutzel 대답은 ​​의문의 여지가 있습니다 : 그것은 우아하지 않습니다.
duality_

답변:


122

블레이드 태그가 없으므로보기에서는 사용하지 않는 것이 좋습니다. 블레이드보기에서이 작업을 수행하려면 PHP 태그를 작성한대로 열거 나 새 블레이드 태그를 등록하면됩니다. 예를 들면 :

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

9
뷰의 변수에는 몇 가지 용도가 있습니다. 멋지다! 이 코드를 넣을 좋은 곳은 어디입니까?
duality_

1
application / start.php에 넣거나 이와 같은 것들이 더 있다면 별도의 파일에 넣고 포함시킬 수 있습니다. Laravel은 이런 식으로 매우 느슨합니다. 심지어 컨트롤러를 얇게 넣을 수도 있습니다. 뷰를 렌더링하기 전에 이러한 작업을 수행해야합니다.
TLGreg

19
{?네이티브 코드를 사용하는 대신 사용할 여분의 코드를 추가하는 이유는 무엇입니까 <??
Justin

1
그렇게하지 않으면 다음을 수행하는 "적절한"방법이 있습니까? 제목이 기본 앱보기에서 {{$ title}}으로 렌더링되는 사이트가 있는데 여기에는 제목에 페이지 번호를 추가해야하는 하위 시스템 ( "Application Form Page {{$ page}}")이 포함되어 있습니다. $ page를 뷰에 전달하고 있습니다 (뷰 내에서 다르게 사용됨). 각 컨트롤러 호출에서 제목을 작성하고 싶지 않습니다.보기를 페이지 번호를 보내고 싶습니다. 언젠가 기본 제목을 변경하려는 경우를 대비하여. 지금 <? php $ title = ...?>를 사용하고 있지만 더 정확한 방법이 있습니까?
jdavidbakr

4
변수는보기에서 인라인으로 선언되지 않고 컨트롤러에서 전달되어야합니다. 글로벌 템플리트에 변수가 필요한 경우 서비스 제공 업체 stackoverflow.com/a/36780419/922522 에서 변수를 설정할 수 있습니다 . 페이지 특정 템플릿에 변수가 필요한 경우 @yield를 사용하여 컨트롤러가있는 자식 뷰에서 전달하십시오. laravel.com/docs/5.1/blade#template-inheritance
Justin

361

LARAVEL 5.5 이상

@php 블레이드 지시어는 더 이상 인라인 태그를 허용하지 않습니다. 대신 지시문의 전체 형식을 사용하십시오.

@php
$i = 1
@endphp

라 라벨 5.2 이상

당신은 단지 사용할 수 있습니다 :

@php ($i = 1)

또는 블록 명령문에서 사용할 수 있습니다.

@php
$i = 1
@endphp

라 라벨 5

다음과 같이 블레이드를 확장하십시오.

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

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

그런 다음 다음 중 하나를 수행하십시오.

빠른 해결책 : 게으른 경우 AppServiceProvider.php의 boot () 함수에 코드를 넣으십시오.

더 나은 솔루션 : 자체 서비스 제공 업체를 만드십시오. Laravel 5에서 블레이드를 확장하는 방법 은 https://stackoverflow.com/a/28641054/2169147 을 참조 하십시오 .이 방법은 조금 더 많은 작업이지만 공급자를 사용하는 방법에 대한 좋은 연습입니다. :)

라 라벨 4

위의 코드를 app / start / global.php (또는 더 나은 느낌이 든다면 다른 곳) 의 맨 아래에 넣으십시오 .


위의 변경 후 다음을 사용할 수 있습니다.

@define $i = 1

변수를 정의합니다.


5
좋은! 구현으로 모든 PHP 문을 실행할 수 있습니다. @php와 같은 이름으로 바꿉니다. 매우 편리합니다 ...
igaster

매우 사실입니다. 원하는 경우 'define'의 이름을 'php'로 바꿀 수 있지만 템플릿에서 PHP를 과도하게 사용하는 함정을 엽니 다. :)
Pim

1
@ C.delaFonteijne에게 감사합니다. 네임 스페이스를 사용해야하는 경우에는 반드시 \가 필요합니다. 위 코드에 \를 추가했습니다.
Pim

1
Laravel 5.2 이후로 거의 정확한 구현이 표준 입니다. @php(@i = 1)블록 문에서 사용 하거나 사용할 수 있습니다 (로 닫음 @endphp)
Daan

1
"@php" "@endphp"가 "<? php" "?>"보다 "우아한"방법을 모르겠습니다. 심지어 몇 자 더 길다! 다른 Blade 지시문과 같이 "@"로 시작하기 때문입니까? 우리 개발자들은 강박 관념 무리입니다! ;-)
OMA

116

템플릿 주석 구문을 사용하여 변수를 정의 / 설정할 수 있습니다.

주석 구문은 {{-- anything here is comment --}} 의해 렌더링됩니다. 엔진

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

약간의 트릭으로 변수를 정의하는 데 사용할 수 있습니다. 예를 들어

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

에 의해 렌더링됩니다 <?php /* */$i=0;/* */ ?>하는 우리를 위해 변수를 설정합니다. 코드 줄을 바꾸지 않고.


2
@ trying-tobemyself +1 | 아니 모범 사례 방법,하지만 완벽한 와 같은 템플릿 코드의 빠른 해킹에 대한 인라인 스타일을 html로합니다.
Markus Hofmann

121
나는 당신을 미워하려고 한 후에이 코드를 보는 사람 으로이 해킹을하는 것은 권장하지 않습니다.
저스틴

2
Justin의 의견에 따르면, 댓글 태그는 댓글 용이며, 댓글 내에서 주석 처리를 제거하고 다른 작업을 시작하기 시작합니다.
Leon

27
이것은 일반 ol 'php보다 낫지 않습니다<?php $i=0; ?>
gyo

3
PHP 태그를 사용하는 대신 이것을하는 요점은 무엇입니까 ?? 읽을 수없고 (주석처럼 보임) 더 많은 타이핑이 필요하며 구문 분석 시스템 업데이트로 인해 손상 될 수 있습니다. 포인트가 있더라도 블레이드 템플릿에서 변수를 정의하는 방법에 대한 대답은 아닙니다. 유권자들에게 무슨 문제가 있는지 모릅니다. 아마도 그들은 '괴짜'라고 생각했을까요? meh ...
SuperDuck

52

코드를 변경할 필요가없는 간단한 해결 방법이 있으며 Laravel 4에서도 작동합니다.

예를 들어와 같은 연산자 대신 문에 =전달 된 식에 대입 연산자 ( )를 사용하면 @if됩니다 ==.

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

그런 다음 다른 변수를 사용할 수있는 곳이라면 어디서나 사용할 수 있습니다.

{{ $variable }}

유일한 단점은 과제를 해결 방법으로 수행하고 있음을 알지 못하는 사람에게는 과제가 실수처럼 보일 것입니다.


27

나중에 너무 복잡하게 만들고 있습니다.

그냥 일반 PHP를 사용하십시오

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

논문.

(또는 https://github.com/alexdover/blade-set도 꽤 까다로워 보입니다)

우리는 모두보기에서 변수를 설정하여 시스템을 "해킹"하고 있는데, 왜 "해킹"을 더 복잡하게 만드는가?

Laravel 4에서 테스트되었습니다.

또 다른 이점은 구문 강조가 제대로 작동한다는 것입니다 (이전에 주석 해킹을 사용하고 있었고 읽기가 끔찍했습니다)


21

블레이드 템플릿 엔진에서 변수를 설정할 수있는 방법은 다음과 같습니다.

1. 일반 PHP 블록
설정 변수 : <?php $hello = "Hello World!"; ?>
출력 : {{$hello}}

2. 블레이드 PHP 블록
설정 변수 : @php $hello = "Hello World!"; @endphp
출력 : {{$hello}}


19

Laravel 5.2.23부터는 @php Blade 지시문 이 있으며 인라인 또는 블록 명령문으로 사용할 수 있습니다.

@php($old_section = "whatever")

또는

@php
    $old_section = "whatever"
@endphp

15

보기 파일에서 변수를 설정할 수 있지만 설정 한대로 인쇄됩니다. 어쨌든 해결 방법이 있습니다. 사용하지 않는 섹션 내에서 변수를 설정할 수 있습니다. 예:

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

그런 다음 원하는 곳에 {{ $yourVar }}인쇄 Your value하지만 변수를 저장할 때 출력을 얻지 못합니다.

편집 : 섹션 이름을 지정해야합니다. 그렇지 않으면 예외가 발생합니다.


다른 것이 포함되어 있지 않아야합니다. 정의되지 않은 속성 : Illuminate \ View \ Factory :: $ startSection (보기 : /home/vagrant/Code/dompetspy/resources/views/reviews/index.blade.php)
MaXi32

14

라 라벨 4 :

템플릿뿐만 아니라 모든 뷰에서 변수에 액세스 할 수 View::share있는 좋은 방법입니다 ( 이 블로그에 대한 자세한 정보 ).

app / controllers / BaseController.php에 다음을 추가하십시오.

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

이제 $myvar템플릿을 포함한 모든보기에서 사용할 수 있습니다.

이 이미지를 사용하여 이미지의 환경 특정 자산 URL을 설정했습니다.


1
이것이 내가 찾던 것입니다 : 데이터베이스에서 중복 호출을 피하는 좋은 방법!
clod986

이것은 Laravel 5에서 옵션이 아닌 것 같습니다?
Goddard

@Goddard 아직도 할 수 있습니다. 그래도 문법이 바뀌었다 : stackoverflow.com/a/36780419/922522
Justin

8

그리고 갑자기 아무것도 나타나지 않을 것입니다. 내 경험에 따르면, 이와 같은 작업을 수행 해야하는 경우 모델의 메소드에서 html을 준비하거나 배열 또는 무언가로 코드를 재구성하십시오.

한 가지 방법은 없습니다.

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

11
모델에서 HTML을 준비 하시겠습니까? 그것은 상상할 수있는 가장 추악한 일입니다.
duality_

@duality_ 뷰에서 변수를 선언하고 변경합니다. 아마도 코드를 잘못 구성하고 있다고 말했습니다. LRN 2 건축가.
Michael J. Calkins 2016 년

3
물론, Michael ... 이러한 변수는와 같은 변수가 아니라 $users = ...선을 따라 나오는 $css_class = ...변수이므로 디자이너가 결정한 모델이나 컨트롤러에 속하지 않는 변수를 엄격하게 디자인하십시오.
duality_

2
당신이 그 길을 가야한다면, 나는 더 간단하고 우아한 해결책을 선호합니다 : {{ ''; $ x = 1}}
Daniel


6

@Pim이 제공하는 답변을 확장하겠습니다.

이것을 AppServiceProvider의 부팅 메소드에 추가하십시오.

<?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}; ?>";
});

이렇게하면 PHP 표현식을 작성하는 기능을 노출하지 않습니다.

이 지시문을 다음과 같이 사용할 수 있습니다.

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

5

라 라벨 5.1, 5.2 :

https://laravel.com/docs/5.2/views#sharing-data-with-all-views

응용 프로그램에서 렌더링 한 모든 뷰 와 데이터 조각을 공유해야 할 수도 있습니다 . 뷰 팩토리의 공유 방법을 사용하면됩니다. 일반적으로 서비스 제공 업체의 부팅 방법 내에서 공유를 호출해야합니다. AppServiceProvider에 무료로 추가하거나 별도의 서비스 공급자를 생성하여 보관할 수 있습니다.

파일 편집 : /app/Providers/AppServiceProvider.php

<?php

namespace App\Providers;

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

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


3

내 우아한 방법은 다음과 같습니다

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

$old_section변수를 에코하십시오 .

{{ $old_section }}

3

PHP 7.0 이 있다면 :

가장 간단하고 효과적인 방법은 대괄호 안에 할당하는 것입니다 .

규칙은 간단합니다. 변수를 두 번 이상 사용하십니까? 그런 다음 대괄호 안에서 처음 사용할 때 선언하고 침착하게 유지하십시오.

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

그리고 그렇습니다 @forelse. 이것은 데모 일뿐입니다.

이제 변수가 사용되는 시점과 변수가 선언되었으므로 블레이드 해결 방법이 필요하지 않습니다.


2

나는 당신이 할 수 있다고 생각하지 않습니다.하지만 다시, 이런 종류의 논리는 아마도 컨트롤러에서 처리되어 이미 설정된 뷰로 전달되어야합니다.


6
일부 변수는보기 전용입니다. $previous_group_name,, $separator_printed
duality_

2
뷰 전용 인 경우 컨트롤러에서 뷰로 전달해야합니다. 모든보기에서 사용할 수있게하려면 위의 내 대답을 사용하십시오 app/controllers/BaseController.php.
저스틴

1
여러 배열을 사용하여 모든 $ 데이터를 뷰로 보냅니다
Hos Mercury

2

블레이드 템플릿에 변수를 할당합니다. 솔루션은 다음과 같습니다.

<?php ?>블레이드 페이지로 태그를 사용할 수있다

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

또는

특수한 구문으로 블레이드 주석을 사용할 수 있습니다

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

1

댓글을 해킹하는 것은 읽기 쉬운 방법이 아닙니다. 또한 편집자는 주석으로 색상을 지정하고 코드를 살펴볼 때 누군가 주석을 놓칠 수 있습니다.

다음과 같이 해보십시오 :

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

다음으로 컴파일됩니다.

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

... 과제를 수행하고 아무 것도 에코하지 않습니다.


1

그것은 사용하여 볼을 통과 한 후 컨트롤러에서 변수를 정의하고 연습하는 것이 좋습니다 compact()또는->with() 방법.

그렇지 않으면 #TLGreg가 가장 좋은 대답을하였습니다.



1

키에 값을 할당하고 내 견해에서 여러 번 사용하는 방법을 찾고있었습니다. 이 경우 @section{"key", "value"}처음에 사용 하고을 호출 @yield{"key"}하여보기 또는 하위의 다른 위치에 값을 출력 할 수 있습니다.


0

제 생각에는 컨트롤러에 로직을 유지하고 사용하기 위해 뷰에 전달하는 것이 좋습니다. 'View :: make'메소드를 사용하여 두 가지 방법 중 하나를 수행 할 수 있습니다. 나는 현재 Laravel 3을 사용하고 있지만 Laravel 4에서도 동일한 방식이라고 확신합니다.

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

또는

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

'with'메소드는 연결 가능합니다. 그런 다음 위와 같이 사용하십시오.

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

자세한 내용은 여기 :

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

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


프리젠 테이션 로직은 뷰에서 가장 잘 유지됩니다. 때로는보기 내에서 변수를 작성해야합니다. 예를 들어 날짜 형식을 지정합니다. $format='Y-m-d H:i:s';그렇게하면 뷰 내에서 해당 형식을 재사용 할 수 있습니다. 이것은 확실히 컨트롤러에 속하지 않습니다. 즉, 질문에 대한 응답으로 <?php ?>태그 에는 아무런 문제가 없습니다 .
Gravy

0

비슷한 질문이 있었고 View Composers를 사용 하여 올바른 솔루션이라고 생각하는 것을 발견했습니다.

View Composers를 사용하면 특정 뷰를 호출 할 때마다 변수를 설정할 수 있으며 특정 뷰 또는 전체 뷰 템플릿 일 수 있습니다. 어쨌든, 그것이 질문에 대한 직접적인 대답은 아니며 (2 년이 너무 늦음) 블레이드로보기 내에서 변수를 설정하는 것보다 더 우아한 해결책처럼 보입니다.

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

0

laravel 5 쉽게 할 수 있습니다. 아래 참조

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

0

아래 그림과 같이 확장 방법을 사용하여 블레이드를 확장 할 수 있습니다.

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

그 후 다음과 같이 변수를 초기화하십시오.

@var $var = "var"

-1

모든 버전의 블레이드에서 작동합니다.

{{--*/  $optionsArray = ['A', 'B', 'C', 'D','E','F','G','H','J','K'] /*--}}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.