1

Silex でこのコードに問題があります。私は小さなウェブカートをプログラミングしていますが、Silex でセッション オブジェクトがどのように機能するかわかりません。これは私のコードであり、常に次のように終了します。

致命的なエラー: 関数名は文字列セッションでなければなりません

この行で:

$amount = $app['calculate_amount']($app['session']->get('cart'));
$items = $app['calculate_items']($app['session']->get('cart'));

何か案は?

ありがとう!

乾杯!

$app['calculate_amount'] = function ($cart) use ($app) {
$amount = 0.00;
$sql = "SELECT * FROM products WHERE id = ?";
if(is_array($cart))
{
    foreach($cart as $id => $qty)
    {
        $product = $app['db']->fetchAssoc($sql, array($id));
        $amount += $product["price"]*$qty;

    }
}

    return $amount;
};



$app['calculate_items'] = function ($cart) {
$items = 0;
if(is_array($cart))
{
    foreach($cart as $id => $qty)
    {
        $items += $qty;
    }
}

return $items;
};

$app->before(function (Request $request) use ($app) {
if ($request->get('save') != NULL)
{

    foreach ($app['session']->get('cart') as $id_isbn => $qty)
    {
        if ($request->get('$id_isbn')=='0')
        {
            $app['session']->set('cart', array('$id_isbn' => NULL));
        }
        else
        {
            $app['session']->set('cart', array('$id_isbn' => $request->get('$id_isbn')));
        }
    }

    $amount = $app['calculate_amount']($app['session']->get('cart'));
    $items = $app['calculate_items']($app['session']->get('cart'));

    $app['session']->set('amount', $amount);
    $app['session']->set('items', $items);

    }
});
4

1 に答える 1

1

silex の背後にある DIC である Pimple のドキュメントからの引用:

Pimple は匿名関数をサービス定義と見なすため、匿名関数を protect() メソッドでラップしてパラメーターとして保存する必要があります。

$container['random'] = $container->protect(function () { return rand(); });

直リンク

つまり、pimple は匿名関数をサービス定義として認識し、最初にアクセスしたときにそれらを実行しました。protect()後で取得するために関数自体を保存する場合は、それらが必要になります。

于 2013-02-01T20:56:35.227 に答える