我研究了How to Handle File Uploads with Doctrine,我不想對__DIR__.'/../../../../web/'.$this->getUploadDir();
路徑進行硬編碼,因爲將來我可能會更改web/
目錄。如何做到這一點更靈活?我發現this但它並沒有回答這個問題如何從實體內部更靈活地做到這一點如何從實體內部獲取網頁目錄路徑?
回答
你不應該在這裏使用實體類作爲表單模型。這根本不適合那份工作。如果實體具有path
屬性,則它可存儲的唯一有效值爲:null
(如果文件不存在)以及表示文件路徑的字符串。
創建一個單獨的類,即會是爲表單的模型:
class MyFormModel { /** @Assert\File */ private $file; /** @Assert\Valid */ private $entity; // constructor, getters, setters, other methods }
在您的表單處理程序(通過DIC配置單獨的對象;推薦)或控制器:
... if ($form->isValid()) { /** @var \Symfony\Component\HttpFoundation\File\UploadedFile */ $file = $form->getData()->getFile(); /** @var \Your\Entity\Class */ $entity = $form->getData()->getEntity(); // move the file // $path = '/path/to/the/moved/file'; $entity->setPath($path); $someEntityManager->persist($entity); return ...; } ...
在表單處理程序/控制器中,您可以訪問DIC中的任何依賴關係/屬性(包括路徑到上傳目錄)。
您鏈接的教程有效,但這是一個糟糕的設計。實體不應該知道文件上傳。
你可以在你的parameters.yml中使用一個變量。像這樣你可以在你想要的時候改變路徑。
例如:
# app/config/parameters.yml
# Upload directories
upload_avatar_dir: /uploads/avatars
upload_content_dir: /uploads/content
upload_product_offer_dir: /uploads/product-offer
...
如何在實體內部獲取它? – Mikhail
您的實體不知道文檔的存儲位置。呦可以將這個責任移交給你的控制器。或者你可以添加一個路徑屬性到你的實體 –
我通過創建一個抽象類,如果他們正在處理文件上傳如Symfony的文檔中描述該實體可以延伸這樣處理。我創建了文件數組,以便我可以在set方法中創建現有文件路徑的副本,以便在成功執行更新或刪除操作時將其從文件系統中刪除,而無需在Entity中定義任何其他屬性。
use Symfony\Component\HttpFoundation\File\File;
abstract class FileUploadEntity
{
private $files;
public function __set($name, File $value)
{
$this->files[$name] = $value;
}
public function __get($name)
{
if (!is_array($this->files)) $this->files = array();
if (!array_key_exists($name, $this->files)) {
return null;
}
return $this->files[$name];
}
public function getUploadRootDirectory()
{
return $this->getWebDirectory() . $this->getUploadDirectory();
}
public function getWebDirectory()
{
return __DIR__ . "/../../../../web/";
}
public function getUploadDirectory()
{
$year = date("Y");
$month= date("m");
return "images/uploads/$year/$month/";
}
public function getEncodedFilename($name)
{
return sha1($name . uniqid(mt_rand(), true));
}
// this should be a PrePersist method
abstract public function processImages();
// This should be defined as a Doctrine PreUpdate Method
abstract public function checkImages();
// this should be a PostPersist method
abstract public function upload();
// this should be a PostUpdate method and delete old files
abstract public function checkUpload();
// This should be a PostRemove method and delete files
abstract public function deleteFile();
}
要從控制器外部訪問根目錄,只需在服務配置中注入'%kernel.root_dir%'作爲參數即可。
service_name:
class: Namespace\Bundle\etc
arguments: ['%kernel.root_dir%']
然後你就可以得到網站根在類的構造函數:
public function __construct($rootDir)
{
$this->webRoot = realpath($rootDir . '/../web');
}
- 1. 如何獲取工作目錄路徑?
- 2. C - 獲取目錄路徑
- 3. 從網頁源獲取絕對路徑
- 4. 從Spring bean獲取目錄的路徑?
- 5. 從SDCARD ANDROID 6.0.1獲取目錄路徑
- 6. 從Ruby Gem中,我如何獲取項目的目錄路徑?
- 7. 如何使用.NET獲取Windows上的實際目錄路徑?
- 8. 如何獲取目錄連接的實際文件夾路徑?
- 9. 從文件路徑獲取文件目錄路徑
- 10. 如何獲取Django中臨時目錄的子目錄路徑
- 11. .net,內置方式從路徑獲取目錄名稱?
- 12. 如何從本地路徑獲取網絡路徑?
- 13. 如何從批處理腳本中的文件路徑獲取目錄路徑
- 14. 如何使用Firebug從網頁獲取完整圖像路徑?
- 15. 如何從NSURL獲取路徑/目錄組件?
- 16. 如何從文件名獲取文件路徑和目錄?
- 17. 如何從Groovy中的完整路徑獲取當前目錄?
- 18. 如何從輸入中獲取文件夾/目錄路徑?
- 19. 如何從PHP的完整路徑獲取目錄名稱?
- 20. 如何從android目錄中獲取絕對路徑URI
- 21. 得到GALAXY NOTE內部目錄路徑
- 22. 如何在spring中獲取項目目錄的路徑?
- 23. 如何獲取項目目錄的路徑
- 24. 如何在android中獲取內部和外部sdcard路徑
- 25. 如何讀取本地目錄路徑
- 26. 獲取.NET Framework目錄路徑
- 27. PHP:獲取路徑php目錄
- 28. 獲取路徑中的一級目錄
- 29. 使用JFileChooser獲取目錄的路徑
- 30. 獲取目錄的絕對路徑
我明白了。謝謝。但是,如何使用生命週期回調來管理用您的代碼刪除文件? – Mikhail
基於以前的經驗,我建議你存儲絕對路徑(或者至少相對於webroot路徑)。 –
創建一個偵聽器,訂閱'preRemove'(或'preDelete')事件(參見[how to](http: //symfony.com/doc/current/cookbook/doctrine/event_listeners_subscribers.html))並在那裏取消鏈接文件。 – Crozin