Laravel:如何在控制器中的两个不同请求之间保存数据?

问题描述 投票:0回答:1

我有一个 Laravel 控制器,有两种方法:createOrdergetStatus。在 create 方法中,我尝试设置属性

$orderId
来存储 orderId 值,在 get 方法中,我想使用
dd($this->orderId)
访问并显示该值。

class XXXPaymentController extends Controller
{
    protected $orderId;
    
    public function createOrder(){
         // ... create an $order
         $this->orderId = $order->id;
    }
    
    public function getStatus(){
          dd($this->orderId); // return null
    }
}

但是,由于 Laravel 为每个请求创建一个新的控制器实例,因此 getStatus 方法返回 null,因为它是一个不同的实例。

这具体是一个付款请求,我需要在这两种方法之间保留

$orderId
。我怎样才能在 Laravel 中实现这一目标?对于不同的请求,是否有推荐的方法在控制器中的方法之间共享数据?

php laravel controller state-management
1个回答
0
投票

除了会话和缓存之外,您还可以使用服务类,将其注入到控制器的构造函数中,并保留 order_id。

创建一个像这样的界面,

interface OrderIdServiceInterface
{
    public function storeOrderId(int $orderId);
    public function getOrderId();
}

然后创建一个服务来实现该服务,如下所示,

class OrderIdService implements OrderIdServiceInterface
{
    private $orderId;

    public function storeOrderId(int $orderId)
    {
        $this->orderId = $orderId;
    }

    public function getOrderId(): int
    {
        return $this->orderId;
    }
}

然后在构造函数中将此服务类注入到控制器中。

class XXXPaymentController extends Controller
{
    private $orderIdService;

    public function __construct(OrderIdServiceInterface $orderIdService)
    {
        $this->orderIdService = $orderIdService;
    }
    
    public function createOrder(){
         // ... create an $order
         $this->orderIdService->storeOrderId($order->id);
    }
    
    public function getStatus(){
       dd($this->orderIdService->getOrderId());
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.