我正在将我的项目从Laravel5.7迁移到Laravel 8。在我的控制器ProductController.php中,我再次调用另一个控制器: AjaxController.php。好吧,我知道这样做不太好,但我想留着它。问题是,该代码在Laravel5.7中运行良好。
$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代码:
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);
}
}发布于 2020-12-16 15:11:22
从设计的角度来看,为什么不提取一个特征中的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);
}
}然后在两个控制器中使用特性
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
}发布于 2021-01-20 19:16:52
改变
app()->call($controller . '@' . $method, [$id]);
至
app()->call($controller . '@' . $method, ['id' => $id]);
解决这个问题。
https://stackoverflow.com/questions/65325776
复制相似问题