Heim  >  Fragen und Antworten  >  Hauptteil

Laravel PHP überschriebene Methode mit unterschiedlichen Parametern

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 store() 方法需要接受不同的 FormRequest 对象,因为它们具有不同的验证规则。因此,我重写了 store() 方法以期望 CommentFormRequest 而不是 PostFormRequest (两者都扩展了 FormRequeststore() ein anderes

FormRequest-Objekt akzeptieren muss, da sie unterschiedliche Validierungsregeln haben. Daher habe ich die Methode

store() überschrieben, um

CommentFormRequest anstelle von

PostFormRequest 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

All dies sind

Post-Typen. Einige haben Beziehungen zu anderen Modellen, zum Beispiel kann post 表中,但具有不同的 postable_typePoll Beziehungen zum

PredefinedAnswer-Modell haben, während das generische

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

Anzeige.

AdvertControllerIn meiner Datenbank könnten diese meiner Meinung nach alle in der Tabelle

post gespeichert werden, jedoch mit unterschiedlichem

postable_type. 🎜 🎜In meinem Controller denke ich, dass der Großteil der CRUD-Logik zwischen diesen verschiedenen Typen gleich ist. In einigen Fällen können Unterschiede bestehen und Methoden müssen möglicherweise überschrieben werden. 🎜 🎜Also habe ich in meinem 🎜PostController derzeit eine sehr einfache 🎜store()-Methode: 🎜
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粉863295057P粉863295057251 Tage vor405

Antworte allen(1)Ich werde antworten

  • P粉807471604

    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),例如:类型/健全性检查,但该方法的其余部分仍然相同。
    • 可以避免定义“上帝”类的陷阱,大量应用程序类必须追踪其血统。您可以通过简单地实现预期的接口来定义独立的直接替换。

    您可以进一步连接此处引用的其他类[例如:ControllerInterfaceRedirectInterface等],并进一步简化您的代码。

    Antwort
    0
  • StornierenAntwort