如何更改派生 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();
}