代码之家  ›  专栏  ›  技术社区  ›  Alexander Beyer

未找到拉弗特徵函数

  •  0
  • Alexander Beyer  · 技术社区  · 7 年前

    我在stackoverflow和google上到处寻找,似乎无法解决我的trait函数找不到的问题。我试过composer dump autoload,我的composer.json连接了应用程序目录,甚至检查了我的名称空间和特征名称。这是我的用户控制器。

    <?php
    
    namespace App\Http\Controllers;
    
    use App\User;
    use App\Traits\ControllerTrait;
    use App\Http\Requests\UpdateUser;
    use Illuminate\Http\Request;
    use App\Http\Requests\IndexUser;
    
    class UserController extends Controller
    {
        use ControllerTrait;
    
        /**
         * Create a new controller instance.
         *
         * @return void
         */
        public function __construct()
        {
            $this->middleware('auth');
        }
    
        /**
         * Show multiple users.
         *
         * @return \Illuminate\Http\Response
         */
        public function index(IndexUser $request)
        {
            $per_page = 50;
            $order_by = 'id';
            $sort_by = 'ASC';
    
            if($request->has('per_page')) {
                $per_page = $request->input('per_page');
            }
    
            if($request->has('order_by')) {
                $order_by = $request->input('order_by');
            }
    
            if($request->has('sort_by')) {
                $sort_by = $request->input('sort_by');
            }
    
            $users = User::when($request->has('select'), function ($query) use ($request) {
                selectPrepare($query, $request->input('select'));
            })->when($request->has('include'), function ($query) use ($request) {
                if(!empty($request->input('include'))) {
                    $includedTables = explode(',', $request->input('include'));
                    $tables = array_map('trim', $includedTables);
    
                    return $query->with($tables);
                }
    
                return $query;
            })->orderBy("{$order_by}", "{$sort_by}")
            ->paginate($per_page);
    
            return response()->json($users);
            }
        }
    }
    

    这是我的特点

        <?php
    
        namespace App\Traits;
    
        trait ControllerTrait
        {
            /**
             *  Function: scopeSelectPrepare
    
        public function selectPrepare($query, $select) {
            if(!empty($select)) {
                $selectedColumns = explode(',', $select);
                $columns = array_map('trim', $selectedColumns);
    
                return $query->select($columns);
            }
    
            return $query;
        }
    }
    

    如您所见,Trait的名称空间是App\Traits,并在我的控制器中调用use App\Traits\ControllerTrait,然后可以使用ControllerTrait从Trait获取函数。当我试图获取要在查询中使用的函数时,它会说:调用未定义的函数App\Http\Controllers\selectPrepare()

    我有什么遗漏吗?我对laravel的traits功能还不熟悉,但我认为我遵循了所有的示例和命名约定。有人知道我做错了什么吗。

    1 回复  |  直到 7 年前
        1
  •  3
  •   Jonathon    7 年前

    你需要使用 $this 访问trait方法时,就像访问任何其他方法一样:

    $users = User::when($request->has('select'), function ($query) use ($request) {
        $this->selectPrepare($query, $request->input('select'));