如何更改派生 class 方法的参数中的具体 class 名称
How to change Concrete class name in Argument for a derived class method
我正在尝试使用 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;
}
}
所以我想交换 classes ,就像 laravel 可以接受存储方法
的 FormRequest 中的任何 classes
但是我收到以下错误,
Declaration of App\Http\Controllers\KeysController::store() should be compatible with App\Http\Controllers\APIController::store()
这很好,因为签名不匹配。那么我怎样才能做到这一点?我在哪里可以找到 laravel 如何接受该参数的任何类型的 class。
你根本做不到。 (而且 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();
}
我正在尝试使用 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;
}
}
所以我想交换 classes ,就像 laravel 可以接受存储方法
的 FormRequest 中的任何 classes但是我收到以下错误,
Declaration of App\Http\Controllers\KeysController::store() should be compatible with App\Http\Controllers\APIController::store()
这很好,因为签名不匹配。那么我怎样才能做到这一点?我在哪里可以找到 laravel 如何接受该参数的任何类型的 class。
你根本做不到。 (而且 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();
}