찾다

 >  Q&A  >  본문

다른 매개변수를 사용하여 Laravel PHP 재정의 방법

이 질문이 이전에 여러 번 요청되었지만 Laravel/PHP에서는 불가능하다면 죄송합니다.

내 Laravel 애플리케이션에는 PostController,它使用 Laravel 丰富的命名约定。我还有一个 CommentController,它主要以各种方式复制 PostController,因此我决定 CommentControllerPostController를 확장해야 하는 이 있습니다.

지금까지의 유일한 차이점은 store() 方法需要接受不同的 FormRequest 对象,因为它们具有不同的验证规则。因此,我重写了 store() 方法以期望 CommentFormRequest 而不是 PostFormRequest (两者都扩展了 FormRequeststore() 메서드가 서로 다른 유효성 검사 규칙을 가지고 있으므로 다른

FormRequest 개체를 허용해야 한다는 것입니다. 따라서

PostFormRequest 대신

CommentFormRequest를 예상하도록

store() 메서드를 재정의했습니다(둘 다

FormRequest 확장).

이렇게 하면 재정의된 메서드 매개변수가 기본 메서드와 일치해야 한다는 오류가 발생합니다.

이게 예상된 일인가요? 내가 하고 싶은 일에 대한 합리적인 해결책이 있나요?

여기에서 편집됨Post类型。有些与其他模型有关系,例如Poll 可能与 PredefinedAnswer 模型有关系,而通用 Post

저는 사용자가 게시물, 질문, 여론 조사, 광고 등을 만들고 이에 댓글을 달 수 있는 이 프로젝트를 디자인하기 시작했습니다. Post 发表评论,但可能永远不允许对 Advert

모두

게시물 유형입니다. 일부는 다른 모델과 관계가 있습니다. 예를 들어 post 表中,但具有不同的 postable_typePoll은

PredefineAnswer 모델과 관계가 있을 수 있지만 일반

Post는 그렇지 않을 수 있습니다.

일부는 다른 확인 논리가 필요할 수 있습니다. 예를 들어 사용자는 일반 PostController 中,我目前有一个非常简单的 store()게시물에 댓글을 허용할지 여부를 결정할 수 있지만

광고에 대해서는 댓글을 허용하지 않을 수도 있습니다.

AdvertController내 데이터베이스에서는 이것들이 모두

post 테이블에 저장될 수 있지만

postable_type은 서로 다릅니다. 🎜 🎜내 컨트롤러에서는 대부분의 CRUD 로직이 이러한 다양한 유형 간에 동일하다고 생각합니다. 경우에 따라 차이점이 있을 수 있으며 메서드를 재정의해야 할 수도 있습니다. 🎜 🎜그래서 내 🎜PostController에는 현재 매우 간단한 🎜store() 메서드가 있습니다. 🎜 으아악 🎜내 🎜AdvertController의 논리는 동일하지만 확인 규칙이 다르다고 가정해 보겠습니다. 🎜
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');
    }
}
🎜
P粉863295057P粉863295057318일 전464

모든 응답(1)나는 대답할 것이다

  • P粉807471604

    P粉8074716042024-01-17 16:43:49

    구체적인 구현을 암시하는 대신 인터페이스를 암시하면 더 많은 이점을 얻을 수 있습니다. 예:

    으아악

    이렇게 하면:

    • 약간 다른 매개변수 힌트를 사용하여 동일한 메서드 본문을 재정의할 필요가 없습니다.
    • 호출할 수 있습니다 parent::store($request) 특별한 처리가 필요한 경우(예: 유형/온전성 검사를 수행하지만 나머지 방법은 동일하게 유지됨)
    • 많은 수의 애플리케이션 클래스에 의해 계보를 추적해야 하는 "신" 클래스를 정의하는 함정을 피할 수 있습니다. 예상되는 인터페이스를 구현하기만 하면 독립 실행형 드롭인 교체를 정의할 수 있습니다.

    여기에 참조된 다른 클래스[예: ControllerInterfaceRedirectInterfaceetc.]를 추가로 연결하고 코드를 더욱 단순화할 수 있습니다.

    회신하다
    0
  • 취소회신하다