0

次のように、laravelのデフォルトルートコントローラーと同じ機能を提供するAPIControllerを用意しようとしています

//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 が store メソッドの FormRequest で任意のクラスを受け入れることができるように、クラスを交換したいと思います

しかし、次のエラーが表示されます。

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 に答える