Макет Laravel Для Разных Пользователей

#php #laravel

Вопрос:

Итак, у меня есть несколько макетов в моем приложении Laravel, но наиболее распространенным является и .

У меня есть общий маршрут / представление для страниц настроек и паролей, но я хочу использовать одно и то же представление в разных макетах в зависимости от типа пользователя.

/пароль — password.blade.php

 @if(Auth::user()->type == 'business')
<x-business-layout>
@else
<x-app-layout>
@endif
    

    PAGE CONTENT HERE


@if(Auth::user()->type == 'business')
</x-business-layout>
@else
</x-app-layout>
@endif
 

Вот как я думал, что смогу динамически изменять макет в зависимости от пользователя, но это не работает. Просто перейдите syntax error, unexpected 'else' в конец файла, где я снова использую этот код, чтобы закрыть макет.

Есть какие-нибудь способы сделать это?

Комментарии:

1. Попробуйте <x-business-layout/> , если ему нужен хорошо отформатированный XML

2. @apokryfos Я уже заканчиваю такие теги макета в нижней части файла 🙂

3. Ты не можешь этого сделать. Он должен открываться и закрываться в блоке «Если или иначе». Вы можете посмотреть, какую разметку он генерирует, если проверите файлы кэша в storage/framework/views

4. @apokryfos да, и я ищу решение для этого, чтобы мне не пришлось дублировать содержимое страницы на две части оператора if. Я обновлю вопрос, чтобы лучше показать код.

5. Вы уверены, что ваши секции правильно закрыты? С кодом, который вы опубликовали как есть, я не понимаю, как вы получаете синтаксическую ошибку.

Ответ №1:

Пожалуйста, не могли бы вы обновить свой ОП, чтобы включить код для <x-business-layout> ?

Я полагаю, что ваша синтаксическая ошибка вызвана чем-то там…

Кроме того, вместо того, чтобы дублировать Содержимое страницы, которое будет отображаться для каждой из ваших инструкций if, почему бы не создать функцию и/или переменную, содержащую содержимое страницы, к которому вам нужно обращаться только из ваших инструкций if?

Предложение 1

       <!-- Variable Example -->
<?php
$someVariable = "PAGE CONTENT HERE";

?>
<!-- Function Example -->
<?php
function someFunction()
{
    $pageContent = "Example Page Content Here";
    return $pageContent;
}
?>

@if(Auth::user()->type == 'business')
    <x-business-layout>
        <?php
    //Variable Example
    echo $someVariable; 
    
    ?>
    </x-business-layout>
@else
    <x-app-layout>
        <?php
    //Function Example
    echo someFunction() 
    ?>
    </x-app-layout>
@endif
    
 

ПРИМЕЧАНИЕ: <?php ?> теги требуются только в том случае, если вы еще не находитесь в открытых тегах PHP!

Предложение 2:

 @if(Auth::user()->type == 'business')
<x-business-layout>
@endif
@if(Auth::user()->type != 'business')
<x-app-layout>
@endif
    

    PAGE CONTENT HERE


@if(Auth::user()->type == 'business')
</x-business-layout>
@endif
@if(Auth::user()->type != 'business')
</x-app-layout>
@endif
 

Комментарии:

1. Вы задаете больше вопросов, чем ОП 🙂 Это не помогает решить проблему и поэтому не должно публиковаться в качестве ответа.

2. @AlexandreElshobokshy что не так с тем, что я задал ОП? Это предлагаемый ответ на его вопрос, который мог бы помочь решить его проблему…

Ответ №2:

Вы можете создать макет лезвия и расширить его по своим правилам. например: Давайте предположим, что это один из ваших макетов

 <!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  @section('content')
</body>
</html>
 

И это тот документ, который вы хотите показать:

 @if(Auth::user()->type == 'business')
  @extends('layout1')
@else
  @extends('layout2')
@endif

@section('content')


 your content here


@endsection
 

Ответ №3:

 @if(Auth::user()->type == 'business')
<x-business-layout>
@if(Auth::user()->type != 'business')
<x-app-layout>
@endif
 

Ваше @else заявление никогда не может быть достигнуто, так как Laravel вводит содержимое вашей страницы между условным блоком.

Ответ №4:

Переместите содержимое страницы в частичное представление

 @if (auth()->user()->type == 'business')
    <x-business-layout>
        @include('partials.page-content')
    </x-business-layout>
@else
    <x-app-layout>
        @include('partials.page-content')
    </x-app-layout>
@endif
 

или вы можете создать common макет, который будет использовать наследование шаблонов

layouts/common.blade.php

 @if (auth()->user()->type == 'business')
    <x-business-layout>
        @yield('content')
    </x-business-layout>
@else
    <x-app-layout>
        @yield('content')
    </x-app-layout>
@endif
 

тогда вы можете использовать его классическим способом

 @extends('layouts.common')

@section('content')
    PAGE CONTENT HERE
@endsection
 

Ответ №5:

Вы можете извлечь условную логику в отдельный компонент:

components/layouts.blade.php

 @if(Auth::user()->type == 'business')
    <x-business-layout>{{ $slot }}</x-business-layout>
@else
    <x-app-layout>{{ $slot }}</x-app-layout>
@endif

 

А затем используйте этот компонент для инкапсуляции различных типов компоновки:

password.blade.php

 <x-layout>
    PAGE CONTENT HERE
</x-layout>