Вывод переменных после проверки на существование Laravel


Dram
109

Изучаю Ларавел, дошел до темы —  Вывод переменных после проверки на существование.

В контроллере

class Test extends Controller
{
    public function sum($num1, $num2)
    {
        return view('test.show', ['city' => 'СПб']);
    }
}

В шаблоне два варианта

<p>{{ $city or 'Москва' }}</p>
<p>{{ isset($city) ? $city : 'Москва' }}</p>

В итоге получаю

1

СПб

Что за 1 ?

НО если в контроллере сделать переменную пустой 

['city' => '']

То на фронте останется только — 1.

Где я ошибаюсь? По идее ожидалось два раза вывод «СПб», а если пустая переменна — «Москва»


Dram

В итоге даже так, если в контроллере сделать переменную пустой, то и на фронте пустота

@if(isset($city))
{{ $city}}
@else
{{ 'Москва'}}
@endif

ГДе я ошибаюсь?  Вроде делаю все как в доках https://laravel.ru/docs/v5/blade#отображение-5

Пока нужной логики добился только от варианта

@if(!empty($city))
{{ $city}}
@else
{{ 'Москва'}}
@endif


livetv

$city or 'Москва'

Это приводит к булево.

Оффтоп.

Почему Вы решили изучать лару?


Pr00f

вам бы php сперва подучить

https://www.php.net/manual/ru/function.empty.php

https://www.php.net/manual/ru/function.isset.php

isset проверяет существует ли переменная и ее значение не null. empty проверяет пустое ли значение у переменной. к пустым относятся:

    «» (пустая строка)
    0 (целое число)
    0.0 (число с плавающей точкой)
    «0» (строка)
    NULL
    FALSE
    array() (пустой массив)

      можно решить и вот так:

      <p>{{ empty($city) ? 'Москва' : $city }}</p

      да и документация эта уже устарела. она для 5-й версии, сейчас уже актуальна 7 версия

      https://laravel.com/docs/7.x/blade


      Dram

      Я не пойму, почему <p>{{ $city or ‘Москва’ }}</p> выводит 1 ?

      Если убрать or ‘Москва’ то выводит как и ожидалось значение сити.


      Pr00f

      Dram #:
      Я не пойму, почему <p>{{ $city or ‘Москва’ }}</p> выводит 1 ?

      Если убрать or ‘Москва’ то выводит как и ожидалось значение сити.

      выше уже ответили. при использовании OR вам возвращается результат проверки вашего условия (true, false) а не значения переменных. и если этот результат true/false перевести в строку, то получится 1 или 0

      https://www.php.net/manual/ru/language.operators.logical.php


      Dram

      Как тогда понять эти данные из доков (пусть и к 5 версии),  https://laravel.ru/docs/v5/blade#отображение-5

      Вместо написания тернарного оператора Blade позволяет вам использовать такое удобное сокращение, которое будет скомпилировано в тернарный оператор, приведённый ранее:

      {{ $name or 'Default' }}

      Если переменная $name  имеет значение, то оно будет отображено, иначе будет выведено слово Default .


      Pr00f

      Dram #:

      Как тогда понять эти данные из доков (пусть и к 5 версии),  https://laravel.ru/docs/v5/blade#отображение-5

      Вместо написания тернарного оператора Blade позволяет вам использовать такое удобное сокращение, которое будет скомпилировано в тернарный оператор, приведённый ранее:

      Если переменная $name  имеет значение, то оно будет отображено, иначе будет выведено слово Default .

      возможно, в версии 5.0-5.3 фреймворка так и работало. а в одной из следующих версии поменяли поведение, чтобы не путать разработчиков. начиная с версии 5.4 такого примера нет в документации, но появились @empty и @isset

      рекомендую пользоваться актуальной документацией. фреймворк довольно часто обновляется и многие вещи в нем сильно меняются https://laravel.com/docs/7.x/blade

      Добавить комментарий

      Ваш адрес email не будет опубликован. Обязательные поля помечены *