如何在Argument中更改派生类方法的Concrete类名

时间:2015-04-17 13:32:33

标签: php laravel laravel-5 laravel-validation

我正在尝试使用API​​Controller,它提供与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如何接受任何类型的论点。

1 个答案:

答案 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();
}