2016-10-28 6 views
0

私はコーデックコースで買い物カゴを作成する際にセリフをたどりました。それは私が探していたものでした。スリム・ペイメント・コントローラー

シリーズでは、注文の作成時にお支払いが行われますが、注文を処理したときに支払いをしたくないとクライアントから指示された場合は、まず支払いを行ったメールか支払いサイトへのリンク。

私は大したことではないと思っていました。私はBraintreePayment parを作成クラスから外しました。支払いと呼ばれる新しいクラスを作成しましたが、そうではありません。

私はswiftmailerを使用してリンクを添付したメールを送信していますが、支払いは正常に行われますが、支払いが失敗します。

私はこのMVC/Slimのことを初めて勉強しました。だから誰かが正しい方向に私を助けてくれるの?

それは言うスローエラー:

タイプ:TypeError例外メッセージ:引数1渡された へカート\イベント\ OrderWasCreated :: __構築物は()注文\ カート\モデルのインスタンスでなければなりませんが、整数が与えられました、 /Applications/AMPPS/www/testshop.dev/cart/app/Controllers/OrderController.phpで呼び出されます on line 160ファイル: /Applications/AMP/www/testshop.dev/cart/app/Events/OrderWasCreated。 PHP 行:17

あなたが最初の引数として Cart\Models\Orderクラスのインスタンスが必要です Cart\Events\OrderWasCreatedコンストラクタを呼び出すため

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

: -は

支払いクラスと私のordercontroller次のようになります。

<?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

エラーがライン160にoccures。代わりに、最初の引数($order)は整数です。

$orderの最新の割り当てが行147である:

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

私は推測があるでしょうし、これは結果として整数を返す操作であることを言う(シンプル1/0成功/ fauilureということまたは更新中の注文のid)。あなたはそれが本当に必要なのですか?あなたがライン138$order値を代入している

  • :( 'アドレス'、 '製品')で

    $順= $ order-> - >ここで、( 'ID'、$ので頼みますスラッグ) - >ファースト();

  • OrderController::paymentには、引数として$orderが渡されています。

だから、私の推測では、次のとおりです。あなたがライン138147を削除したいです。

関連する問題