PHP / Laravel - условно показать вид лезвия - PullRequest
1 голос
/ 13 июня 2019

у меня ниже app.blade.php шаблон:

<!-- Sidebar Area -->
@if (\Request::is('*/fields*'))
    @include('streams.nav.editor-menu')
@else
    @include('streams.nav.menu')
@endif

<!-- Content area -->
@yield('content')

Как видите, до сих пор я использовал условие ниже, чтобы проверить, должна ли отображаться конкретная боковая панель:

@if (\Request::is('*/fields/*'))

Выше просто проверяет, содержит ли маршрут маршруты fields, как определено ниже:

Route::resource('streams/{stream}/fields', 'Stream\FieldsController');

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

Route::resource('streams/{stream}/documents', 'Stream\DocumentsController');

Я мог бы просто добавить это к своему if утверждению:

@if (\Request::is('*/fields*') or \Request::is('*/documents*')) 
...
@endif

Однако я полагаю, что в будущем мне потребуется добавить еще больше маршрутов к этому заявлению.

Каков наилучший подход к этому? Возможно ли будет объявить это в controller или, может быть, даже model? Что-то вроде:

//Fields.php
/**
 * Specifies whether the editor menu should be shown or not.
 *
 * @return bool
 */

$sidebarEditor = true;

Однако я немного не уверен в том, как это реализовать - или есть ли лучший подход?

Ответы [ 2 ]

2 голосов
/ 13 июня 2019

Вы можете использовать его следующим образом:

@if (\Request::is('*/fields/*','*/documents/*')) 
...
@endif

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

Намного лучше было бы сделатьПользовательская вспомогательная функция, которая возвращает список таких значений или вы можете поделиться переменной массива с View Composer.

1 голос
/ 13 июня 2019

Есть несколько проблем с вашим подходом:

  • перегрузка ваших представлений логикой контроллера - плохая практика.В идеале вы хотели бы использовать только те значения, которые вы передаете в вид, поэтому доступ к Request фасаду - это неприятный запах;
  • с использованием метода is() для сопоставления маршрутов также является очень плохой практикой - это всегда приводит ктрудно обслуживаемый код: например, что происходит, когда кто-то меняет один из ваших маршрутов, просто переименовывая fields в attributes?Именно боковые панели перестают работать.Вот почему наименование ваших маршрутов и доступ к ним только по именам всегда должны быть предпочтительным подходом.

Если ваша боковая панель изменяется только для определенных страниц и зависит от другого содержимого в представлении, то вам следует использовать Blade'sДиректива @section:

// in your base.blade.php
<div class="sidebar">
    @section('sidebar')
        @include('default-sidebar')
    @show
</div>

// in your streams.blade.php
@extends('base')
@section('sidebar')
    @include('streams-specific-sidebar')
@endsection

Затем в действиях вашего контроллера для потоковых маршрутов вы инициализируете и возвращаете streams.blade.php вместо базового.В этом случае проверки is() не требуются, потому что маршрутизатор Laravel будет сопоставлять ваши маршруты с конкретными действиями контроллера, и эти действия будут возвращать определенные представления, которые расширяют базовые макеты, переопределяя секции по умолчанию, если это необходимо ('sidebar' в вашем случае).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...