【问题标题】:Laravel API multiple levelLaravel API 多级
【发布时间】:2018-03-03 07:51:14
【问题描述】:

我遵循了这个教程:toptal

我想为以下类型的音箱应用创建一个 API:

/ api / v1 / Apps -> list of apps
/ api / v1 / Apps / 1 /category -> list of category of app 1
/ api / v1 / Apps / 1/category/1/sounds -> list of components of category 1 of app 1

你有教程吗? 或者如何调整我的路线文件?我有 3 个控制器吗?

------------- 编辑 ------------

我创建了模型和控制器:

class App extends Model{
    protected $fillable = ['title'];
}

class Category extends Model{
    protected $fillable = ['name'];
}

控制器:

<?php
namespace App\Http\Controllers;
use App\App;
use Illuminate\Http\Request;

class AppController extends Controller{

public function index(){
    return App::all();
}

public function show($id){
    return App::find($id);
}
}

<?php
namespace App\Http\Controllers;
use App\Category;
use App\App;
use Illuminate\Http\Request;

class CategoryController extends Controller{

public function index(App $app){
    return App::find($app);
}

public function show(App $app, Category $category){
    //
}
}

我创建了迁移文件:

<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateAppsTable extends Migration{
    public function up(){
        Schema::create('apps', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title');
            $table->timestamps();
        });
    }
}

<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateCategoriesTable extends Migration{
public function up(){
    Schema::create('categories', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->integer('app_id')->unsigned();
        $table->timestamps();
    });

    Schema::table('categories', function($table) {
        $table->foreign('app_id')->references('id')->on('apps');
    });
}
}

还有我的 routes/api.php 文件:

Route::group(['prefix' => 'v1'], function() {
Route::resource('App', 'AppController', ['only' => ['index', 'show']]);
Route::resource('app.category', 'CategoryController', ['only' =>['index', 'show']]);
});

所以我调用了网址:/api/v1/App

结果:[{"id":1,"title":"Movies","created_at":null,"updated_at":null},{"id":2,"title":"football"," created_at":null,"updated_at":null}]

但是当我调用 url:/api/v1/App/2/category 时我不明白这是如何工作的

在 CategoryController 中。

【问题讨论】:

  • 也许使用以下路线结构会更直观:/api/v1/categories -> 类别列表,/api/v1/categories/1/products - 类别 1 的产品列表,/api/v1/categories/1/products/1/components -> 列表第 1 类产品 1 的组件。

标签: php laravel rest api


【解决方案1】:

您可以为此使用 laravel 的嵌套资源路由,是的,我将为每个实体类型配备一个资源丰富的控制器。在生成控制器时指定--parent 标志,以便将相应的模型注入到您的控制器方法中。

php artisan make:controller --resource --model Category CategoryController
php artisan make:controller --resource --parent Category --model App AppController

编辑:如果您没有设置身份验证,那么您可能只想公开您的 indexshow 方法。

演示库:https://github.com/MyTeamName/appstore4233593

路线

Route::group(['prefix' => 'v1'], function() {
    Route::resource('categories', 'CategoryController', ['only' => ['index', 'show']]);
    Route::resource('categories.apps', 'AppController', ['only' => ['index', 'show']]);
});
+----------+-----------------------------------------+-----------------------+-----------------------------------------------+------------+
| Method   | URI                                     | Name                  | Action                                        | Middleware |
+----------+-----------------------------------------+-----------------------+-----------------------------------------------+------------+
| GET|HEAD | api/v1/categories                       | categories.index      | App\Http\Controllers\CategoryController@index | api        |
| GET|HEAD | api/v1/categories/{category}            | categories.show       | App\Http\Controllers\CategoryController@show  | api        |
| GET|HEAD | api/v1/categories/{category}/apps       | categories.apps.index | App\Http\Controllers\AppController@index      | api        |
| GET|HEAD | api/v1/categories/{category}/apps/{app} | categories.apps.show  | App\Http\Controllers\AppController@show       | api        |
+----------+-----------------------------------------+-----------------------+-----------------------------------------------+------------+

型号

class Category extends Model
{
    protected $fillable = [
        'name',
    ];

    public function apps()
    {
        return $this->hasMany(App::class);
    }
}

class App extends Model
{
    protected $fillable = [
        'title',
    ];

    public function category()
    {
        return $this->belongsTo(Category::class);
    }
}

迁移

Schema::create('categories', function (Blueprint $table) {
    $table->increments('id');
    $table->timestamps();
    $table->string('name')->unique();
});

Schema::create('apps', function (Blueprint $table) {
    $table->increments('id');
    $table->timestamps();
    $table->string('title');

    $table->integer('category_id')->unsigned();
    $table->foreign('category_id')
        ->references('id')
        ->on('categories');
});

控制器

class CategoryController extends Controller
{
    public function index()
    {
        return Category::all();
    }
    public function show(Category $category)
    {
        return $category;
    }
}

class AppController extends Controller
{
    public function index(Category $category)
    {
        return $category->apps()->get();
    }
    public function show(Category $category, App $app)
    {
        return $app;
    }
}

【讨论】:

  • 如果我不想设置身份验证,是否需要使用'middleware' => 'auth: api'?
  • @kingramizy 如果您没有设置身份验证,那么您可能只想公开您的索引和显示方法。
  • @kingramizy 我已经更新了我的答案,为您提供了一个完整的演示库。
  • 感谢您的帮助,我只是将我的代码放在 git 上:github.com/kingramizy/soundAPI 实际上它的应用程序是类别的父级。它不适用于:/api/v1/apps/2/categories/
  • 为什么一个类别属于一个应用程序?我认为一个应用程序应该属于一个类别。没有?
猜你喜欢
  • 2019-06-23
  • 1970-01-01
  • 2022-01-01
  • 2017-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多