使用Twig模板系统读取文件大小

使用Twig模板系统读取文件大小,twig,filesize,readability,Twig,Filesize,Readability,我想知道是否有一种内置的方法可以通过Twig模板系统输出可读的文件大小。假设我的模板中有类似的内容: <p>This limit is currently set to {{ maxBytes }}</p> {{ variable | format_bytes }} {{ bytes| formatBytes }} {{ bytes| formatBytes(0) }} 此限制当前设置为{{maxBytes} 如何格式化maxBytes以显示类似30GB的内容?有

我想知道是否有一种内置的方法可以通过Twig模板系统输出可读的文件大小。假设我的模板中有类似的内容:

<p>This limit is currently set to {{ maxBytes }}</p>
{{ variable | format_bytes }}
{{ bytes| formatBytes }}
{{ bytes| formatBytes(0) }}
此限制当前设置为{{maxBytes}


如何格式化
maxBytes
以显示类似
30GB
的内容?

有几种方法可以实现这一点:

1) 找一根能帮你处理的树枝。像这样的一个:

启用后,您只需执行以下操作:

{{ maxBytes|bfos_format_bytes }}
这会给你你想要的

2) 如果不想添加整个扩展名,可以创建一个宏来执行此操作。看起来是这样的:

{% macro bytesToSize(bytes) %}
{% spaceless %}
    {% set kilobyte = 1024 %}
    {% set megabyte = kilobyte * 1024 %}
    {% set gigabyte = megabyte * 1024 %}
    {% set terabyte = gigabyte * 1024 %}

    {% if bytes < kilobyte %}
        {{ bytes ~ ' B' }}
    {% elseif bytes < megabyte %}
        {{ (bytes / kilobyte)|number_format(2, '.') ~ ' KiB' }}
    {% elseif bytes < gigabyte %}
        {{ (bytes / megabyte)|number_format(2, '.') ~ ' MiB' }}
    {% elseif bytes < terabyte %}
        {{ (bytes / gigabyte)|number_format(2, '.') ~ ' GiB' }}
    {% else %}
        {{ (bytes / terabyte)|number_format(2, '.') ~ ' TiB' }}
    {% endif %}
{% endspaceless %}
{% endmacro %}
{%macro-bytesToSize(字节)%}
{%spaceless%}
{%set KB=1024%}
{%set MB=KB*1024%}
{%set千兆字节=兆字节*1024%}
{%set TB=GB*1024%}
{%if字节

您可以在此处阅读有关放置位置和如何使用宏的更多信息:

或者,只需创建细枝扩展:

ByteConversionWigExtension.php

<?php

namespace App\Twig;

use Symfony\Component\DependencyInjection\ContainerInterface;
use Twig\Extension\AbstractExtension;
use Twig\TwigFilter;

class AppExtension extends AbstractExtension
{
    /**
     * @var ContainerInterface
     */
    protected $container;


    /**
     * Constructor
     *
     * @param ContainerInterface $container
     */
    public function __construct(
        ContainerInterface $container
    )
    {
        $this->container = $container;
    }

    public function getFilters()
    {
        return array(
            new TwigFilter('formatBytes', array($this, 'formatBytes')),
        );
    }

    /**
     * @param $bytes
     * @param int $precision
     * @return string
     */
    public function formatBytes($bytes, $precision = 2)
    {
        $size = ['B','kB','MB','GB','TB','PB','EB','ZB','YB'];
        $factor = floor((strlen($bytes) - 1) / 3);
        return sprintf("%.{$precision}f", $bytes / pow(1024, $factor)) . @$size[$factor];
    }

}
细枝模板:

<p>This limit is currently set to {{ maxBytes }}</p>
{{ variable | format_bytes }}
{{ bytes| formatBytes }}
{{ bytes| formatBytes(0) }}

使用symfony 4编码格式的人类可读代码的细枝扩展,以及:

src/Twig/AppExtension.php

<?php

namespace App\Twig;

use Symfony\Component\DependencyInjection\ContainerInterface;
use Twig\Extension\AbstractExtension;
use Twig\TwigFilter;

class AppExtension extends AbstractExtension
{
    /**
     * @var ContainerInterface
     */
    protected $container;


    /**
     * Constructor
     *
     * @param ContainerInterface $container
     */
    public function __construct(
        ContainerInterface $container
    )
    {
        $this->container = $container;
    }

    public function getFilters()
    {
        return array(
            new TwigFilter('formatBytes', array($this, 'formatBytes')),
        );
    }

    /**
     * @param $bytes
     * @param int $precision
     * @return string
     */
    public function formatBytes($bytes, $precision = 2)
    {
        $size = ['B','kB','MB','GB','TB','PB','EB','ZB','YB'];
        $factor = floor((strlen($bytes) - 1) / 3);
        return sprintf("%.{$precision}f", $bytes / pow(1024, $factor)) . @$size[$factor];
    }

}
模板中的用法:

<p>This limit is currently set to {{ maxBytes }}</p>
{{ variable | format_bytes }}
{{ bytes| formatBytes }}
{{ bytes| formatBytes(0) }}

据我所知,没有定义函数/过滤器来执行此操作。您唯一的解决方案是。要理解为操作系统,确实使用1000(KiB MiB GiB TiB)而不是1024,请注意KiB指的是KibiByte 1 KiB=1024b,KB指的是千字节,1KB=1000字节。基洛在国际单位制中总是代表“千倍”。另一方面,许多软件开发人员(即使在熟悉的操作系统中)在不考虑公认定义的情况下混合所有这些单元。不想听起来迂腐,但KB在国际系统单元(或开尔文字节?)中没有意义。它应该是kB或KiB。