Organise method flow
It's good to have single method to control flow as you have in B, but this method should be mostly calling other methods of your class (you also call there checkQuantity for example, which is also in A). That way add is still very flexible - you can override those methods (probably protected methods, not public), that it calls or as last resort override that method itself.

If you think B is more readable, imagine, there would be something like this-&gt;addToCart instead of this bit (and that extracted to separate method):

   $product_id = $this-&gt;request-&gt;post-&gt;product_id;
    $cart = $this-&gt;getCart();
    $product = $shop-&gt;getProduct($product_id);

    $cart-&gt;items-&gt;add($product);
    $added = $cart-&gt;save();


I'd google for "single responsibility principle".