0

我正在尝试拥有一个 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 中的任何类作为 store 方法一样

但我得到以下错误,

Declaration of App\Http\Controllers\KeysController::store() should be compatible with App\Http\Controllers\APIController::store()

这很好,因为签名不匹配。那么我该如何实现呢?我在哪里可以找到 laravel 是如何接受任何类型的论点的。

4

1 回答 1

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();
}
于 2015-04-17T14:19:20.737 回答