Rumah > Soal Jawab > teks badan
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
(两者都扩展了 FormRequest
store() perlu menerima objek
store() untuk mengharapkan
CommentFormRequest dan bukannyaPostFormRequest (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
Pos. Sesetengahnya mempunyai hubungan dengan model lain, contohnya post
表中,但具有不同的 postable_type
Poll mungkin mempunyai hubungan dengan model
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
AdvertController
Dalam pangkalan data saya, saya rasa ini semua boleh disimpan dalam jadual
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粉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:
parent::store($request)
dalam kes di mana beberapa pengendalian khas diperlukan, cth: pemeriksaan jenis/kewarasan, tetapi kaedah selebihnya tetap sama. Anda boleh menyambung lagi kelas lain yang dirujuk di sini [cth: ControllerInterface
、RedirectInterface
dsb.] dan memudahkan lagi kod anda.