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
,它主要以各種方式復(fù)制 PostController
,因此我決定 CommentController
qui devrait étendre PostController代碼>.
La seule différence jusqu'à présent est que la méthode store()
方法需要接受不同的 FormRequest
對象,因為它們具有不同的驗證規(guī)則。因此,我重寫了 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
類型。有些與其他模型有關(guān)系,例如Poll
可能與 PredefinedAnswer
模型有關(guān)系,而通用 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
發(fā)表評論,但可能永遠不允許對 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?:
interface StoreRequestInterface { public function validated(): RedirectResponse; public function user(); // etc } class PostStoreRequest implements StoreRequestInterface {/* ... */} class AdvertStoreRequest implements StoreRequestInterface {/* ... */} abstract class Controller { protected $postableType; public function store(StoreRequestInterface $request): RedirectResponse { // ... } } class PostController extends Controller { public function __construct() { $this->postableType = PostType::GENERIC; } } class AdvertController extends PostController { public function __construct() { $this->postableType = PostType::ADVERT; } }
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.