为多个域重用API Controller?拉拉韦尔

时间:2020-02-21 02:52:34

标签: php laravel

假设我们有2个网站需要使用相同的OrderController进行控制,但是根据数据库中的网站(siteId),它们的处理方式略有不同...

例如,我有2个网站,其中1个叫做 Acme ,另一个叫 MonstersInc

// api.php(acme路由)

Route::prefix('acme')->group(function () {
    Route::get('/order', 'Acme\\OrderController@index')->name('acme.order.index');
    Route::get('/order/{order}', 'Acme\\OrderController@show')->name('acme.order.show');
    Route::post('/order', 'Acme\\OrderController@store')->name('acme.order.store');
    Route::put('/order/{order}', 'Acme\\OrderController@update')->name('acme.order.update');
    Route::delete('/order/{order}', 'Acme\\OrderController@delete')->name('acme.order.delete');
});

// api.php(怪兽路线)

Route::prefix('monsters')->group(function () {
    Route::get('/order', 'MonstersInc\\OrderController@index')->name('monsters.order.index');
    Route::get('/order/{order}', 'MonstersInc\\OrderController@show')->name('monsters.order.show');
    Route::post('/order', 'MonstersInc\\OrderController@store')->name('monsters.order.store');
    Route::put('/order/{order}', 'MonstersInc\\OrderController@update')->name('monsters.order.update');
    Route::delete('/order/{order}', 'MonstersInc\\OrderController@delete')->name('monsters.order.delete');
});

// OrderController.php

class OrderController extends Controller
{
    private $siteId;

    public function __construct() {
        $this->siteId = Site::where('site_name', 'Acme')->get('id');
    }

    /**
     * Display a listing of the resource.
     *
     * @return Order[]|\Illuminate\Database\Eloquent\Collection
     */
    public function index()
    {
        return Order::where('site_id', $this->siteId)->get();
    }

    ...
}

// SitesSeeder

DB::table('sites')->insert([
    'id' => 1,
    'site_name' => 'Acme',
    'order_scope' => '',
    'site_id' => 1, // Acme is 1, MonstersInc is 2
    'site_sub_id' => null,
    'site_platform_id' => 1, 
    'created_at' => Carbon::now(),
    'updated_at' => Carbon::now(),
]);
DB::table('sites')->insert([
    'id' => 2,
    'site_name' => 'MonstersInc',
    'order_scope' => '',
    'site_id' => 2, // Acme is 1, MonstersInc is 2
    'site_sub_id' => null,
    'site_platform_id' => 1, 
    'created_at' => Carbon::now(),
    'updated_at' => Carbon::now(),
]);

区分两个控制器而无需维护两组控制器的最佳方法是什么?

编辑:我收到此错误...

 Symfony\Component\Debug\Exception\FatalThrowableError  : Call to a member function getPrefix() on null

  at /home/vagrant/code/laracart/app/Http/Controllers/Acme/OrderController.php:17
    13| {
    14|     private $siteId;
    15|
    16|     public function __construct() {
  > 17|         $siteName = Request()->route()->getPrefix();
    18|         $siteName = ucfirst(str_replace('api/', '', $siteName));
    19|         $this->siteId = Site::where('site_name', $siteName)->value('id');
    20|     }
    21|

1 个答案:

答案 0 :(得分:0)

将其添加到每个函数中是唯一的解决方案...

public function index()
    {
        $siteName = Request()->route()->getPrefix();
        $siteName = ucfirst(str_replace('api/', '', $siteName));
        $siteId = Site::where('site_name', $siteName)->value('id');

        return Order::where('site_id', $siteId)->get();
    }