Entschuldigung, wenn diese Frage schon mehrmals gestellt wurde und dies in Laravel/PHP einfach nicht möglich ist.
In meiner Laravel-Anwendung habe ich einen PostController
,它使用 Laravel 丰富的命名约定。我还有一个 CommentController
,它主要以各种方式复制 PostController
,因此我决定 CommentController
, der PostController.
erweitern soll
Der einzige Unterschied besteht bisher darin, dass die Methode
ein anderes store()
方法需要接受不同的 FormRequest
对象,因为它们具有不同的验证规则。因此,我重写了 store()
方法以期望 CommentFormRequest
而不是 PostFormRequest
(两者都扩展了 FormRequest
store()
store() überschrieben, um
CommentFormRequest anstelle vonPostFormRequest zu erwarten (beide erweitern
FormRequest).Dies löst einen Fehler aus, der besagt, dass die überschriebenen Methodenparameter mit der Basismethode übereinstimmen müssen.
Ist das zu erwarten? Gibt es eine vernünftige Lösung für das, was ich tun möchte?
Von hier aus bearbeitetPost
类型。有些与其他模型有关系,例如Poll
可能与 PredefinedAnswer
模型有关系,而通用 Post
Ich habe gerade mit der Gestaltung dieses Projekts begonnen, bei dem Benutzer Beiträge, Fragen, Umfragen, Anzeigen usw. erstellen und jeden davon kommentieren können. Post
发表评论,但可能永远不允许对 Advert
Post-Typen. Einige haben Beziehungen zu anderen Modellen, zum Beispiel kann post
表中,但具有不同的 postable_type
Poll Beziehungen zum
Post möglicherweise keine Beziehungen hat.
Einige erfordern möglicherweise eine andere Validierungslogik. Beispielsweise kann ein Benutzer entscheiden, ob er Kommentare zu einem generischen PostController
中,我目前有一个非常简单的 store()
Beitrag zulässt, aber möglicherweise niemals Kommentare zu einer
AdvertController
In meiner Datenbank könnten diese meiner Meinung nach alle in der Tabelle
class PostController extends Controller { protected $postableType; public function __construct() { $this->postableType = PostType::GENERIC; } public function store(PostStoreRequest $request): RedirectResponse { $validated = $request->validated(); $post = new Post(); $post->message = $validated['message']; $post->user_id = $request->user()->id; $post->postable_type = $this->postableType; $post->save(); return Redirect::route('feed'); } }🎜Angenommen, mein 🎜AdvertController hat die gleiche Logik, aber unterschiedliche Validierungsregeln, denke ich: 🎜
class AdvertController extends PostController { protected $postableType; public function __construct() { $this->postableType = PostType::ADVERT; } public function store(AdvertStoreRequest $request): RedirectResponse { $validated = $request->validated(); $advert= new Advert(); $advert->message = $validated['message']; $advert->user_id = $request->user()->id; $advert->postable_type = $this->postableType; $advert->save(); return Redirect::route('feed'); }🎜
与其暗示具体的实现,不如暗示接口,你会得到更多的收益,例如:
这样你:
parent::store($request)
,例如:类型/健全性检查,但该方法的其余部分仍然相同。您可以进一步连接此处引用的其他类[例如:
ControllerInterface
、RedirectInterface
等],并进一步简化您的代码。