在laravel视图中使用命名空间

时间:2015-01-16 14:38:39

标签: laravel view namespaces

如何在laravel View中使用命名空间?我的意思是我在admin文件夹中有三个不同的文件夹frontendclientapp/views
如果我要加载部分模板,请在admin中的views/admin/partials/flush.blade.php部分views/admin/account/profile.blade.php说明,我必须将其包括在内:

@include('admin/partials/flush')

相反,我只想使用

@include('partials/flush')

我该怎么做?

1 个答案:

答案 0 :(得分:0)

您可以extend blade编写符合您需求的功能。像这样:

Blade::extend(function($view, $compiler)
{
    $pattern = $compiler->createMatcher('includeNamespaced');

    $viewPath = realpath($compiler->getPath());
    $parts = explode(DIRECTORY_SEPARATOR, $viewPath);
    $viewsDirectoryIndex = array_search('views', $parts);
    $namespace = $parts[$viewsDirectoryIndex + 1];

    $php = '$1<?php ';
    $php .= 'if($__env->exists(\''.$namespace.'.\'.$2)){';
    $php .= 'echo $__env->make(\''.$namespace.'.\'.$2)->render();';
    $php .= '}';
    $php .= 'else {';
    $php .= 'echo $__env->make($2)->render();';
    $php .= '}';
    $php .= '?>';

    return preg_replace($pattern, $php, $view);
});

然后像你所描述的那样使用它,但使用includeNamespaced

@includeNamespaced('partials/flush')

如果您愿意,也可以通过命名@include

来覆盖createMatcher('include')

注意“您的”@includeNamespaced / @include无法将参数传递给您的视图(第二个参数)

小提示:当您更改Blade::extend中的代码时,您必须删除storage/views中的缓存视图,以便在浏览器中显示更改。