【问题标题】:Updating Laravel 5.6 to Laravel 8 app()->call将 Laravel 5.6 更新到 Laravel 8 app()->call
【发布时间】:2023-04-04 18:40:01
【问题描述】:

我正在将我的项目从 Laravel 5.7 迁移到 Laravel 8。在我的名为 ProductController.php 的控制器中,我再次调用另一个控制器:AjaxController.php。好的,我知道这样做不是一个好习惯,但我想保留它。问题是代码在 Laravel 5.7 中运行良好。

$p = array('article_id' => $id_param);

$quantity_discounts = app()
    ->call('App\Http\Controllers\AjaxController@getQuantityDiscounts', 
    [$p])->getData();

在 Laravel 8 中,我收到以下错误。

Illuminate\Contracts\Container\BindingResolutionException 无法 解决类中的依赖项 [Parameter #0 [ $params ]] 应用\Http\Controllers\AjaxController

为什么会这样?我把我的 AjaxController.php 的代码留在这里:

class AjaxController extends Controller
{
    private $accesible_methods = array(
        'getQuantityDiscounts',
    );

    public function get(Request $request, $action)
    {
        if (is_callable(array($this, $action)) && in_array($action, $this->accesible_methods))
            return $this->{$action}($request->all());
    }

    public function post(Request $request, $action)
    {
        if (is_callable(array($this, $action)) && in_array($action, $this->accesible_methods))
            return $this->{$action}($request->all());
    }

    public function getQuantityDiscounts($params)
    {
        try {
            $article = FotiArticle::get($params['article_id'], array(
                'fields' => 'article_id,prices,price_pvp,quantity',
                'expand' => 'prices',
                'round_decimals' => $params['round_decimals'] ?? true
            ));

            foreach ($article->prices as &$scaled_price) {
                $discount_data = Helpers::getDiscountPriceIfApplies($article->article_id, $article->price_pvp, $scaled_price->price_pvp);
                $scaled_price->price_pvp = $scaled_price->price_pvp;
                $scaled_price->price_pvp_with_discount = $discount_data->price_with_discount ?? $scaled_price->price_pvp;
            }

            $result = $article->prices;
        } catch (FotiApiException $e) {
            $result = [
                'error' => array(
                    'description' => $e->getMessage() . '. Line:' . $e->getLine()
                )
            ];
        } catch (Exception $e) {
            $result = [
                'error' => array(
                    'description' => $e->getMessage() . '. Line:' . $e->getLine()
                )
            ];
        }

        return response()->json($result);
    }
}

【问题讨论】:

  • 我可以建议您阅读来自laravel.com/docs/5.8/upgrade 的升级指南并逐步完成版本。这是 imo 的最佳方式。
  • 那条评论很笼统。我只是创建了一个新的 Laravel 8 项目,并将文件从旧项目移动到新项目。我在文档中没有得到对此的回应。
  • 您是否尝试将该数组作为关联数组传递,以便它知道您要传递的参数是什么? ['params' => $p]

标签: php laravel laravel-8


【解决方案1】:

从设计的角度来看,为什么不将getQuantityDiscounts 提取到一个特征中,然后在两个控制器中使用该特征。

这样,由于框架方法/签名的变化,它还可以减少代码的依赖/脆弱性。

namespace App\Http\Controllers;


use FotiApi,FuLoc, FotiArticle, FotiCart, Input;
use App\Helpers;


trait CalulatesQuantityDiscount
{
      

    public function getQuantityDiscounts($params)
    {
        
        try
        {
            $article = FotiArticle::get($params['article_id'],array(
                'fields'     =>  'article_id,prices,price_pvp,quantity',
                'expand'     => 'prices',
                'round_decimals' => $params['round_decimals'] ?? true
          ));
        
            foreach($article->prices as &$scaled_price) 
            {
                $discount_data = Helpers::getDiscountPriceIfApplies($article->article_id, $article->price_pvp, $scaled_price->price_pvp);
                $scaled_price->price_pvp = $scaled_price->price_pvp;
                $scaled_price->price_pvp_with_discount  = $discount_data->price_with_discount ?? $scaled_price->price_pvp;
            }

            $result = $article->prices;

        }
        catch(FotiApiException $e)
        {

            $result = [
                'error' => array(
                    'description' => $e->getMessage().'. Line:'.$e->getLine()
                )
            ];
        }
        catch(Exception $e)
        {
            $result = [
                'error' => array(
                    'description' => $e->getMessage().'. Line:'.$e->getLine()
                )
            ];
        }       

        return response()->json($result);
    }
}

然后在两个控制器中使用 trait


namespace App\Http\Controllers;
use Illuminate\Http\Request;
use FotiApi,FuLoc, FotiArticle, FotiCart, Input;
use Exception, LogicException, Foticos\FotiApiClient\FotiApiException;
use Illuminate\Support\Facades\Auth;
use App\Helpers;

class AjaxController extends Controller
{
    use CalculatesQuantityDiscount;

    /* Inicio */

    private $accesible_methods = array(                         
        
        'getQuantityDiscounts',
    );

    public function get(Request $request, $action)
    {       
        if (is_callable(array($this,$action)) && in_array($action,$this->accesible_methods))
            return $this->{$action}($request->all());
    }

    public function post(Request $request, $action)
    {       
        if (is_callable(array($this,$action)) && in_array($action,$this->accesible_methods))
            return $this->{$action}($request->all());
    }
}
class OtherController extends Controller
{
    use CalculatesQuantityDiscount;

    // controller code
}

【讨论】:

    【解决方案2】:

    变化
    app()->call($controller . '@' . $method, [$id]);

    app()->call($controller . '@' . $method, ['id' => $id]);
    解决问题。

    【讨论】:

      猜你喜欢
      • 2022-08-11
      • 2021-10-09
      • 2018-11-23
      • 1970-01-01
      • 2021-08-03
      • 2021-01-17
      • 2019-02-06
      • 2019-02-01
      • 1970-01-01
      相关资源
      最近更新 更多