Heim > Fragen und Antworten > Hauptteil
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代码>.
Der einzige Unterschied besteht bisher darin, dass die Methode store()
方法需要接受不同的 FormRequest
对象,因为它们具有不同的验证规则。因此,我重写了 store()
方法以期望 CommentFormRequest
而不是 PostFormRequest
(两者都扩展了 FormRequest
store() ein anderes
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'); }🎜
P粉8074716042024-01-17 16:43:49
与其暗示具体的实现,不如暗示接口,你会得到更多的收益,例如:
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; } }
这样你:
parent::store($request)
,例如:类型/健全性检查,但该方法的其余部分仍然相同。 您可以进一步连接此处引用的其他类[例如:ControllerInterface
、RedirectInterface
等],并进一步简化您的代码。