2012-04-01 41 views
6

Tôi đang sử dụng bài viết về nấu ăn từ symfony.com để thực hiện tùy chọn tải lên tệp cho hình ảnh.Symfony2: Chỉnh sửa tập tin tải lên

Bây giờ tôi muốn tải các hình ảnh khác lên thực thể.

Chiến lược mặc định để chỉnh sửa là: 1. Fetch ra khỏi DB 2. Tiêm vào Form 3. Cố

Bằng cách nào đó chiến lược này không hoạt động nữa khi sử dụng tập tin tải lên (học thuyết không thực hiện sự kiện)

Tôi có thể làm gì khác để làm cho các bài viết có thể chỉnh sửa ảnh?

Trả lời

10

Sách dạy nấu ăn không không xử lý cập nhật, đặc biệt trong trường hợp chỉ có tệp thay đổi.

Trong trường hợp này, sự kiện PreUpdate không được kích hoạt, vì vậy bạn cần phải kích hoạt $entity->preUpload() thủ công trước khi $em->persist($entity), do đó tải lên tập tin được xử lý trong mọi trường hợp (preUpload sẽ làm thay đổi $entity->path nên sự bền bỉ sẽ xảy ra)

+0

Hi, bạn đang phải. Khi không có trường nào được cập nhật, các sự kiện gọi lại vòng đời không bị sa thải :) – bodokaiser

+0

Nếu bạn sử dụng Knp DoctrineExtensions, bạn có thể sử dụng Dấu thời gian trên thực thể giữ logic tải lên tệp và sử dụng $ entity-> updateTimestamps(); trước $ em-> persist() để nó sẽ cập nhật các trường giả bạn cần;) –

7

Nếu bạn thay đổi chỉ lĩnh vực upload vòng đời không chạy phương pháp tải lên, trong sách dạy nấu ăn được báo cáo giải pháp trong một hộp quote như sau:

các PreUpdate và PostUpdate callbacks chỉ được kích hoạt nếu có một sự thay đổi trong một trong những fie của thực thể ld vẫn tồn tại. Điều này có nghĩa là theo mặc định, , nếu bạn chỉ sửa đổi thuộc tính $ tệp, những sự kiện này sẽ không được kích hoạt vì bản thân thuộc tính không trực tiếp được duy trì qua Học thuyết. Một giải pháp là sử dụng trường được cập nhật được tiếp tục theo học thuyết và sửa đổi theo cách thủ công khi thay đổi tệp.

thêm một trường giả để cập nhật trong bộ điều khiển trước khi tồn tại sự kiện như đề nghị của duscussion này:

https://github.com/symfony/symfony-docs/pull/564

public function setFile(UploadedFile $file) 
{ 
    $this->file = $file; 
    $this->updatedAt = new \DateTime(); 
} 
Các vấn đề liên quan