【问题标题】:Phalcon Volt Array is of string typePhalcon Volt Array 是字符串类型
【发布时间】:2016-08-25 14:37:31
【问题描述】:

我有一个 Phalcon volt 模板,我想在我的自定义助手中调用,它会接受一个数组,但发送给助手的数组是字符串类型的。

在我的 list.volt 中有这段代码,

{% set myfolder = data.foldername %}
{% set key = data.folderkey %}
{% set url = convert([myfolder, key]) %}

我的 loader.php 中, 我已经声明了 helper 目录并拥有以下代码:

 //$params should be single dimensional array
 $compiler->addFunction('convert', function($params){
      var_dump($params);
      return MyCustomHelper::convert($params);  
 });

将输出 string(31) "array($fname, $fkey)" 而不是数组类型。它使我的助手停止工作。

有人遇到这种情况,我需要它是数组类型而不是字符串吗?

更新:在应用@Nikolay Mihaylov 的建议之后。

出错了

致命错误: 在第 56 行的缓存/volt/%apps%%invo%%views%%test%%list.volt.php 中找不到类“MyCustomUrlHelper”

在我的 services.php 中,我已经包含了我的助手目录

use Modules\Library\MyCustomUrlHelper;

/*
    ......
    Some code here
   ..............................
   ....................

*/

$compiler->addFunction('convert', function($resolvedArgs, $exprArgs){ 
                    return 'MyCustomUrlHelper::convert('.$resolvedArgs.')';
                });

在loader.php中,我已经注册了目录

 ........
..................... 
$loader->registerDirs(array(APP_PATH.'Modules/Library'))->register();
...................
........................

在我的 Modules/Library 目录中,我有这个 MyCustomUrlHelper.php

<?php
namespace Modules\Library;
use Phalcon\Tag;    

class MyCustomUrlHelper extends Tag
{

    public function convert($params)
    {
        if(!is_array($params))
        {
            $params = array($params);   
        }

        /*
            ..... some code here ...
            .................
            ..........  
        */

        return $converted;
    }

}
?>

我错过了什么吗?

【问题讨论】:

    标签: arrays string phalcon volt


    【解决方案1】:

    这是延长电压的正确方法:

    $compiler->addFunction('convert', function($resolvedArgs, $exprArgs){
        return 'MyCustomHelper::convert(' . $resolvedArgs . ')';  
    });
    

    允许自己引用文档:

    函数作为普通的 PHP 函数,需要一个有效的字符串名称 作为函数名。可以使用两种策略添加功能, 返回一个简单的字符串或使用匿名函数。总是 要求所选策略返回有效的 PHP 字符串 表达。

    以下链接中的更多信息:

    文档:https://docs.phalconphp.com/en/latest/reference/volt.html#id1

    类似问题:Sending variable from volt to custom function


    更新:添加示例代码和输出。

    伏特自定义函数:

    $compiler->addFunction('testArrays', function($resolvedArgs, $exprArgs) {
        return 'Helpers\VoltCms::testArrays(' . $resolvedArgs . ')';
    }); 
    

    帮助文件:

    public static function testArrays($param)
    {
        d($param);
    }
    

    使用和输出:

    {{ testArrays(['asd', 'asd1']) }}
    
    Array
    (
        [0] => asd
        [1] => asd1
    )
    

    【讨论】:

    • 是的,但你上面所说的只会接受字符串参数。我的 $parameters 是一个动态数组。在对自定义助手的一次请求中,它可能是 3 个值或 4 个值。我的问题是如何将 $parameters 设置为数组类型而不是字符串。
    • 只需测试一下,您就会发现它按预期工作。用测试示例更新我的答案。
    • 我刚刚尝试过,现在我得到了这个错误,致命错误:在缓存/volt/%apps%%invo%%views%%test%%list.volt 中找不到类'MyCustomUrlHelper'。 php 在第 56 行。我将在上面添加我的示例代码,以便更容易阅读
    • 好吧,我明白了为什么我得到了那个致命的错误。您应该将所有目录放在服务编译器注册中,就像在我的情况下它将返回 'Modules\Library\MyCustomUrlHelper.php::convert('.$resolvedArgs.')';在你的助手中,方法应该是 public static function convert($params) { define some code } 否则你会得到一个警告“严格标准:非静态方法模块不应该被静态调用”。我认为这是现在的解决方案。谢谢,@Nikolay!
    • d()print_r() 的漂亮打印包装器:)
    猜你喜欢
    • 2015-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-02
    • 2016-01-29
    相关资源
    最近更新 更多