Laravel — @yield () не допускается, если

В своем заголовке я некоторое время использовал @yield (‘title’), чтобы создать динамический заголовок для каждой отдельной страницы. Я хотел бы сделать еще один шаг вперед и сделать что-то вроде этого:

@if(@yield('title') == 'post')
<h1> This is the post page </h1>
@endif

Но если я попробую это, я получу ошибку:

«Выражение« yield »может использоваться только внутри функции»

Я искал и нашел такие вещи, как Section :: yield (‘title’), но все они не работали.

Как я могу использовать значение @yield (‘title’) в операторе if?
Я знаю, что вы можете отправить $ title для представления из контроллера, но я не думаю, что это выглядит очень хорошо .. Вы должны были бы определить заголовок дважды таким образом.

Спасибо за прочтение!

1

Решение

давайте посмотрим на ваш код

@if(@yield('title') == 'post')
<h1> This is the post page </h1>
@endif

давайте предположим, что это работает. тогда что @section('title') проведет? Post? это не имеет никакого смысла.

@yield используется для замены содержимого раздела. это не должно быть условно. это не должно использоваться как переменная. это имеет конкретное назначение. какие бы условия вы не хотели использовать, используйте их в поле зрения или в контроллере.

контроллер:

return View::make('view.blade.php',['title' => 'post']);

вот и все. вот как вы отправляете переменную в представление. Я не вижу ничего плохого в подходе.

для laravel 4.1 и ниже вы можете использовать эту команду.

@extends('layout.blade.php')->with('title','post')

но это поведение было изменено. до 4.1 переменные, передаваемые на просмотр, не были доступны в макете. теперь, в 4.2, это поведение изменено, и какие бы данные вы не передавали представлению, они также присутствуют в контроллере.

3

Другие решения

Хорошо, я не говорю, что это красиво, но вы можете передавать переменные PHP из представления в макет (или родительское представление)

Просмотр, содержащий «зная» заголовок

<?php $title = 'post' ?>

Вид компоновки

<?php
// just making sure the variable is set
if(!isset($title)){
$title = 'default-title';
}
?>

@if($title == 'post')
<h1> This is the post page </h1>
@endif

Однако вам, возможно, придется спросить себя, следует ли вам изменить способ, которым вы хотите это сделать. (Может быть, поможет ответ Integral Wind-up). Также View::share('title', 'post') от вашего контроллера будет намного чище.

0

Что, если вы просто определите это как раздел, так будет чище. Я предполагаю, что у вас есть макет лезвия, который расширяет мастер-макет.

@extends('layouts.master')

@section('title', 'Some title')
@section('header')
<h1> This is the post page </h1>
@stop

Тогда просто приведите их обоих в ваш основной макет. Если у вас есть другая страница, которая должна иметь другой заголовок и заголовок, вы должны создать новый вид, который снова расширяет основной макет.

Я не уверен, что это то, что вы пытаетесь сделать, но вы не можете использовать содержимое @yield в качестве условия для @if. По крайней мере, без использования тега PHP, который, как мне кажется, побеждает цель использования шаблонизатора.

Если это не то, что вы ищете, то, по крайней мере, я надеюсь, что это помогло.

Увидеть http://laravel.com/docs/4.2/templates для вашей справки.

0
По вопросам рекламы [email protected]