扩展Laravel中的供应商类

时间:2017-06-15 08:11:13

标签: php laravel laravel-5 cart

我正在使用购物车系统(\ Gloudemans \ Shoppingcart),但我想覆盖默认的total()方法:

namespace Gloudemans\Shoppingcart;
/**
     * Get the total price of the items in the cart.
     *
     * @param int    $decimals
     * @param string $decimalPoint
     * @param string $thousandSeperator
     * @return string
     */
    public function total($decimals = null, $decimalPoint = null, $thousandSeperator = null)
    {
        $content = $this->getContent();

        $total = $content->reduce(function ($total, CartItem $cartItem) {
            return $total + ($cartItem->qty * $cartItem->priceTax);
        }, 0);

        return $this->numberFormat($total, $decimals, $decimalPoint, $thousandSeperator);
    }

我的扩展名:

namespace App\Http\Controllers;

use Gloudemans\Shoppingcart\Facades\Cart;
use \Illuminate\Http\Request;

class CartController extends Cart
{
    function __construct() {

    }

    public function total($decimals = null, $decimalPoint = null, $thousandSeperator = null) {
        $content = $this->getContent();

        $total = $content->reduce(function ($total, CartItem $cartItem) {
            return $total + ($cartItem->qty * $cartItem->priceTax);
        }, 0);
        $currency = new Currency();
        $currency_id = $currency->where('code', session()->get('currency'))->first()->id;
        $rate = CurrencyRate::where('currency_id', $currency_id)->latest()->first()->rate;

        return $this->numberFormat($total*$rate, $decimals, $decimalPoint, $thousandSeperator);
    }
}

但是我不知道如何访问它,这就是我访问默认方法的方法:

...
<span id="cart_total" class="btn btn-default"><i class="fa fa-shopping-cart" aria-hidden="true"></i>
                               {{$symbol}} {{\Gloudemans\Shoppingcart\Facades\Cart::total()}}</span>
...

上面的正面是:

namespace Gloudemans\Shoppingcart\Facades;

use Illuminate\Support\Facades\Facade;

class Cart extends Facade {
    /**
     * Get the registered name of the component.
     *
     * @return string
     */
    protected static function getFacadeAccessor()
    {
        return 'cart';
    }
}

显然以下不起作用:

{{\App\Http\Controllers\CartController::total()}}

以下是我正在使用的购物车系统的链接:

https://github.com/Crinsane/LaravelShoppingcart

2 个答案:

答案 0 :(得分:0)

您必须拥有一个覆盖默认功能的专用类。

class myCart extends Cart {

    public function total($decimals = null ....

}

现在,如果您可以创建myCart的新实例并使用它来计算总数

var obj = new myCart();
obj->total();

如果需要,您可以为myCart类创建fascade并使用它。

答案 1 :(得分:0)

在立面中执行以下操作:

Facade::something();

的快捷方式
app()->make(Facade::getFacadeAccessor())->something();

因此,您需要通过制作&#34; cart&#34;来扩展返回的课程。并覆盖那里的total方法。

E.g。假设:

class Cart { 
     //...
     public function total() {}
}

class MyCart extends Cart {
     //...
     //Your total:
     public function total() {}
}

注意:此处的第一个购物车不是外观,而是外观返回的实际类。

然后你需要重新绑定它。要做到这一点,你需要确保你有一个服务提供商,它在第一次绑定后运行,然后:

 public function handle() {
        $this->app->bind("cart", function ($app) { return new MyCart(); });
 }

不应该超越立面。