Допустим, у нас есть 2 веб-сайта, которые должны управляться одним и тем же OrderController, однако они обрабатываются немного по-разному в зависимости от сайта (siteId) в базе данных ...
Например, у меня есть 2 веб-сайты, 1 называется Acme другой называется MonstersIn c
// 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 (монстры c маршруты)
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|