2015-08-07 22 views
5

Có thể thay đổi số action classYii2 bằng cách nào đó, tương tự như cách bạn có thể đặt lớp của nhiều thành phần khác trong tệp cấu hình?Có thể thay đổi lớp hành động trong Yii2 không?

Tôi muốn mở rộng lớp học này để tôi có thể thêm một biến thành viên khác vào đó.

Tôi đoán tôi chỉ có thể thêm một tiện ích con theo cách động, nhưng muốn làm điều đó một cách thích hợp.

Chỉnh sửa: Nhìn vào danh sách core application components nó không được liệt kê, do đó, không chắc chắn nếu nó có thể?

+0

Tôi đoán bạn sẽ phải mở rộng yii \ base \ Controller và viết lại hàm createAction để có thể sử dụng trình bao bọc InlineAction tùy chỉnh của bạn, vì nó được mã hóa cứng ở đó. – apoq

Trả lời

1

Cách thích hợp để giải quyết vấn đề này là mở rộng cả lớp điều khiển và hành động. Nếu bạn nhìn vào mã nguồn, yii\base\Controller có phương thức createAction, nếu không tìm thấy hành động nào, sẽ tạo một phiên bản InlineAction.

Vì bạn đang mở rộng một số loại bộ điều khiển mỗi khi bạn tạo bộ điều khiển của riêng mình (class MyController extends Controller), bạn chỉ có thể ghi đè phương thức gốc createAction và sử dụng phương thức thực hiện của riêng bạn đối với lớp InlineAction.

+0

Cảm ơn ý tưởng. Tôi đoán tôi không muốn ghi đè lên bất kỳ phương pháp nào vì nó có báo trước về việc bỏ lỡ các cập nhật trong tương lai cho các phương pháp này (vì bạn sẽ sử dụng phương pháp của riêng mình), nhưng tôi đoán đây sẽ là cách tốt nhất để xử lý nó. – Brett

+0

Đó là một chút lẻ mà bạn cần phải mở rộng 'InlineAction'. Thuộc tính này bạn đang thêm vào nó là gì? – Beowulfenator

+0

Tôi đã quyết định xử lý nó theo cách khác và tránh thêm thuộc tính thừa, nhưng nó sẽ đơn giản là tên * duy nhất cho hành động trên toàn bộ ứng dụng, bởi vì các trình điều khiển khác nhau rõ ràng có các hành động giống hệt nhau. – Brett

1

Nó có thể được thực hiện với class map

Yii::$classMap['yii\base\InlineAction'] = '@common/InlineAction.php'; 

và cần được đặt vào index.php, trước khi ứng dụng được khởi chạy.

Bất kể vị trí của nó, common/InlineAction.php phải có cùng một không gian tên yii\base làm lớp gốc.

+0

Điều này không nên được đặt trong quá trình * bootstrapping * và không có trong tệp * index.php * như được chỉ ra trong tài liệu? Ngoài ra, nếu bạn cung cấp cho nó cùng một 'không gian tên' thì bạn sẽ không thể cho nó cùng một tên lớp? – Brett

+0

index.php * là * một phần của quá trình bootstrapping, bạn có thể gọi nó là kịch bản lệnh nếu nó có vẻ tốt hơn. Bạn cần phải cho nó cùng một tên lớp, đó là điểm. Sao chép InlineAction.php của yii vào vị trí mới và sửa đổi nó. Tác dụng phụ là nó không có cơ hội để mở rộng lớp gốc. – estus

+0

Xin lỗi, tôi có nghĩa là vị trí khởi động trong tệp cấu hình. Tôi không nghĩ rằng tôi muốn đi đến những biện pháp phải di chuyển xung quanh các tập tin lõi, tôi chỉ muốn có một cách để mở rộng nó. Nếu không có cách nào, thì tôi đoán tôi sẽ phải gắn bó với biến thành viên một cách linh hoạt. – Brett

Các vấn đề liên quan