Rumah  >  Soal Jawab  >  teks badan

Kaedah ganti PHP Laravel dengan parameter berbeza

Maaf jika soalan ini telah ditanya beberapa kali sebelum ini dan ini tidak mungkin dalam Laravel/PHP.

Dalam aplikasi Laravel saya, saya mempunyai PostController,它使用 Laravel 丰富的命名约定。我还有一个 CommentController,它主要以各种方式复制 PostController,因此我决定 CommentController yang sepatutnya memanjangkan PostController.

Satu-satunya perbezaan setakat ini ialah kaedah store() 方法需要接受不同的 FormRequest 对象,因为它们具有不同的验证规则。因此,我重写了 store() 方法以期望 CommentFormRequest 而不是 PostFormRequest (两者都扩展了 FormRequeststore() perlu menerima objek

FormRequest yang berbeza kerana ia mempunyai peraturan pengesahan yang berbeza. Oleh itu, saya mengatasi kaedah

store() untuk mengharapkan

CommentFormRequest dan bukannya

PostFormRequest (kedua-duanya melanjutkan

FormRequest).

Ini akan menimbulkan ralat bahawa parameter kaedah yang diganti perlu sepadan dengan kaedah asas.

Adakah ini dijangkakan? Adakah terdapat penyelesaian yang munasabah untuk apa yang saya mahu lakukan?

Diedit dari siniPost类型。有些与其他模型有关系,例如Poll 可能与 PredefinedAnswer 模型有关系,而通用 Post

Saya baru mula mereka bentuk projek ini di mana pengguna boleh membuat siaran, soalan, tinjauan pendapat, iklan, dsb. dan mengulas mana-mana daripadanya. Post 发表评论,但可能永远不允许对 Advert

Semua ini adalah jenis

Pos. Sesetengahnya mempunyai hubungan dengan model lain, contohnya post 表中,但具有不同的 postable_typePoll mungkin mempunyai hubungan dengan model

PredefinedAnswer, manakala

Poll generik mungkin tidak.

Sesetengahnya mungkin memerlukan logik pengesahan yang berbeza, contohnya pengguna boleh memutuskan sama ada untuk membenarkan ulasan pada PostController 中,我目前有一个非常简单的 store()Post generik, tetapi mungkin tidak sekali-kali membenarkan ulasan pada

Iklan.

AdvertControllerDalam pangkalan data saya, saya rasa ini semua boleh disimpan dalam jadual

post, tetapi dengan

postable_type yang berbeza. 🎜 🎜Dalam pengawal saya, saya rasa kebanyakan logik CRUD adalah sama antara jenis yang berbeza ini. Dalam sesetengah kes, perbezaan mungkin wujud dan kaedah mungkin perlu diatasi. 🎜 🎜Jadi dalam 🎜PostController saya pada masa ini saya mempunyai kaedah 🎜store() yang sangat mudah: 🎜
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');
    }
}
🎜Andaikan 🎜AdvertController saya mempunyai logik yang sama tetapi peraturan pengesahan yang berbeza saya rasa: 🎜
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粉863295057300 hari yang lalu447

membalas semua(1)saya akan balas

  • P粉807471604

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

    Daripada membayangkan pelaksanaan khusus, anda akan mendapat lebih banyak faedah dengan membayangkan antara muka, sebagai contoh:

    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;
        }
    }
    

    Dengan cara ini anda:

    • Tidak perlu mentakrifkan semula badan kaedah yang sama dengan pembayang parameter yang sedikit berbeza.
    • boleh dipanggil parent::store($request) dalam kes di mana beberapa pengendalian khas diperlukan, cth: pemeriksaan jenis/kewarasan, tetapi kaedah selebihnya tetap sama.
    • Anda boleh mengelakkan perangkap untuk mentakrifkan kelas "tuhan", yang keturunannya mesti dikesan oleh sebilangan besar kelas aplikasi. Anda boleh menentukan penggantian drop-in kendiri dengan hanya melaksanakan antara muka yang dijangkakan.

    Anda boleh menyambung lagi kelas lain yang dirujuk di sini [cth: ControllerInterfaceRedirectInterfacedsb.] dan memudahkan lagi kod anda.

    balas
    0
  • Batalbalas