Проблема круговой зависимости в системе электронной коммерции PHP - PullRequest
1 голос
/ 09 декабря 2011

Я только начинаю с внедрения зависимостей, и сразу же столкнулся с проблемой: у меня есть два класса, которые зависят друг от друга.

Классы - Корзина и Доставка.В моем классе Basket у меня есть следующие соответствующие методы:

public function totalShipping()
{
    return $this->_shipping->rate();
}

public function grandTotal()
{
    return $this->totalProductsPrice() + $this->totalShipping();
}

public function totalWeight()
{
    $weight = 0;
    $products = $this->listProducts();
    foreach ($products as $product) {
        $weight += $product['product_weight'];
    }

    return ($weight == '') ? 0 : $weight;
}

$this->_shipping является экземпляром класса Shipping

В моем классе Shipping у меня есть следующие соответствующие методы:

public function rate()
{   
    if (isset($_SESSION['shipping']['method_id'])) {
        $methodId = $_SESSION['shipping']['method_id'];
        return $this->_rates[$methodId]['Shipping Price'];
    }

    // Method not set
    return NULL;
}

// Available Methods depend on country and the total weight of products added to the customer's basket. E.g. USA and over 10kg
public function listAvailableMethods()
{   
    $rates = array();

    if (isset($_SESSION['customer']['shipping_address']['country_code'])) {
        foreach ($this->_rates as $method_id => $rate) {
            if (($_SESSION['customer']['shipping_address']['country_code'] == $rate['Country']) && ($this->_basket->totalWeight() > $rate['Weight From']) && ($this->_basket->totalWeight() < $rate['Weight To'])) {
                $rates[$method_id] = $rate;
            }
        }
    }

    return $rates;
}

$this->_basket является экземпляром класса Basket.

Я совершенно не понимаю, как разрешить эту циклическую зависимость.Заранее благодарю за помощь.

Обновление

В моем классе доставки у меня также есть этот метод:

public function setMethod($method_id)
{
    // A check to make sure that the method_id is one of the provided methods
    if ( !array_key_exists($method_id, $this->listAvailableMethods()) ) return false;

    $_SESSION['shipping'] = array(
        'method_id' => $method_id
    );
}

1 Ответ

0 голосов
/ 09 декабря 2011

Я переименовал Shipping в Shipping_Methods и создал новый класс с именем Customer_Shipping_Methods. По сути, Customer_Shipping_Methods может быть частью класса Basket, но я бы предпочел оставить его отдельно.

@ RyanLaBarre был совершенно прав. По сути, я смешивал методы, которые должны были быть в классе Basket, с методами в моем классе Shipping_Methods. Shipping_Methods должен содержать только общие методы отправки данных, которые не были характерны для текущего сеанса.

Мне показалось, что Shipping_Methods получает свои данные из файла CSV, а не из таблицы базы данных. Как только я начал видеть Shipping_Methods как еще одну таблицу, все это щелкнуло у меня в голове.

@ rdlowrey, это очень хороший совет. Я немедленно помещу свои глобальные сессионные значения в мои контроллеры!

...