Désolé si cette question a été posée plusieurs fois auparavant et que cela n'est tout simplement pas possible en Laravel/PHP.
Dans mon application Laravel, j'ai un PostController
,它使用 Laravel 丰富的命名约定。我还有一个 CommentController
,它主要以各种方式复制 PostController
,因此我决定 CommentController
qui devrait étendre PostController代码>.
La seule différence jusqu'à présent est que la méthode store()
方法需要接受不同的 FormRequest
对象,因为它们具有不同的验证规则。因此,我重写了 store()
方法以期望 CommentFormRequest
而不是 PostFormRequest
(两者都扩展了 FormRequest
store() doit accepter un objet
store() pour attendre
CommentFormRequest au lieu dePostFormRequest (les deux étendent
FormRequest).Cela générera une erreur indiquant que les paramètres de la méthode remplacés doivent correspondre à la méthode de base.
Est-ce prévu ? Existe-t-il une solution raisonnable pour ce que je veux faire ?
Modifié à partir d'iciPost
类型。有些与其他模型有关系,例如Poll
可能与 PredefinedAnswer
模型有关系,而通用 Post
Je viens de commencer à concevoir ce projet où les utilisateurs peuvent créer des publications, des questions, des sondages, des publicités, etc. et commenter n'importe lequel d'entre eux. Post
发表评论,但可能永远不允许对 Advert
Post. Certains ont des relations avec d'autres modèles, par exemple post
表中,但具有不同的 postable_type
Poll peut avoir des relations avec le modèle
Post générique peut ne pas l'être.
Certains peuvent nécessiter une logique de validation différente, par exemple un utilisateur peut décider d'autoriser ou non les commentaires sur une PostController
中,我目前有一个非常简单的 store()
Post générique, mais peut ne jamais autoriser les commentaires sur une
AdvertController
Dans ma base de données, je pense que tout cela pourrait être stocké dans la table
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'); } }🎜Supposons que mon 🎜AdvertController ait la même logique mais des règles de validation différentes, je pense : 🎜
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'); }🎜
Au lieu d'impliquer une implémentation spécifique, vous obtiendrez plus d'avantages en impliquant l'interface, par exemple :
De cette façon, vous :
parent::store($request)
dans les cas où une manipulation particulière est requise, par exemple : vérifications de type/sanité, mais le reste de la méthode reste le même.Vous pouvez connecter davantage d'autres classes référencées ici [par exemple :
ControllerInterface
、RedirectInterface
etc.] et simplifier davantage votre code.