【问题标题】:How can I change the Blade template file extention from *.blade.php to only *.blade如何将 Blade 模板文件扩展名从 *.blade.php 更改为仅 *.blade
【发布时间】:2020-03-21 19:39:55
【问题描述】:

我知道 Laravel 的刀片模板位于 /resource/views 目录中。它的扩展名是 .blade.php .

我的问题是我为前端设计师设置了一个单独的 repo 来处理刀片模板,并且 repo 被设置为限制推送任何具有 .php 扩展名的文件。

如果我将所有 .blade.php 文件更改为 .blade 文件会怎样!这样做 laravel 是无法细化视图文件的。

我该如何管理它。

【问题讨论】:

  • 您可以使用some_view.blade,查看我的答案。
  • 这是一个坏主意和反模式。
  • @jeremykenedy 为什么这是一个坏主意有什么逻辑?
  • .php 文件受到保护,无法被视为纯文本,.blade 将能够被视为纯文本,并会产生安全风险。当您更改模板系统的完整性时,它会削弱它。在模板系统中加入了很多意见、考虑和设计。想象有一辆汽车并说您不想使用轮子,而是安装滑雪板并期望它能够正常运行..
  • @jeremykenedy 我没有发现更改扩展名的安全漏洞,因为每个刀片模板都驻留在 Web 服务器的公共根目录上方的目录中,所以直到我错过在那里配置 Web 服务器无法在浏览器中将视图视为纯文本,同样的事情也适用于 php 扩展。这个选项在 Laravel 中可用,请检查接受的答案。

标签: php laravel laravel-blade


【解决方案1】:

您可以轻松添加自定义extensionLaravel 提供了一种开箱即用的简单方法。只需打开app\Providers\AppServiceProvider.php文件并在boot方法中添加以下代码(不要忘记在namespace App\Providers;之后的类顶部使用use View):

public function boot()
{
    View::addExtension('blade', 'blade');
}

现在,你可以使用这样的东西,例如:

Route::get('/example', function () {
    return view('example', ['name' => 'The Alpha']);
});

在这种情况下,您应该使用名称example.bladeviews 目录中创建一个视图,例如(resources/views/example.blade):

<!-- Also a master.blade should be in views/layouts directory -->
@extends('layouts.master')

@section('content')
    Hello {{ $name }}
@endSection

这是resources/views/layouts/master.blade 代码:

<!DOCTYPE html>
<html>
    <head>
        <title>Laravel Custom Template</title>
    </head>
    <body>
        <div>
            @yield('content')
        </div>
    </body>
</html>

如果一切顺利,那么您在访问/example 路线时应该会看到Hello The Alpha。所以,唯一的事情就是使用View::addExtension('extension', 'engine) 添加一个新的extension,在这个例子中,我使用blade 作为引擎,所以你可以使用所有blade 指令/语法。或者,您可以使用php 作为引擎,这些默认情况下可用(也可以使用file),如果您使用php 作为引擎,则不能使用blade 指令/语法。

【讨论】:

  • 它运行良好,只添加了两行。使用 Illuminate\Support\Facades\View;和 View::addExtension('blade', 'blade');进入 AppServiceProvider 非常感谢,Laravel 文档中缺少此选项,或者我可能错过了。
【解决方案2】:

通过扩展Illuminate\View\Factory 类创建自定义视图工厂类。在该类中,修改$extensions 属性:

protected $extensions = [
        'blade' => 'blade', // add this entry
        'blade.php' => 'blade',
        'php' => 'php',
        'css' => 'file',
        'html' => 'file',
    ];

然后,创建一个新的服务提供者,并使用它将您的自定义工厂绑定到View\Factory 接口:

$this->app->bind(
            'Illuminate\Contracts\View\Factory',
            'App\YourCustomerViewProvider'
        );

应该就是这样。注意:我尚未对此进行测试,因此可能需要对其进行调整。

【讨论】:

    猜你喜欢
    • 2016-06-17
    • 2016-06-18
    • 2019-11-23
    • 2021-03-10
    • 2015-04-25
    • 2013-09-02
    • 2014-09-25
    • 2019-08-19
    • 2013-07-21
    相关资源
    最近更新 更多