Лезвие Laravel расширяется внутри расширения

У меня есть 2 разных файла макета, которые я хочу расширить.

app.blade.php — основной макет:

<!DOCTYPE html>
<html lang="{{ app()->getLocale() }}">
<head>
    <!-- Meta -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <meta name="csrf-token" content="{{ csrf_token() }}">

    <title>@yield('title') | {{ config('app.name') }}</title>

    <!-- Styles -->
    <link rel="stylesheet" href="{{ asset('laraback/css/bootstrap.min.css') }}">
    <link rel="stylesheet" href="{{ asset('laraback/css/fontawesome.min.css') }}">
    <link rel="stylesheet" href="{{ asset('laraback/css/datatables.min.css') }}">
</head>
<body>

@yield('content')

<!-- Scripts -->
<script src="{{ asset('laraback/js/jquery.min.js') }}"></script>
<script src="{{ asset('laraback/js/popper.min.js') }}"></script>
<script src="{{ asset('laraback/js/bootstrap.min.js') }}"></script>
@stack('scripts')

</body>
</html>

form.blade.php - это дочерний макет, который я хочу использовать:

<div class="container h-100">
    <div class="row h-100 justify-content-center align-items-center">
        <div class="col-6">
            <div class="card">
                <div class="card-body">
                    @yield('content')
                </div>
            </div>
        </div>
    </div>
</div>

Вот мой код формы:

@section('content')
    <form method="POST" action="{{ route('login') }}" novalidate>
        {{ csrf_field() }}

        <div class="form-group">
            <label for="email">Email</label>
            <input type="email" name="email" id="email" class="form-control">
        </div>

        <div class="form-group">
            <label for="password">Password</label>
            <input type="password" name="password" id="password" class="form-control">
        </div>

        <div class="form-check">
            <label class="form-check-label">
                <input type="checkbox" name="remember" class="form-check-input">
                Remember
            </label>
        </div>

        <button type="submit" class="btn btn-primary">Login</button>
        <a class="btn btn-link" href="{{ route('password.email') }}">Forgot Your Password?</a>
    </form>
@endsection

Я знаю, что могу использовать @extends('layouts.app') для получения формы в основном макете, но как мне сделать так, чтобы я мог расширить form.blade.php внутри app.blade.php? (Я знаю, это звучит запутанно).

Это пример результата, который я хочу:

<!DOCTYPE html>
<html lang="{{ app()->getLocale() }}">
<head>
    <!-- Meta -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <meta name="csrf-token" content="{{ csrf_token() }}">

    <title>@yield('title') | {{ config('app.name') }}</title>

    <!-- Styles -->
    <link rel="stylesheet" href="{{ asset('laraback/css/bootstrap.min.css') }}">
    <link rel="stylesheet" href="{{ asset('laraback/css/fontawesome.min.css') }}">
    <link rel="stylesheet" href="{{ asset('laraback/css/datatables.min.css') }}">
</head>
<body>

<div class="container h-100">
    <div class="row h-100 justify-content-center align-items-center">
        <div class="col-6">
            <div class="card">
                <div class="card-body">
                    <form method="POST" action="{{ route('login') }}" novalidate>
                        {{ csrf_field() }}

                        <div class="form-group">
                            <label for="email">Email</label>
                            <input type="email" name="email" id="email" class="form-control">
                        </div>

                        <div class="form-group">
                            <label for="password">Password</label>
                            <input type="password" name="password" id="password" class="form-control">
                        </div>

                        <div class="form-check">
                            <label class="form-check-label">
                                <input type="checkbox" name="remember" class="form-check-input">
                                Remember
                            </label>
                        </div>

                        <button type="submit" class="btn btn-primary">Login</button>
                        <a class="btn btn-link" href="{{ route('password.email') }}">Forgot Your Password?</a>
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>

<!-- Scripts -->
<script src="{{ asset('laraback/js/jquery.min.js') }}"></script>
<script src="{{ asset('laraback/js/popper.min.js') }}"></script>
<script src="{{ asset('laraback/js/bootstrap.min.js') }}"></script>
@stack('scripts')

</body>
</html>

person kjdion84    schedule 16.12.2017    source источник


Ответы (1)


В app.blade.php вы можете использовать @yield('content') как ваш код. app.blade.php идеален.

В вашем form.blade.php исправьте, как показано ниже.

@extends('layouts.app')
@section('content')
<div class="container h-100">
    <div class="row h-100 justify-content-center align-items-center">
        <div class="col-6">
            <div class="card">
                <div class="card-body">
                    @include('form_content')
                </div>
            </div>
        </div>
    </div>
</div>

@endsection

И вам нужно сделать файл form_content.blade.php с содержимым вашей формы без @section и @endsection.

<form method="POST" action="{{ route('login') }}" novalidate>
    {{ csrf_field() }}

    <div class="form-group">
        <label for="email">Email</label>
        <input type="email" name="email" id="email" class="form-control">
    </div>

    <div class="form-group">
        <label for="password">Password</label>
        <input type="password" name="password" id="password" class="form-control">
    </div>

    <div class="form-check">
        <label class="form-check-label">
            <input type="checkbox" name="remember" class="form-check-input">
            Remember
        </label>
    </div>

    <button type="submit" class="btn btn-primary">Login</button>
    <a class="btn btn-link" href="{{ route('password.email') }}">Forgot Your Password?</a>
</form>

Затем вы можете увидеть страницу результатов, как хотите.

Вы можете использовать @if для классификации предложений @include. Это означает, что вы можете создавать условные предложения для каждого @include. Поэтому, если условие подходит, вы можете включить один из разделов @include.

person HiKangg    schedule 16.12.2017
comment
С этим решением мне пришлось бы создать 2 разных файла только для отображения одной и той же формы. - person kjdion84; 16.12.2017
comment
Что значит 2 разных файла? - person HiKangg; 16.12.2017
comment
Мне пришлось бы создавать отдельные файлы form.blade.php для каждой формы, которую я хочу использовать с дочерним макетом, потому что @include каждый раз будет другим. - person kjdion84; 16.12.2017