Laravel Nova indexQuery Области применения повторно - PullRequest
0 голосов
/ 15 января 2020

У меня есть управление правами на основе политик для моего приложения, и я использую Nova в качестве бэкэнда для приложения.

Теперь все работает внутри nova, и я хотел бы настроить дополнительный API для своего приложения. внешние приложения.

Мне нужно переопределить indexQuery для большинства моих ресурсов, поскольку пользователи получают доступ только к ограниченной области, например, для ресурса Customer:

public static function indexQuery(NovaRequest $request, $query)
{
    $user = Auth::user();

    // Admins and office users can see all customers
    if($user->authorizeRoles(['admin', 'office'])) {
        return $query;
    }

    // A user can only see customers associated with a job they work on
    $query
        ->select('customers.*')
        ->join('jobs', 'jobs.customer_id', '=', 'customers.id')
        ->join('teams', 'jobs.team_id', '=','teams.id')
        ->join('team_user', 'teams.id', '=', 'team_user.team_id')
        ->where('team_user.user_id', '=', $user->id);

    return $query;
}

Теперь для API мне в основном нужны те же области, и мне интересно, где разместить этот код. Моей первой мыслью было добавить область в модель Customer, поэтому я бы добавил область с параметром:

/**
 * Limit the results to the customers the user is able to see
 * @param  \Illuminate\Database\Eloquent\Builder  $query
 * @param \App\User $user
 * @return \Illuminate\Database\Eloquent\Builder
 */
public function scopeVisibleToUser($query, $user) {
    if($user->authorizeRoles(['admin', 'office'])) {
        return $query;
    }

    // A user can only see customers associated with a job they work on
    $query
        ->select('customers.*')
        ->join('jobs', 'jobs.customer_id', '=', 'customers.id')
        ->join('teams', 'jobs.team_id', '=','teams.id')
        ->join('team_user', 'teams.id', '=', 'team_user.team_id')
        ->where('team_user.user_id', '=', $user->id);

    return $query;
}

Есть ли способ применить область в методе indexQuery без создания объект-пустышка?

use App\Customer as AppCustomer;

/**
 * Build an "index" query for the given resource.
 *
 * @param  \Laravel\Nova\Http\Requests\NovaRequest  $request
 * @param  \Illuminate\Database\Eloquent\Builder  $query
 * @return \Illuminate\Database\Eloquent\Builder
 */
public static function indexQuery(NovaRequest $request, $query)
{
    $user = Auth::user();
    return (new AppCustomer())->scopeVisibleToUser($query, $user);
}

1 Ответ

1 голос
/ 15 января 2020

Используя фасады в реальном времени , вы можете рассматривать любой класс в вашем приложении, как если бы это был фасад.

use Facades\App\Customer as AppCustomer;

/**
 * Build an "index" query for the given resource.
 *
 * @param  \Laravel\Nova\Http\Requests\NovaRequest  $request
 * @param  \Illuminate\Database\Eloquent\Builder  $query
 * @return \Illuminate\Database\Eloquent\Builder
 */
public static function indexQuery(NovaRequest $request, $query)
{
    $user = Auth::user();
    return AppCustomer::visibleToUser($query, $user);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...