Правильное многоразовое подпредставление с системой шаблонов Laravel Blade

У меня есть форма входа, которую я хочу повторно использовать в различных контекстах. Например, мне нужна страница только с логином (www.mysite.com/login), но я также хочу использовать форму входа на моей главной странице (www.mysite.com).

Документация Laravel предлагает следующий метод использования подпредставлений для профиля пользователя.

<!-- Stored in app/controllers/UserController.php -->

class UserController extends BaseController {

    /**
     * The layout that should be used for responses.
     */
    protected $layout = 'layouts.master';

    /**
     * Show the user profile.
     */
    public function showProfile()
    {
        $this->layout->content = View::make('user.profile');
    }

}

<!-- Stored in app/views/layouts/master.blade.php -->

<html>
    <body>
        @section('sidebar')
            This is the master sidebar.
        @show

        <div class="container">
            @yield('content')
        </div>
    </body>
</html>

<!-- Stored in app/views/user/profile.blade.php -->

@extends('layouts.master')

@section('sidebar')
    <p>This is appended to the master sidebar.</p>
@stop

@section('content')
    <p>This is my body content.</p>
@stop

Проблема в том, что подпредставление «загрязнено» кодом, делающим его дочерним элементом представления layouts.master. Поскольку я хочу, чтобы мою форму входа можно было повторно использовать в различных макетах, мне не нужны какие-либо ссылки на конкретный макет, в котором она должна использоваться.

Я полагаю, что могу вызвать это в представлении как переменную представления:

{{ $login }}

Затем реализуйте это с помощью контроллера следующим образом:

$this->someview->login = View::make('user.login');

Таким образом, мой вход в систему может быть чистым:

 <!-- Stored in app/views/user/login.php -->

<form method="post" action="{{ URL::to('/') }}/login" accept-charset="utf-8">
    <input type="hidden" name="_token" value="{{ csrf_token() }}">
    <fieldset>
        <legend>credentials</legend>
        <label>
            <span>email</span>
            <input name="email" type="email" placeholder="[email protected]" tabindex="1" required autofocus>
        </label>
        <label>
            <span>password</span>
            <input name="password" type="password" placeholder="password" tabindex="2" required>
        </label>
    </fieldset>
    <input type="submit" value="login">
</form>

Это лучший способ вставлять подпредставления без жесткого кодирования макета, в котором его следует использовать?

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


person Community    schedule 23.11.2014    source источник


Ответы (1)


Вы можете включить любое представление в другое, используя синтаксис блейда @include. документы Laravel (вам нужно немного прокрутить вниз)

@include('user.login')

Если вы хотите, вы также можете передать параметры...

@include('user.login', array('foo' => 'bar'))

... которые затем доступны как переменные во включенном представлении

{{ $foo }}

Обновлять

Так, например, для вашей страницы входа вы должны создать файл login.blade.php. (и я бы разместил подпрограмму входа в систему, содержащую форму, в подкаталоге, например, partials)

@extends('layouts.master')

@section('content')
    @include('partials.login')
@stop

И в вашем действии контроллера вы просто возвращаете вид входа (страницы)

return View::make('login'); // NOT partials.login

А для других страниц, которым нужна форма входа, просто сделайте то же самое.

person lukasgeiter    schedule 23.11.2014
comment
Верно, но это портит мой макет. Макет также используется для многих страниц. Я хочу, чтобы мой макет был агностическим, а также мое подвид. Я думаю иметь {{ $content }} в макете и использовать контроллер для загрузки моего представления. Не уверен, ясно ли я. - person ; 23.11.2014
comment
Не помещайте его в макет. Пожалуйста, взгляните на обновленный ответ - person lukasgeiter; 23.11.2014
comment
Хм, верно... Понятно. Интересно. Так что это дало бы мне лучшее из обоих слов, возможность вызывать представление входа в систему, которое автоматически загружало бы мой макет, но все еще имело бы чистую часть. Огромное спасибо. Я не понял этой частичной идеи. Я пометил ваш ответ. - person ; 23.11.2014