做spa應(yīng)用的時候,首屏通常需要加載大量數(shù)據(jù)朵逝,這個時候如果可以將多個api請求合并為一個可以提高服務(wù)效率蔚袍。有時候也有需求在一個控制器中調(diào)用其他控制器方法。
laravel中的Controller及其action都是由框架自動調(diào)用配名,并注入依賴的啤咽,如果手動new的話會比較麻煩,于是我寫了一個Trait
段誊,在控制器中引入就可以很方便實(shí)現(xiàn)調(diào)用其他控制器了闰蚕。
<?php
namespace App\Tools;
use Illuminate\Routing\RouteDependencyResolverTrait as DepResolver;
trait CallActionTrait {
private function callControllerMethod($action = '', $routeParameters = []){
return with(new Resolver)->callControllerMethod($action, $routeParameters);
}
}
class Resolver {
use DepResolver;
private $container;
public function __construct(){
$this->container = app();
}
public function callControllerMethod($action = '', $routeParameters = []){
list($class, $method) = explode('@', $action);
$instance = $this->container->make($class);
$parameters = $this->resolveClassMethodDependencies($routeParameters, $instance, $method);
return $instance->callAction($method, $parameters);
}
}
在控制器中像這樣使用它
use \App\Tools\CallActionTrait;
public function test(){
return $this->callControllerMethod(
'App\Http\Controllers\PostController@getRelatives',
[
'count'=>10
]);
}
注意: 這樣跳過了路由級權(quán)限驗(yàn)證,請注意鑒權(quán)