Symfony 4路由到资产文件夹

Symfony 4 route to assets folder

我正尝试按照此页面上给出的说明将样式表加载到我的资产文件夹中:

https://symfony.com/doc/current/best_practices/web-assets.html

但我无法使用以下方法从 base.html.twig 导航到文件夹:

<link rel="stylesheet"  type="text/css" href="/assets/css/style.css" />

我的文件结构如下所示:

templates 
    base.html.twig 
assets
    css
        style.css

知道为什么这不起作用吗?

你可以尝试使用symfony的资产功能:

<link rel="stylesheet" href="{{ asset('css/style.css') }}" />

http://symfony.com/doc/3.4/best_practices/web-assets.html

资产功能在 Symfony 4 中仍然有用。

几个可能的解决方案 - 没有更多细节我不能确定他们是否一定能解决问题:

  • 首先,您是否配置了 webpack-encore 和 运行 构建?否则资源将不存在,nginx 将生成一个 404 尝试路由到它。

  • 其次,如果您是 运行 Docker,您可能没有将 ./app/public/ 文件夹装载到 nginx 容器中,因此可以提供文件。如果您在访问这些文件时收到 Symfony 404,这可能是问题所在。

在您的 AppExtension 中:

// register function here
public function getFunctions() {
    return [
        new TwigFunction('load_js_asset', array($this, 'fileGetJsAsset')),
    ];
}

// register filter here
public function getFilters() : array
{
    return [
        new TwigFilter('html_entity_decode', 
                       [$this, 'html_entity_decode'], 
                       ['is_safe' => ['html']]),
}

/**
 * @param string $string
 * @return string
 */
public function html_entity_decode(string $string) : string {
    return html_entity_decode($string);
}

/**
 * @param string $file
 * @param bool   $embedScriptTag
 * @return string
 */
public function fileGetJsAsset(string $file, bool $embedScriptTag = true) : string {
    /** @var bool|string $content */
    $content = file_get_contents(__DIR__ . '/../../assets/js/' . $file);

    if ($content === false) {
        throw new FileException('Could not found or read file: ' . $file);
    }

    if (!$embedScriptTag) {
        return $content;
    }

    return '<script>' . $content . '</script>';
}

现在在您的视图中像这样加载 js 资产:

// 从根 assets/js 文件夹加载

{{ load_js_asset('core/jquery.min.js', true)|html_entity_decode }} {{ load_js_asset('core/popper.min.js')|html_entity_decode }} {{ load_js_asset('my-beauty-js-file.js')|html_entity_decode }}`

希望对您有所帮助。

也许您还需要 htmlspecialchars_decode 过滤器。