IT story

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

hot-time 2020. 4. 26. 21:05
반응형

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


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

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

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


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

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

LARAVEL 5.5 이상

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

@php
$i = 1
@endphp

라 라벨 5.2 이상

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

@php ($i = 1)

또는 block 문에서 사용할 수 있습니다.

@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

변수를 정의합니다.


에서 , 당신은 / 설정 변수를 정의하는 템플릿 주석 구문을 사용할 수 있습니다.

주석 구문은 엔진에서 다음과 같이 {{-- anything here is comment --}}렌더링 됩니다.

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

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

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

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


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

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

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

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

{{ $variable }}

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


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

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

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

논문.

(또는 https://github.com/alexdover/blade-set도 꽤 성가신 것처럼 보입니다)

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

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

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


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

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

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


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

@php($old_section = "whatever")

또는

@php
    $old_section = "whatever"
@endphp

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

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

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

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


라 라벨 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을 설정했습니다.


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

한 가지 방법은 없습니다.

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

@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.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()
    {
        // ...
    }
}

내가 게시 한 패키지를 사용할 수 있습니다 : https://github.com/sineld/bladeset

그런 다음 변수를 쉽게 설정하십시오.

@set('myVariable', $existing_variable)

// or

@set("myVariable", "Hello, World!")

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

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

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

{{ $old_section }}

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


PHP 7.0 이 있다면 :

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

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

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

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

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


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

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

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

또는

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

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

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

다음과 같이 해보십시오 :

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

다음으로 컴파일됩니다.

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

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


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

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


Blade radic / blade-extensions에 대한 확장 성이 매우 우수 합니다 . 추가 한 후에는 @set (variable_name, variable_value)를 사용할 수 있습니다

@set(var, 33)
{{$var}}

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

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

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


제 생각에는 컨트롤러에 로직을 유지하고 사용하기 위해 뷰에 전달하는 것이 좋습니다. '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


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

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

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

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

{{--*/  $optionsArray = ['A', 'B', 'C', 'D','E','F','G','H','J','K'] /*--}}

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

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

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

@var $var = "var"

참고 URL : https://stackoverflow.com/questions/13002626/how-to-set-variables-in-a-laravel-blade-template

반응형