我正在尝试使用APIController,它提供与laravel的默认路由控制器相同的功能,如下所示
//Routes.php
Route::resource('keys', 'KeysController');
Route::resource('SomeOther', 'SomeOtherController');
abstract class APIController extends Controller {
public function store()
{
return $this->respondNotSupported();
}
}
class KeysController extends APIController {
public function store(KeysRequest $request)
{
$input = Request::all();
$newkey = Key::create($input);
return $newkey->id;
}
}
class SomeOtherController extends APIController {
public function store(SomeOtherRequest $request)
{
$input = Request::all();
$newkey = SomeOtherModel::create($input);
return $newkey->id;
}
}
所以我想交换这些类,就像laravel可以接受FormRequest中任何用于存储方法的类一样
但是我得到以下错误,
Declaration of App\Http\Controllers\KeysController::store() should be compatible with App\Http\Controllers\APIController::store()
这很好,因为签名不匹配。那么我怎样才能做到这一点?我在哪里可以找到laravel如何接受任何类型的论点。
答案 0 :(得分:2)
你根本无法做到这一点。 (Laravel也不这样做)
您可以使用魔术方法__call()
来处理抽象控制器中缺少的方法。如果实现,如果在控制器上调用不存在的方法,PHP将调用此方法。
这是Laravel在Illuminate\Routing\Controller
中所做的事情:
public function __call($method, $parameters)
{
throw new BadMethodCallException("Method [$method] does not exist.");
}
这意味着您可以使用respondNotSupported
执行相同的操作:
public function __call($method, $parameters)
{
return $this->respondNotSupported();
}
显然,您可以使用$method
(这只是被调用方法的名称)来进行更复杂的过滤:
public function __call($method, $parameters)
{
if($method == 'store'){
return $this->respondStoreNotSupported();
}
return $this->respondNotSupported();
}