将多个参数传递给 Blade 指令

2024-01-05

我正在尝试创建一个刀片指令来突出显示将从我的搜索查询中返回的一些单词。

这是我的刀片指令:

class AppServiceProvider extends ServiceProvider

{
    public function boot()
    {
        Blade::directive('highlight', function($expression, $string){

            $expressionValues = preg_split('/\s+/', $expression);

            foreach ($expressionValues as $value) {
                $string = str_replace($value, "<b>".$value."</b>", $string);
            }

            return "<?php echo {$string}; ?>";
        });
    }

    public function register()
    {
    }
}

我这样调用 Blade:

@highlight('ho', 'house')

但是,这个错误一直伴随着我:

Missing argument 2 for App\Providers\AppServiceProvider::App\Providers\{closure}()

怎么解决呢?


对于关联数组,eval()可能是最简单的。但它的使用被认为是危险的,因为它就像你打开一个洞,一根用于执行代码的针。在同一时间eval() 在运行时执行,好吧将要执行的代码存储在数据库中(缓存[这意味着它缓存编译的字节代码])。这是额外的开销,所以性能会受到打击。这是一篇关于该主题的好论文[没有阅读或深入细节])https://link.springer.com/chapter/10.1007%2F978-981-10-3935-5_12 https://link.springer.com/chapter/10.1007%2F978-981-10-3935-5_12.

好吧,我可能已经找到你了!,服务器服务性能没有任何性能差异,因为视图被缓存,并且仅在您更改视图时才生成。指令被转换为 php 代码,并在另一个进程中被缓存。 (您可以在中找到生成的视图存储/框架/视图)

enter image description here So for

Blade::directive('custom', function ($expression) {
    eval("\$myarray = [$expression];");

    // do something with $myarray
    return "<?php echo ..";
});

