2010-04-05 6 views
1

J'ai lu et lu de nombreux articles de blog et sujets de forum traitant d'exemples de mise en œuvre de Data Mapper/Model en PHP, mais je n'en ai vu aucun traitant également de l'enregistrement de fichiers/images.Mappeurs de données, modèles et images

Je travaille actuellement sur un projet basé sur Zend Framework et je fais de la manipulation d'image dans le modèle (qui est passé un chemin de fichier), puis je laisse au mappeur de sauvegarder ce fichier à l'endroit approprié - est-ce une pratique courante?

Mais alors, comment gérez-vous la création de 3 images de taille différente de celle qui est passée? À l'heure actuelle, j'ai un setImage($path_to_tmp_name) qui vérifie le type d'image, redimensionne, puis enregistre de nouveau le nom de fichier d'origine. Un appel à getImagePath() renvoie ensuite le chemin de fichier actuel que le mappeur de données peut utiliser, puis change avec un appel à setImagePath($path) une fois qu'il est enregistré à l'emplacement approprié, dites "/ content/my_images". Cela vous semble-t-il pratique?

De même, comment traiteriez-vous l'obtention de l'URL de cette image? Voyez-vous cela comme quelque chose que le modèle devrait fournir? Il me semble que ce modèle devrait s'inquiéter de l'endroit où les images sont stockées ou finalement comment elles sont accédées par l'intermédiaire d'un navigateur et donc je suis enclin à mettre cela dans le dossier ini et juste passer le préfixe d'URL à la vue par le manette. Est-ce que cela semble raisonnable?

J'utilise GD pour la manipulation d'image - pas que cela soit pertinent.

MISE À JOUR: Je me demandais si le redimensionnement de l'image devait être effectué dans le modèle. Le modèle pourrait exiger qu'il soit fourni une image "principale" et une image "pouce", toutes deux de certaines dimensions. J'ai pensé à créer une fonction getImageSpecs() dans le modèle qui retournerait quelque chose qui définit les tailles requises, puis une classe de manipulation d'image distincte pourrait effectuer le redimensionnement et (peut-être dans le contrôleur?) Et juste passer les chemins finaux dans le modèle en utilisant quelque chose comme setImagePaths($images).

Toute pensée très appréciée :)

Répondre

0

Je 1er vous dire qu'avoir un mappeur sauver le chemin vers le fichier est pratique courante que c'est exactement ce que une couche de service (cartographe dans votre cas) devrait faire. La meilleure chose dans votre cas serait de créer un chemin pour chaque fichier généré. Je vous conseille de faire:

$path = '/path/to/root/' . substr(chunk_split(md5(<unique id for file>), 2, '/'), 0, 5); 

En faisant ce qui précède votre chemin serait quelque chose comme:/chemin/vers/root/ab/23 /. Puisque vous avez besoin de tailles différentes pour chaque image, vous sauvegardez maintenant chaque image avec le nom de l'id suivi de la taille. ex:

$fileName = <uniquie file id from above> . '_50_100' . $ext; 

Tout ce que vous devez faire à la fin est de sauvegarder le chemin dans la base de données. Votre modèle peut alors aller chercher le chemin de la couche de service et créer les URL dont vous avez besoin.

+0

Merci beaucoup pour la réponse. Désolé si je suis ignorant, mais pourquoi ne pas simplement utiliser l'ID comme nom de fichier? Le chunk_spit est-il juste pour faciliter la catégorisation des fichiers? – James

Questions connexes