从Laravel 5.3中的任何视图中隐藏任何元素的智能方法?

Bar*_*zek 5 php user-interface laravel

我遇到一个问题,我不想在某些视图中显示X元素.

真正的例子是,我不希望显示在页面上的产品形象滑块contactabout us,但它应该是在所有其他页面上看到(约6个)

因此,如何排除渲染在div ñ页面未做很长的@if条件是什么?对于时尚解决方案的想法?

编辑 回答我为什么不想把它放在独立视图文件中的问题:
想象一下,除了特定的视图外,您希望所有视图中都显示此行,并且只有一个

<span>Lorem Ipsum</span>
Run Code Online (Sandbox Code Playgroud)

这只是一行HTML代码,不值得在项目中创建另一个文件,因为它会在项目文件树中混乱,另一个例子是一个糟糕的解决方法

@if(\Request::route()->getName() !== "some.very.long.route.alias.name.that.looks.ugly")
    <span>Lorem Ipsum</span>
@endif
Run Code Online (Sandbox Code Playgroud)

使项目增长时难以阅读和理解代码

编辑2 我预测了一些建议的解决方案,并已经写了为什么这不适合处理这个问题.我看起来更有可能找到类似于@can@cannot取决于当前路线的解决方案

编辑3: 解决方案

编辑4: 我在这里发布了一个答案,但它还不完美(我不会将其标记为已接受),所以对于本主题的读者我将在下面粘贴它的副本

好的,我已经制作了一个简单的刀片指令,以一种漂亮的方式解决了这个问题

首先,创建一个数组,确定html代码段的路由访问权限
最佳位置是在config目录中创建此文件,例如presence.php文件

<?php
return [
    'ipsum' => [            // presence alias
        'about',            // disallowed route #1
        'contact'           // disallowed route #2
    ],
];
Run Code Online (Sandbox Code Playgroud)

然后在AppServiceProvider.php类中创建一个指令

<?php

namespace App\Providers;

use Illuminate\Support\Facades\Blade;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Blade::directive('presence', function($alias) {
            return "<?php if (in_array(\Request::route()->getName(),config('presence.'.$alias))):?>";
        });

        Blade::directive('endpresence', function() {
            return '<?php endif; ?>';
        });
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}
Run Code Online (Sandbox Code Playgroud)

并在html视图中最终使用此技巧

@presence('ipsum')
    <span>Lorem Ipsum</span>
@endpresence
Run Code Online (Sandbox Code Playgroud)

Lorem Ipsum如果当前路由名称不在 ipsum数组中(它在\App\config\presence.php文件中声明,因此我们可以使用config()helper方法访问它),它将打印

如果我可以处理通配符,那会很棒

<?php
return [
    'ipsum' => [            // presence alias
        'admin.category.*',       // advanced route pattern #1
        'admin.users.*'           // advanced route pattern #2
    ],
];
Run Code Online (Sandbox Code Playgroud)

但我稍后会研究它.

总是欢迎反馈或批评:)

Bar*_*zek 0

好的,我做了一个简单的刀片指令,以一种美观的方式解决了这个问题

首先,创建一个数组来确定 html 片段的路由访问
最好的位置是在 config 目录中创建此文件,例如一个presence.php文件

<?php
return [
    'ipsum' => [            // presence alias
        'about',            // disallowed route #1
        'contact'           // disallowed route #2
    ],
];
Run Code Online (Sandbox Code Playgroud)

AppServiceProvider.php然后在类中创建一个指令

<?php

namespace App\Providers;

use Illuminate\Support\Facades\Blade;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Blade::directive('presence', function($alias) {
            return "<?php if (in_array(\Request::route()->getName(), config('presence.'.$alias))): ?>";
        });

        Blade::directive('endpresence', function() {
            return '<?php endif; ?>';
        });
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}
Run Code Online (Sandbox Code Playgroud)

最后在 html 视图中使用这个技巧

@presence('ipsum')
    <span>Lorem Ipsum</span>
@endpresence
Run Code Online (Sandbox Code Playgroud)

Lorem Ipsum如果当前路由名称不在ipsum数组中(在文件中声明\App\config\presence.php,以便我们可以使用config()辅助方法访问它),它将打印

如果我可以处理通配符,比如

<?php
return [
    'ipsum' => [            // presence alias
        'admin.category.*',       // advanced route pattern #1
        'admin.users.*'           // advanced route pattern #2
    ],
];
Run Code Online (Sandbox Code Playgroud)

但我稍后会研究一下。

随时欢迎反馈或批评:)