没关系。对于 eval() 和性能没有什么可谈的(它已完成并缓存,生成的 php 代码是会一遍又一遍地运行的代码(只需确保指令返回的 php 代码不包含 eval() ,除非有原因)。直接使用 eval() (将一遍又一遍地用于不同的请求)会影响性能。 (我想谈谈 eval(),我认为这些都是有用的信息)

事实上,我们可以从 ["something" => "i should be sting", "" => "", ...] 解析数组。

eval("\$array = $expression;");
// then we can do what we want with $array 

但是我们不能传递变量。前任:@directive(["s" => $var])如果我们使用eval, $var在指令函数范围内将是未定义的。 (不要忘记指令只是一种漂亮地生成模板的方法,并将丑陋的(不是真的丑陋的)php 代码变成这样的指令。事实上,它是相反的,我们正在将漂亮的指令变成将是的 php 代码最后执行。您在这里所做的就是生成、构建、编写将形成最终 php 页面或文件的表达式。)

您可以做的是以这种方式传递变量 ["s" => "$var"] ,因此它将通过 eval。然后在您的 return 语句中使用它的示例:

return "<?php echo ".$array['s'].";?>";

当生成模板时,这将是<?php echo $var;?>;

请记住,如果您决定使用 eval,切勿在返回的字符串中使用它!或者在某些情况下您可能想要这样做。

另一种解决方案

(这是easy)根据建议的解析解决方案,是使用json格式将数据传递给您的指令,然后使用json_解码。 (我刚刚想到的)

class AppServiceProvider extends ServiceProvider

{
    public function boot()
    {
        Blade::directive('highlight', function($json_expression){

            $myArray = json_decode($json_expression)

            // do something with the array
        });
    }

    public function register()
    {
    }
}

这是我需要这样做的示例: 目标是实现自动化

@php
    $logo = !empty($logo) ? $logo : 'logo';
    $width = !empty($width) ? $width : 'logo';
    //...    // wait i will not always keep doing that ! h h
@endphp // imaging we do that for all different number of view components ...

所以我写了这个指令:

 public function boot()
    {
        Blade::directive('varSet', function ($expr) {
            $array = json_decode($expr, true);

            $p = '<?php ';
            foreach ($array as $key => $val) {
                if (is_string($val)) {
                    $p .= "\$$key = isset(\$$key) && !empty(\$$key) ? \$$key : '$val'; ";
                } else {
                    $p .= "\$$key = isset(\$$key) && !empty(\$$key) ? \$$key : $val; ";
                }
            }
            $p .= '?>';

            return $p;
        });
    }

我们这样使用它:

@varSet({
    "logo": "logo",
    "width": 78,
    "height": 22
})// hi my cool directive. that's slick.

为什么这个表格有效?它作为字符串模板传递,如下所示

"""
{\n
    "logo": "logo",\n
    "width": 78,\n
    "height": 22\n
}
"""

为了在模板变量中使用,将它们作为字符串传递,如“$var”,与我们对 eval 所做的相同。

对于从 ["" => "", ..] 格式进行解析,eval() 可能是最好的选择。请记住,这是在模板生成时完成的,模板稍后会被缓存,并且不会更新,直到我们再次进行更改。并记住不要在 return 中使用 eval() ;指导性指令。 (仅当您的应用程序需要时)

仅适用于多个参数,因此不是数组:像这样的函数就可以完成这项工作:

 public static function parseMultipleArgs($expression)
{
    return collect(explode(',', $expression))->map(function ($item) {
        return trim($item);
    });
}

or

public static function parseMultipleArgs($expression)
    {
        $ar = explode(',', $expression);
        $l = len($ar);

        if($l == 1) return $ar[0];

        for($i = 0; $i < $l; $i++){$ar[$i] = trim($ar[$i])}

        return $ar;
    }

你可以根据需要调整它们,使用 str_replace 删除诸如 () ...等之类的东西[简而言之,我们锻炼自己的解析。正则表达式可能会有所帮助。并取决于我们想要实现的目标。

以上所有都是解析条目并将它们分成用于生成模板的变量的方法。制作退货声明也是如此。

如果您想要的只是让您的指令采用包含视图范围中的变量的数组,该怎么办:

like in @section('', ["var" => $varValue])

这里特别是我们使用多参数解析,然后我们分别恢复 ["" => ..] 表达式(这不是重点)。

关键是当您想要传递要在代码中使用的数组(视图范围)时。您只需按原样使用它即可。 (这可能会令人困惑)。

ex:

Blade::directive("do", function ($expr) {
    return "<?php someFunctionFromMyGlobalOrViewScopThatTakeArrayAsParameter($expr); ?>
});

这将评估为

<?php someFunctionFromMyGlobalOrViewScopThatTakeArrayAsParameter(["name" => $user->name, .......]); ?>

所以一切都会好起来的。我举了一个例子,我们使用一个函数,你可以放置所有的逻辑。指令只是一种以更美观的方式编写视图的方法。它还允许预览处理和生成。安静真好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将多个参数传递给 Blade 指令 的相关文章

  • 安装失败:无法在 ubuntu 上的 WordPress nginx 中创建目录

    我在本教程的帮助下设置了 WordPress 如何在 ubuntu 18 04 上使用 LEMP 安装 WordPress https www digitalocean com community tutorials how to inst
  • 开发中的 Laravel 和视图缓存——无法立即看到变化

    我和一些朋友决定开始一个项目 我们偶然发现了 Laravel 并认为它可能是一个很好的工具 我们开始在本地使用它来开发一些页面 并注意到一些奇怪的事情 当我们用不同的信息更新视图时 大约需要 5 到 10 分钟视图信息才会发生变化 这就像
  • Google BigQuery 与 PHP 集成

    我需要帮助将 google bigquery 代码集成到 PHP 中 所以我可以从 php 代码本身执行查询和其他类型的操作 需要您的帮助并建议我一些工作示例链接 提前致谢 这是一段代码 正确地创建一个Google Client using
  • wkhtmltopdf 与 javascript-delay 不起作用

    使用下面的代码创建的 pdf 尚未完成 javascript 的渲染 因此 javascript 在一半的表格上执行 假设有 100 个表格 则有时完成 50 个表格 其他时候完成 52 54 个表格等 我正在使用旗帜 javascript
  • 从 MySQL 返回结果时的数字顺序

    我的数据库表中有以下类型的标题 Topic 1 blah blah Topic 2 blah blah Topic 3 blah blah Topic 10 blah blah Topic 11 blah blah etc 选择查询将始终返
  • 从 Joomla 3 url 中删除文章 ID

    我正在尝试从 Joomla 3 URL 中删除文章 ID 我四处搜寻 得到的答复是 组件 com content router php 将 0 更改为 1 advanced params gt get sef advanced link 1
  • Netbeans (PHP) 中的变量类型提示

    只是好奇 Netbeans 中是否有一种方法可以为常规变量提供类型提示 以便智能感知能够识别它 我知道你可以对类属性 函数参数 返回类型等执行此操作 但我不知道如何对常规变量执行此操作 当您有一个可以返回不同对象类型 如服务定位器 的方法时
  • 如何设置 Zend Cache Storage 的过期时间?

    我想在 Zend 文件系统缓存中存储一 些 XML 并让它在 30 分钟后过期 如何设置缓存持续时间 过期时间 我使用 Zend 缓存作为组件 而不是在完整的 ZF2 应用程序的上下文中 cache Zend Cache StorageFa
  • Laravel 规则和正则表达式 (OR) 运算符的问题

    我的 Laravel 规则和正则表达式操作有一个小问题 基本上 规则是一个数组 如下所示 room gt required alpha num min 2 max 10 我遇到的问题是使用正则表达式和 时 或 运算符 例如 cid gt r
  • 使用 AJAX 来回发送信息

    使用 post 你可以向服务器发送信息 但是当你需要从服务器接收信息时怎么办呢 信息如何从可以由 php 变量保存的方式变为可以由 javascript 变量保存的方式 反之亦然 这与您的问题更相关 http docs jquery com
  • 使 IPTC 数据可搜索

    我对 IPTC 元数据有疑问 是否可以通过 IPTC 元数据 关键字 搜索不在数据库中的图像并显示它们 我将如何执行此操作 我只需要一个基本的想法 我知道 PHP 有 iptcparse 函数 我已经编写了一个函数来获取画廊文件夹和所有子目
  • 创建验证电子邮件的机制

    我的网站上已经有一个高级用户登录 注册系统 colemansystems psm2 co uk http colemansystems psm2 co uk 但是 我希望向新用户发送一封电子邮件以验证他们的电子邮件地址 如果他们没有点击该链
  • 如何获取PHP版本?

    有没有办法检查从该脚本中执行特定脚本的 PHP 版本 例如 下面的代码片段 version way to get version print version 将在一台机器上打印 5 3 0 在另一台机器上打印 5 3 1 version p
  • 表单提交不起作用

    我有一张桌子 可以打印出所有可用的相机 它使用表单来更改这些设置 问题在于该表单仅更新条目中的最后一个摄像机 换句话说 如果我更改表单并为列表中的最后一个摄像机点击 应用 它将起作用 如果我更改此列表中任何其他摄像机的表单 它会将其更改为与
  • 通过电子邮件发送在 HTML5 画布上创建的图像

    我有一个画布 用户可以通过交互来更改设计 现在 用户完成更改后 可以提交他的设计及其电子邮件 ID 但为了提交设计 我使用以下方法将画布转换为图像http www nihilogic dk labs canvas2image http ww
  • 更新 xampp 中的 ICU 扩展吗?

    我在跑xampp我需要升级ICU php intl 扩展 到最新版本 我下载了54从 ICU 页面 但不确定如何升级它 有一个bin include and lib文件夹 我应该把这些文件放在哪里 我还需要做其他事情吗 要升级 XAMP 安
  • 即使浏览器关闭,如何保持 PHP 会话处于活动状态?

    即使用户不小心关闭了浏览器 如何才能保持用户的会话处于活动状态 例如 Facebook 如果您登录他们的网站并关闭选项卡或浏览器 当您再次打开浏览器并访问 Facebook 时 他们会自动检测活动用户 并且不会将您重定向到登录页面 我怎么做
  • 如何防止显示菱形问号符号,即使使用 mb_substr 和 utf-8

    我读过其他一些问题 尝试了答案 但最终没有结果 我得到的是例如这个 我无法删除那个奇怪的问号 我所做的就是获取 RSS feed 的内容 该内容也被编码为内容使用希腊语 有没有什么办法解决这一问题 div div
  • 完整日历 - 向事件对象添加额外属性

    可能是由于我缺乏理解 但我使用 PHP 返回 JSON 字符串来带回事件数据
  • MySql 西班牙语字符数据

    我有一个包含西班牙语字符的数据库 为了填充数据库 我从字符编码 UTF 8 的客户端页面获取值 当我在 mySql 数据库中插入值时 行包含更改的数据 例如 如果我插入 M xico 数据库中的条目是 M xico 其影响是当我对指定 M

随机推荐

  • 在反应组件中使用异步等待

    因此 我创建了一个组件 可以使用我提供的道具发出发布请求 虽然我熟悉异步等待 但由于某种原因 我似乎无法让它返回已履行承诺的实际值 而是只是等待 我尝试使用更多函数进行包装 因为我了解承诺并未得到解决 我觉得我失去了一些东西 下面是我的代码
  • 如何使用 Selenium ChromeDriver 执行右键单击?

    我一直在寻找这个问题 但找不到Python的答案 是否可以模拟右键单击 或通过 selenium chromedriver 打开上下文菜单 我见过 Java 和其他一些语言的选项 但从未见过 Python 我需要做什么才能模拟右键单击链接或
  • 我们可以使用 MS WebDeploy 创建一个新网站吗

    我已经阅读了许多关于通过 VS2012 和通过命令行进行 WebDeploy 的帖子 文档页面等 在所有部署方案中 我注意到目标站点应该已经存在于目标计算机 IIS 上 是否有一个选项可以创建一个包如果站点不存在则创建该站点在目标 托管 机
  • 处理 RDFa 中“rel”的非语义使用

    我使用 RDFa 将链接数据添加到我的网页 我也偶尔使用rel用于非语义目的的各种标签中的属性 例如触发 javascript 工具提示 我想知道我可以做些什么来区分用途 例如 我的社交网络图标周围有 RDFa 如下所示 a alt twi
  • 在 OpenShift 上使用密码保护 django 应用程序的非常简单的方法

    有没有一种非常简单的方法可以在测试时使用 htaccess 创建密码访问权限 我不想做任何会干扰应用程序的事情 有没有办法在 OpenShift 中做到这一点 您可以使用 htaccess 和 htpasswd 进行密码保护 以避免在网站尚
  • 在 zsh 中,如何对程序的退出状态执行条件?

    我想做类似的事情 if git status gt dev null then echo is a git repo else echo is not a git repo fi 但我不知道如何检查退出状态 我该如何解决 变量 包含最后命令
  • AutoFixture/AutoMoq 忽略注入实例/冻结模拟

    现在已经找到解决方案 简短的结论是 AutoFixture 返回冻结模拟就好了 我的 sut 也是由 AutoFixture 生成的 它只有一个公共属性 该属性具有对测试很重要的本地默认值 并且 AutoFixture 设置为新值 除此之外
  • 如何在android 2.2中使用fragment?

    我有一个支持 android 2 2 库的应用程序 在这个应用程序中我想使用片段 有人建议我 如果可能的话该怎么做 Thanks 是的 您需要使用支持库 重要的是要知道 您也可以使用蜂窝和冰淇淋三明治的支持库 这样您就可以在所有平台上使用相
  • htaccess 从根目录重定向到子文件夹,然后屏蔽 url?

    两件事情 Firstly 我的网站版本 2 位于名为 v2 的文件夹中 并且我想将不是 v2 文件夹子级的任何流量重定向到 www example com v2 位于根目录的旧站点是在 iWeb 中创建的 并且有很多子文件夹和子子文件夹 S
  • Qt:无法创建以 QVideoWidget 作为父级的浮动小部件?

    我正在尝试创建一个浮动的 无布局的小部件 但它似乎不适用于QVideoWidget因为它是父母 工作 MRE from PySide6 import QtWidgets as qtw app qtw QApplication w1 qtw
  • Python-从csv文件中读取特定列

    我只想读取 csv 文件中的第一列 我尝试了下面的代码 但没有从可用的解决方案中得到结果 data open data csv reader csv reader data interestingrows i 1 for i in read
  • 数值求解非线性方程

    我需要解决 Java 程序中的非线性最小化 N 个未知数的最小残差平方 问题 解决这些问题的常用方法是莱文伯格 马夸特 http en wikipedia org wiki Levenberg Marquardt algorithm算法 我
  • 如何根据属性值禁用数据绑定列表框项?

    有谁知道是否以及如何禁用数据绑定中的项目ListBox基于财产的价值 我最好想要一个DataTrigger其中 当某个属性是false 禁用该项目 使其无法选择 而不影响该项目中的其他项目ListBox
  • Terraform 不尊重 git 的 ssh 配置

    我的 terraform 模块位于通过 ssh 密钥访问的私有 bitbucket 存储库中 我不知道 git 命令 terraform 运行什么或如何更改身份验证 但它似乎使用不同的 ssh 配置 这是我的 tf file module
  • 使用 XPath/XQuery 获取元素名称

    有了以下 XML 示例文档 我需要发出 XPath XQuery 表达式来获取 CD 元素的每个子元素的元素名称
  • 如何更改 datagridview 选定行的背景颜色?

    如何在 C Windows 应用程序中更改 datagridview 选定行的背景颜色 来吧 伙计 必须有一个简单的解决方案 终于找到了一个 dataGridView1 DefaultCellStyle SelectionBackColor
  • 反应引导手风琴未加载

    我正在尝试将 React bootstrap 与 Bootstrap 5 一起使用 我想在我的页面之一中使用 Accordion 为此 我刚刚复制了此页面的结构 gt https react bootstrap netlify app co
  • 原型 AJAX 请求作为 OPTIONS 而不是 GET 发送;结果出现 501 错误

    我正在尝试使用 Prototype AJAX 访问 Web 服务 但遇到了一个我无法弄清楚的错误 似乎当我向服务器发出请求时 我的请求被解释为 OPTIONS 而不是 GET 请求 进而抛出 501 not Implemented 错误 因
  • 无法创建大小为 8064 的行,该行大于允许的行大小 8060

    在向现有表添加列时 我遇到了这个奇怪的问题 现有的表如下所示 CREATE TABLE BinaryAssets BinaryAssets BinaryAssetId int IDENTITY 1 1 NOT NULL BinaryAsse
  • 将多个参数传递给 Blade 指令

    我正在尝试创建一个刀片指令来突出显示将从我的搜索查询中返回的一些单词 这是我的刀片指令 class AppServiceProvider extends ServiceProvider public function boot Blade