【发布时间】:2017-05-28 09:23:49
【问题描述】:
我在控制器中创建的函数是这样的:
public function create()
{
// This is dummpy data to testing checkout order event
$data = array(
'number' => '2',
'user' => 'chelsea',
'store' => 'chelsea shop',
'total_amount' => 11000000,
'total_product' => 2,
'status' => '92000000',
'delivery_address' => 'london',
'email' => 'chelsea@gmail.com'
);
$data = Order::where('number', $data['number'])->first();
\Event::fire(new CheckoutOrderEvent($data));
}
我的 CheckoutOrderListener 是这样的:
<?php
namespace App\Listeners;
use App\Events\CheckoutOrderEvent;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
class CheckoutOrderListener
{
public function __construct()
{
//
}
public function handle(CheckoutOrderEvent $event)
{
$event->data->notify(New \App\Notifications\CheckoutOrder());
}
}
我在模型顺序中添加了使用Illuminate\Notifications\Notifiable;
但是,执行时,存在错误:Call to undefined method Illuminate\Database\Query\Builder::notify()
有人可以帮助我吗?
更新
完整的错误是这样的:
BadMethodCallException in Builder.php line 2440: Call to undefined method Illuminate\Database\Query\Builder::notify()
in Builder.php line 2440
at Builder->__call('notify', array(object(CheckoutOrder)))
at call_user_func_array(array(object(Builder), 'notify'), array(object(CheckoutOrder))) in Builder.php line 1438
at Builder->__call('notify', array(object(CheckoutOrder)))
at call_user_func_array(array(object(Builder), 'notify'), array(object(CheckoutOrder))) in compiled.php line 11602
at Model->__call('notify', array(object(CheckoutOrder))) in CheckoutOrderListener.php line 33
at CheckoutOrderListener->handle(object(CheckoutOrderEvent))
at call_user_func_array(array(object(CheckoutOrderListener), 'handle'), array(object(CheckoutOrderEvent))) in compiled.php line 10127
at Dispatcher->Illuminate\Events\{closure}(object(CheckoutOrderEvent))
at call_user_func_array(object(Closure), array(object(CheckoutOrderEvent))) in compiled.php line 10067
at Dispatcher->fire('App\Events\CheckoutOrderEvent') in compiled.php line 6290
at Facade::__callStatic('fire', array(object(CheckoutOrderEvent))) in OrderController.php line 68
at OrderController->create()
at call_user_func_array(array(object(OrderController), 'create'), array()) in compiled.php line 9385
at Controller->callAction('create', array()) in compiled.php line 9412
at ControllerDispatcher->dispatch(object(Route), object(OrderController), 'create') in compiled.php line 8470
at Route->runController() in compiled.php line 8451
at Route->run(object(Request)) in compiled.php line 8147
at Router->Illuminate\Routing\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in compiled.php line 9978
at SubstituteBindings->handle(object(Request), object(Closure)) in compiled.php line 9870
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 33
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in compiled.php line 3151
at VerifyCsrfToken->handle(object(Request), object(Closure)) in compiled.php line 9870
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 33
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in compiled.php line 13467
at ShareErrorsFromSession->handle(object(Request), object(Closure)) in compiled.php line 9870
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 33
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in compiled.php line 11907
at StartSession->handle(object(Request), object(Closure)) in compiled.php line 9870
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 33
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in compiled.php line 13213
at AddQueuedCookiesToResponse->handle(object(Request), object(Closure)) in compiled.php line 9870
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 33
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in compiled.php line 13150
at EncryptCookies->handle(object(Request), object(Closure)) in compiled.php line 9870
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 33
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in compiled.php line 9855
at Pipeline->then(object(Closure)) in compiled.php line 8148
at Router->runRouteWithinStack(object(Route), object(Request)) in compiled.php line 8139
at Router->dispatchToRoute(object(Request)) in compiled.php line 8130
at Router->dispatch(object(Request)) in compiled.php line 2472
at Kernel->Illuminate\Foundation\Http\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in compiled.php line 3213
at CheckForMaintenanceMode->handle(object(Request), object(Closure)) in compiled.php line 9870
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 33
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in compiled.php line 9855
at Pipeline->then(object(Closure)) in compiled.php line 2416
at Kernel->sendRequestThroughRouter(object(Request)) in compiled.php line 2400
at Kernel->handle(object(Request)) in index.php line 53
我的 CheckoutOrderEvent 是这样的:
<?php
namespace App\Events;
use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
class CheckoutOrderEvent
{
use InteractsWithSockets, SerializesModels;
public $data;
public function __construct($data)
{
$this->data = $data;
}
public function broadcastOn()
{
return new PrivateChannel('channel-name');
}
}
我的 CheckoutOrder 是这样的:
<?php
namespace App\Notifications;
use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
class CheckoutOrder extends Notification
{
use Queueable;
public function __construct()
{
//
}
public function via($notifiable)
{
return ['mail'];
}
public function toMail($notifiable)
{
return (new MailMessage)
->line('The introduction to the notification.')
->action('Notification Action', 'https://laravel.com')
->line('Thank you for using our application!');
}
public function toArray($notifiable)
{
return [
//
];
}
}
我的模型顺序是这样的:
use Eloquent as Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Notifications\Notifiable;
class Order extends Model
{
use SoftDeletes;
..........
【问题讨论】:
-
你能把整个错误堆栈贴给我们吗?这里的证据并不能真正告诉我们问题出在哪里。似乎事件的
$data属性仍然是一个查询构建器 - 在您的store中,您确实调用了->first()来获取模型。 -
@Lionel Chan,我更新了我的问题
-
展示你的
App\Event\CheckoutOrderEvent类怎么样 -
@Lionel Chan,我更新了我的问题
-
奇怪的是您显示的代码和错误不相符。代码清楚地表明您将
Order模型传递给事件,但在您的错误堆栈中,它表示它试图在名为CheckoutOrder的对象(可能是模型)上调用notify。我错过了什么吗?
标签: php laravel sendmail laravel-5.3