Функция трейта Laravel не найдена

Я просмотрел все stackoverflow и google, и я не могу решить, что моя функция черты не найдена. Я пробовал 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, и я вызываю использование App \ Traits \ ControllerTrait в моем контроллере, а затем могу использовать ControllerTrait для получения функций из черты. Когда я пытаюсь использовать функцию в моем запросе, он говорит: Вызов неопределенной функции App \ Http \ Controllers \ selectPrepare ()

Что-то мне не хватает? Я новичок в функциях traits в laravel, но я думал, что следую всем примерам и соглашениям об именах. Может ли кто-нибудь увидеть, что я делаю не так.


person Alexander Beyer    schedule 30.07.2018    source источник
comment
Черта добавляет функциональности вашему классу. Вы должны использовать $this для доступа к методам класса.   -  person Devon    schedule 30.07.2018
comment
О, я не знал, что this все еще применяется к чертам, я использовал черту с областью видимости в функции, а это не требовалось. Может быть, потому что это от моей модели. Спасибо, что сработало!   -  person Alexander Beyer    schedule 30.07.2018


Ответы (1)


Вам нужно использовать $this при доступе к методам трейтов, как и для любого другого метода:

$users = User::when($request->has('select'), function ($query) use ($request) {
    $this->selectPrepare($query, $request->input('select'));
person Jonathon    schedule 30.07.2018
comment
Девон ответил раньше вас, но, поскольку это комментарий, я не мог принять его как ответ. Спасибо. - person Alexander Beyer; 30.07.2018