как использовать метод apiReources с `only`? - PullRequest
4 голосов
/ 30 мая 2020

Я создаю api с Laravel, и я ищу простой и ленивый способ регистрации ресурсов Api. В настоящее время я определяю свои маршруты следующим образом:

Route::apiResoruce('categories', 'CategoryController')->only(['index', 'show']);

Я проверил документацию контроллера Laravel и увидел метод apiResources, с помощью которого я могу создать несколько ресурсов api одновременно .

цель: иметь возможность использовать apiResources с only таким методом

Route::apiResources(['categories' => 'CategoryController', 'products' => 'ProductController'])->only(['index', 'show']);

текущий результат:

Call to a member function only() on null

1 Ответ

5 голосов
/ 30 мая 2020

короче (если вы не хотите читать всю историю), вы можете просто сделать это так:

Route::apiResources(['brands' => 'BrandController', 'categories' => 'CategoryController'], ['only' => ['index', 'show']]);

Когда я писал вопрос, мне пришло в голову проверить apiResources, и я нашел это:

   /**
     * Register an array of API resource controllers.
     *
     * @param  array  $resources
     * @param  array  $options
     * @return void
     */
    public function apiResources(array $resources, array $options = [])
    {
        foreach ($resources as $name => $controller) {
            $this->apiResource($name, $controller, $options);
        }
    }

, и поскольку он использует apiResource под капотом и передает параметр параметров, я могу проверить, что это за параметры

/**
 * Route an API resource to a controller.
 *
 * @param  string  $name
 * @param  string  $controller
 * @param  array  $options
 * @return \Illuminate\Routing\PendingResourceRegistration
 */
public function apiResource($name, $controller, array $options = [])
{
    $only = ['index', 'show', 'store', 'update', 'destroy'];

    if (isset($options['except'])) {
        $only = array_diff($only, (array) $options['except']);
    }

    return $this->resource($name, $controller, array_merge([
        'only' => $only,
    ], $options));
}
...