首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Laravel 5.6更新为Laravel 8 app()->call

将Laravel 5.6更新为Laravel 8 app()->call
EN

Stack Overflow用户
提问于 2020-12-16 14:58:49
回答 2查看 557关注 0票数 1

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

代码语言:javascript
复制
$p = array('article_id' => $id_param);

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

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

Illuminate\Contracts\Container\BindingResolutionException

无法解决类App\Http\Controller\AjaxController中的依赖关系[参数#0 $params ]

这一切为什么要发生?下面是我的AjaxController.php代码:

代码语言:javascript
复制
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);
    }
}
EN

回答 2

Stack Overflow用户

发布于 2020-12-16 15:11:22

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

这样,由于框架方法/签名的更改,代码不那么依赖/易碎。

代码语言:javascript
复制
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);
    }
}

然后在两个控制器中使用特性

代码语言:javascript
复制
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());
    }
}
代码语言:javascript
复制
class OtherController extends Controller
{
    use CalculatesQuantityDiscount;

    // controller code
}
票数 0
EN

Stack Overflow用户

发布于 2021-01-20 19:16:52

改变

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

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

解决这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65325776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档