2016-10-28 254 views
0

我遵循一個關於在codecourse上創建購物車的系列 - 這正是我所尋找的。超薄支付控制器

在該系列支付發生在創建訂單 - 但現在我的客戶說,他們不希望支付創建訂單 - 第一次當他們已經處理訂單 - 他們想發送電子郵件與付款或一個鏈接到付款網站。

我認爲沒有什麼大不了的 - 只要將BraintreePayment par移出創建類 - 創建一個名爲payment的新類,那就是 - 但不是 - 所以現在我卡住了。

我正在使用swiftmailer發送鏈接的郵件,並且工作正常 - 但付款部分失敗。

我是新來的這個MVC /苗條的東西 - 所以請有人幫助我在正確的方向。

它拋出說的錯誤:

類型:類型錯誤消息:參數1傳遞給 車\活動\ OrderWasCreated :: __結構()必須是 車\型號\秩序的情況下,整定,在線160上調用 /Applications/AMPPS /www/testshop.dev/cart/app/Controllers/OrderController.php File: /Applications/AMPPS/www/testshop.dev/cart/app/Events/OrderWasCreated。 php Line:17

我用支付類ordercontroller - 看起來是這樣的:上線160

<?php 

namespace Cart\Controllers; 

use Slim\Router; 
use Slim\Views\Twig; 
use Cart\Basket\Basket; 
use Cart\Models\Order; 
use Cart\Models\Product; 
use Cart\Models\Address; 
use Cart\Models\Delivery; 
use Cart\Models\Customer; 
use Cart\Controllers\MailController; 
use Cart\Validation\Contracts\ValidatorInterface; 
use Cart\Validation\Forms\OrderForm; 
use Psr\Http\Message\ResponseInterface as Response; 
use Psr\Http\Message\ServerRequestInterface as Request; 
use Braintree_transaction; 

class OrderController 
{ 
    protected $basket; 

    protected $mailcontroller; 

    protected $router; 

    protected $validator; 

    public function __construct(Basket $basket, Mailcontroller $mailcontroller, Router $router, ValidatorInterface $validator) 
    { 
     $this->basket = $basket; 
     $this->mailcontroller = $mailcontroller; 
     $this->router = $router; 
     $this->validator = $validator; 

    } 

    public function index(Request $request, Response $response, Twig $view) 
    { 

     $this->basket->refresh(); 

     if (!$this->basket->subTotal()) { 
      return $response->withRedirect($this->router->pathFor('cart.index')); 
     } 

     return $view->render($response, 'order/index.twig'); 
    } 

    public function show($hash, Request $request, Response $response, twig $view, Order $order) 
    { 
     $order = $order->with('address', 'products')->where('hash', $hash)->first(); 

     $this->mailcontroller->mailLisbeth($hash); 

     if (!$order) { 
      return $response->withRedirect($this->router->pathFor('home')); 
     } 

     return $view->render($response, 'order/show.twig', [ 
      'order' => $order, 
     ]); 
    } 

    public function create(Request $request, Response $response, Customer $customer, Address $address, Delivery $delivery, Order $order) 
    { 
     $this->basket->refresh(); 

     $validation = $this->validator->validate($request, OrderForm::rules()); 

     if (!$this->basket->subTotal()) { 
      return $response->withRedirect($this->router->pathFor('cart.index')); 
     } 

     if ($validation->fails()) { 
      return $response->withRedirect($this->router->pathFor('order.index')); 
     } 

     $hash = bin2hex(random_bytes(32)); 

     $customer = $customer->firstOrCreate([ 
      'email' => $request->getParam('email'), 
      'name' => $request->getParam('name'), 
     ]); 

     $delivery = $delivery->firstOrCreate([ 
      'delivery'  => $request->getParam('delivery'), 
      'deliverydate' => $request->getParam('deliverydate'), 
      'deliverytime' => $request->getParam('deliverytime'), 
     ]); 

     $address = $address->firstOrCreate([ 
      'address1'  => $request->getParam('address1'), 
      'address2'  => $request->getParam('address2'), 
      'city'   => $request->getParam('city'), 
      'postal_code' => $request->getParam('postal_code'), 
     ]); 

     $order = $customer->orders()->create([ 
      'hash' => $hash, 
      'accepted' => "2", 
      'paid' => false, 
      'total' => $this->basket->subTotal() + 150, 
     ]); 

     $address->order()->save($order); 

     $delivery->order()->save($order); 

     $allItems = $this->basket->all(); 

     $order->products()->saveMany(
      $allItems, 
      $this->getQuantities($allItems) 
     ); 

     $event = new \Cart\Events\OrderWasCreated($order, $this->basket); 

     $event->attach([ 
      // new \Cart\Handlers\MarkOrderPaid, 
      // new \Cart\Handlers\RecordSuccessfulPayment($result->transaction->id), 
      new \Cart\Handlers\UpdateStock, 
      new \Cart\Handlers\Emptybasket, 
     ]); 

     $event->dispatch(); 

     return $view->render($response, 'order/show.twig', [ 
      'order' => $order, 
     ]); 

    } 

    // 
    public function payment($slug, Request $request, Response $response, twig $view, Customer $customer, Address $address, Delivery $delivery, Order $order) 
    { 
     $order = $order->with('address', 'products')->where('id', $slug)->first(); 

     // var_dump($order); 
     // die(); 

     // if (!$request->getParam('payment_method_nonce')) { 
     //  return $response->withRedirect($this->router->pathFor('order.index')); 
     // } 

     $order = $customer->orders()->update([ 
      'paid' => true, 
     ]); 

     $result = Braintree_Transaction::sale([ 
      'amount' => $this->basket->subTotal() + 150, 
      'paymentMethodNonce' => $request->getParam('payment_method_nonce'), 
      'options' => [ 
       'submitForSettlement' => true, 
      ] 
     ]); 


     $event = new \Cart\Events\OrderWasCreated($order, $this->basket); 

     if (!$result->success) { 
      $event->attach(new \Cart\Handlers\RecordFailedPayment); 
      $event->dispatch(); 

      return $response->withRedirect($this->router->pathFor('order.index')); 
     } 

     $event->attach([ 
      new \Cart\Handlers\MarkOrderPaid, 
      new \Cart\Handlers\RecordSuccessfulPayment($result->transaction->id), 
      // new \Cart\Handlers\UpdateStock, 
      // new \Cart\Handlers\Emptybasket, 
     ]); 
    } 

    protected function getQuantities($items) 
    { 
     $quantities = []; 

     foreach ($items as $item) { 
      $quantities[] = ['quantity' => $item->quantity]; 
     } 

     return $quantities; 
    } 
} 

回答

0

錯誤occures:

$event = new \Cart\Events\OrderWasCreated($order, $this->basket); 

因爲你調用Cart\Events\OrderWasCreated constructor,它要求Cart\Models\Order類作爲第一個參數的實例。相反,你的第一個參數($order)是整數。

現在的$order最新分配是在線147

$order = $customer->orders()->update([ 
    'paid' => true, 
]); 

我將有一個猜測,說這是返回整數結果的操作(是一個簡單的1/0成功/ fauilure或更新訂單的id)。你確定你需要嗎?問是因爲:

  • 你在網上138分配$order值:

    $爲了= $命令 - >與( '地址', '產品') - >在哪裏( '身份證',$蛞蝓) - >第一();

  • 而你通過$order作爲參數OrderController::payment

所以,我的猜測是:要刪除線138147