{"id":493,"date":"2015-08-13T18:01:38","date_gmt":"2015-08-13T17:01:38","guid":{"rendered":"http:\/\/louis.hatier.me\/blog\/?p=493"},"modified":"2018-08-22T08:43:53","modified_gmt":"2018-08-22T07:43:53","slug":"zf2-introduction","status":"publish","type":"post","link":"https:\/\/louis.hatier.me\/blog\/zf2-introduction\/","title":{"rendered":"ZF2 : introduction"},"content":{"rendered":"<p><a href=\"http:\/\/louis.hatier.me\/blog\/wp-content\/uploads\/2015\/08\/logo-zf2.gif\" data-rel=\"lightbox-gallery-VBp1HoaP\" data-rl_title=\"\" data-rl_caption=\"\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft wp-image-486 size-full\" title=\"\" src=\"http:\/\/louis.hatier.me\/blog\/wp-content\/uploads\/2015\/08\/logo-zf2.gif\" alt=\"Logo ZF2\" width=\"134\" height=\"80\" \/><\/a>Un projet ZF2 est diff\u00e9rent d\u2019un projet ZF1. Parmis ces diff\u00e9rences il y a l\u2019utilisation des namespace, des modules plus pouss\u00e9s, des event manager et service locator.<br \/>\nNous allons voir ici le changement dans l\u2019organisation des fichiers, pour cela on peut t\u00e9l\u00e9charger le squelette d\u2019une application ZF2 sur <a href=\"https:\/\/github.com\/zendframework\/ZendSkeletonApplication\" target=\"_blank\" rel=\"noopener\">GitHub<\/a>.<\/p>\n<p><!--more--><\/p>\n<p>&nbsp;<\/p>\n<h2>D\u00e9marrage du projet ZF2<\/h2>\n<p>Voici l\u2019arborescence d\u2019un projet Zend Framework 2.<\/p>\n<ul>\n<li>mon-projet\/\n<ul>\n<li>config\/\n<ul>\n<li>autoload\/<\/li>\n<li>application.config.php<\/li>\n<\/ul>\n<\/li>\n<li>data\/\n<ul>\n<li>cache\/<\/li>\n<li>logs\/<\/li>\n<li>sessions\/<\/li>\n<\/ul>\n<\/li>\n<li>module\/\n<ul>\n<li>Application\/\n<ul>\n<li>config\/<\/li>\n<li>src\/\n<ul>\n<li>Application\/\n<ul>\n<li>Controller\/<\/li>\n<li>Model\/<\/li>\n<li>Service\/<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li>view\/\n<ul>\n<li>application\/<\/li>\n<li>error\/<\/li>\n<li>layout\/<\/li>\n<\/ul>\n<\/li>\n<li>Module.php<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li>public\/\n<ul>\n<li>css\/<\/li>\n<li>fonts\/<\/li>\n<li>img\/<\/li>\n<li>js\/<\/li>\n<li>.htaccess<\/li>\n<li>index.php<\/li>\n<\/ul>\n<\/li>\n<li>vendor\/\n<ul>\n<li>ma-librairie\/<\/li>\n<\/ul>\n<\/li>\n<li>init_autoloader.php<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Dans le fichier <code>config\/application.config.php<\/code>, on trouve la configuration g\u00e9n\u00e9rale, la liste des modules utilis\u00e9s, la gestion du cache etc.<br \/>\nLe dossier <code>config\/autoload\/<\/code> et ses fichiers <code>global.php<\/code> et <code>local.php<\/code> permettent de surcharger la configuration g\u00e9n\u00e9rale (connexion \u00e0 la base de donn\u00e9e, service manager) en fonction de l\u2019environnement de travail (production, d\u00e9veloppement).<\/p>\n<p>Le dossier <code>data\/<\/code> contient les donn\u00e9es qui sont habituellement \u00e9crites par une application : fichiers de cache, de logs, et de sessions.<\/p>\n<p>Dans le dossier <code>module\/<\/code>, on retrouve chaque module avec sa propre arborescence.<br \/>\nLe fichier <code>module\/Application\/Module.php<\/code> est un peu le fichier Bootstrap de ZF1.<br \/>\nIl charge notamment le fichier <code>module\/Application\/config\/module.config.php<\/code> qui est la configuration propre au module : controllers, views, routes etc.<br \/>\nLe dossier <code>module\/Application\/src\/Application\/<\/code> contient les controllers, models et services.<br \/>\nDans <code>module\/Application\/views\/<\/code> on retrouve nos templates au format .phtml.<\/p>\n<p>L\u2019application web pointe sur le dossier <code>public\/<\/code>, qui contient le controller frontal <code>index.php<\/code> et les ressources css\/fonts\/img\/js.<\/p>\n<p>Puis vient les librairies tierces, \u00e0 d\u00e9poser dans le dossier <code>vendor\/<\/code>.<\/p>\n<p>Enfin, \u00e0 la racine du projet on trouve le fichier <code>init_autoloader.php<\/code>, il va nous permettre entre autre de charger nos librairies, exemple ci-dessous.<\/p>\n<h2>Charger ses librairies<\/h2>\n<p>Dans le fichier <code>init_autoloader.php<\/code> \u00e0 la racine de votre projet, il est possible d\u2019ajouter ses librairies, fonctionnant avec les namespace ou avec la notation \u201cMy_Awesome_Class\u201d pour les classes plus anciennes.<\/p>\n<pre><code class=\"php\">ZendLoaderAutoloaderFactory::factory(array(\r\n    'ZendLoaderStandardAutoloader' =&gt; array(\r\n        'autoregister_zf' =&gt; true,\r\n        'namespaces' =&gt; array(\r\n            'Loutre' =&gt; __DIR__ . '\/vendor\/Loutre'\r\n        ),\r\n        'prefixes' =&gt; array(\r\n            'Util' =&gt; __DIR__ . '\/vendor\/Util'\r\n        ),\r\n    )\r\n));\r\n<\/code><\/pre>\n<p>Pour appeler une classe de mon dossier <code>Util<\/code>, je proc\u00e8de comme ceci :<\/p>\n<pre><code class=\"php\">$date = new \\Util_Date();<\/code><\/pre>\n<p>Pour acc\u00e9der aux classes de ma librairie \u201cLoutre\u201d, j&rsquo;\u00e9cris mon code de cette mani\u00e8re :<\/p>\n<pre><code class=\"php\">use Loutre\\UploadedFile;\r\n\r\nclass ImageController extends AbstractActionController\r\n{\r\n    public function indexAction()\r\n    {\r\n        $file = new UploadedFile($_FILES['image']);\r\n    }\r\n}\r\n<\/code><\/pre>\n<p>J\u2019aurai au pr\u00e9alable indiqu\u00e9 le namespace dans ma classe <code>UploadedFile<\/code><\/p>\n<pre><code class=\"php\">namespace Loutre;\r\n\r\nclass UploadedFile \r\n{\r\n    ...\r\n}\r\n<\/code><\/pre>\n<h2>Blogs int\u00e9ressants<\/h2>\n<p>Voici une liste de blogs de d\u00e9veloppeurs PHP qui publient r\u00e9guli\u00e8rement des articles sur l\u2019utilisation de ZF2 :<\/p>\n<ul>\n<li><a href=\"http:\/\/samsonasik.wordpress.com\/\" target=\"_blank\" rel=\"noopener\">http:\/\/samsonasik.wordpress.com\/<\/a><\/li>\n<li><a href=\"http:\/\/mwop.net\/blog.html\" target=\"_blank\" rel=\"noopener\">http:\/\/mwop.net\/blog.html<\/a><\/li>\n<li><a href=\"http:\/\/www.masterzendframework.com\/blog-archive\/\" target=\"_blank\" rel=\"noopener\">http:\/\/www.masterzendframework.com\/blog-archive\/<\/a><\/li>\n<li><a href=\"http:\/\/akrabat.com\/\" target=\"_blank\" rel=\"noopener\">http:\/\/akrabat.com\/<\/a><\/li>\n<li><a href=\"http:\/\/blog.hock.in\/\" target=\"_blank\" rel=\"noopener\">http:\/\/blog.hock.in\/<\/a><\/li>\n<\/ul>\n<div style=\"padding-bottom:20px; padding-top:10px;\" class=\"hupso-share-buttons\"><!-- Hupso Share Buttons - https:\/\/www.hupso.com\/share\/ --><a class=\"hupso_counters\" href=\"https:\/\/www.hupso.com\/share\/\"><img decoding=\"async\" src=\"https:\/\/static.hupso.com\/share\/buttons\/dot.png\" style=\"border:0px; padding-top:2px; float:left;\" alt=\"Share Button\"\/><\/a><script type=\"text\/javascript\">var hupso_services_c=new Array(\"twitter\",\"facebook_like\",\"pinterest\",\"email\",\"linkedin\");var hupso_counters_lang = \"en_US\";var hupso_image_folder_url = \"\";var hupso_url_c=\"\";var hupso_title_c=\"ZF2%20%3A%20introduction\";<\/script><script type=\"text\/javascript\" src=\"https:\/\/static.hupso.com\/share\/js\/counters.js\"><\/script><!-- Hupso Share Buttons --><\/div>","protected":false},"excerpt":{"rendered":"<p>Un projet ZF2 est diff\u00e9rent d\u2019un projet ZF1. Parmis ces diff\u00e9rences il y a l\u2019utilisation des namespace, des modules plus pouss\u00e9s, des event manager et service locator. Nous allons voir ici le changement dans l\u2019organisation des fichiers, pour cela on peut t\u00e9l\u00e9charger le squelette d\u2019une application ZF2 sur GitHub.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[63,57,52],"class_list":["post-493","post","type-post","status-publish","format-standard","hentry","category-php","tag-open-source","tag-php","tag-zf2"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.9 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>ZF2 : introduction - Melting Poutre<\/title>\n<meta name=\"description\" content=\"Introduction au framework ZF2\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/louis.hatier.me\/blog\/zf2-introduction\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"ZF2 : introduction - Melting Poutre\" \/>\n<meta property=\"og:description\" content=\"Introduction au framework ZF2\" \/>\n<meta property=\"og:url\" content=\"https:\/\/louis.hatier.me\/blog\/zf2-introduction\/\" \/>\n<meta property=\"og:site_name\" content=\"Melting Poutre\" \/>\n<meta property=\"article:published_time\" content=\"2015-08-13T17:01:38+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2018-08-22T07:43:53+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/louis.hatier.me\/blog\/wp-content\/uploads\/2015\/08\/logo-zf2.gif\" \/>\n<meta name=\"author\" content=\"Louis Hatier\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Louis Hatier\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/louis.hatier.me\/blog\/zf2-introduction\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/louis.hatier.me\/blog\/zf2-introduction\/\"},\"author\":{\"name\":\"Louis Hatier\",\"@id\":\"https:\/\/louis.hatier.me\/blog\/#\/schema\/person\/2f200d0368def135b452e65491c4dd11\"},\"headline\":\"ZF2 : introduction\",\"datePublished\":\"2015-08-13T17:01:38+00:00\",\"dateModified\":\"2018-08-22T07:43:53+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/louis.hatier.me\/blog\/zf2-introduction\/\"},\"wordCount\":407,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/louis.hatier.me\/blog\/#\/schema\/person\/2f200d0368def135b452e65491c4dd11\"},\"image\":{\"@id\":\"https:\/\/louis.hatier.me\/blog\/zf2-introduction\/#primaryimage\"},\"thumbnailUrl\":\"http:\/\/louis.hatier.me\/blog\/wp-content\/uploads\/2015\/08\/logo-zf2.gif\",\"keywords\":[\"Open source\",\"PHP\",\"ZF2\"],\"articleSection\":[\"PHP\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/louis.hatier.me\/blog\/zf2-introduction\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/louis.hatier.me\/blog\/zf2-introduction\/\",\"url\":\"https:\/\/louis.hatier.me\/blog\/zf2-introduction\/\",\"name\":\"ZF2 : introduction - Melting Poutre\",\"isPartOf\":{\"@id\":\"https:\/\/louis.hatier.me\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/louis.hatier.me\/blog\/zf2-introduction\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/louis.hatier.me\/blog\/zf2-introduction\/#primaryimage\"},\"thumbnailUrl\":\"http:\/\/louis.hatier.me\/blog\/wp-content\/uploads\/2015\/08\/logo-zf2.gif\",\"datePublished\":\"2015-08-13T17:01:38+00:00\",\"dateModified\":\"2018-08-22T07:43:53+00:00\",\"description\":\"Introduction au framework ZF2\",\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/louis.hatier.me\/blog\/zf2-introduction\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/louis.hatier.me\/blog\/zf2-introduction\/#primaryimage\",\"url\":\"http:\/\/louis.hatier.me\/blog\/wp-content\/uploads\/2015\/08\/logo-zf2.gif\",\"contentUrl\":\"http:\/\/louis.hatier.me\/blog\/wp-content\/uploads\/2015\/08\/logo-zf2.gif\"},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/louis.hatier.me\/blog\/#website\",\"url\":\"https:\/\/louis.hatier.me\/blog\/\",\"name\":\"Melting Poutre\",\"description\":\"Du web et d&#039;autres choses\",\"publisher\":{\"@id\":\"https:\/\/louis.hatier.me\/blog\/#\/schema\/person\/2f200d0368def135b452e65491c4dd11\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/louis.hatier.me\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/louis.hatier.me\/blog\/#\/schema\/person\/2f200d0368def135b452e65491c4dd11\",\"name\":\"Louis Hatier\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/louis.hatier.me\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/cd8d107ede5a4ec340326655e74a00ca62b02e41a02442f961c36f085aa89942?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/cd8d107ede5a4ec340326655e74a00ca62b02e41a02442f961c36f085aa89942?s=96&d=mm&r=g\",\"caption\":\"Louis Hatier\"},\"logo\":{\"@id\":\"https:\/\/louis.hatier.me\/blog\/#\/schema\/person\/image\/\"},\"sameAs\":[\"https:\/\/louis.hatier.me\",\"https:\/\/www.linkedin.com\/in\/louishatier\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"ZF2 : introduction - Melting Poutre","description":"Introduction au framework ZF2","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/louis.hatier.me\/blog\/zf2-introduction\/","og_locale":"fr_FR","og_type":"article","og_title":"ZF2 : introduction - Melting Poutre","og_description":"Introduction au framework ZF2","og_url":"https:\/\/louis.hatier.me\/blog\/zf2-introduction\/","og_site_name":"Melting Poutre","article_published_time":"2015-08-13T17:01:38+00:00","article_modified_time":"2018-08-22T07:43:53+00:00","og_image":[{"url":"http:\/\/louis.hatier.me\/blog\/wp-content\/uploads\/2015\/08\/logo-zf2.gif","type":"","width":"","height":""}],"author":"Louis Hatier","twitter_misc":{"\u00c9crit par":"Louis Hatier","Dur\u00e9e de lecture estim\u00e9e":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/louis.hatier.me\/blog\/zf2-introduction\/#article","isPartOf":{"@id":"https:\/\/louis.hatier.me\/blog\/zf2-introduction\/"},"author":{"name":"Louis Hatier","@id":"https:\/\/louis.hatier.me\/blog\/#\/schema\/person\/2f200d0368def135b452e65491c4dd11"},"headline":"ZF2 : introduction","datePublished":"2015-08-13T17:01:38+00:00","dateModified":"2018-08-22T07:43:53+00:00","mainEntityOfPage":{"@id":"https:\/\/louis.hatier.me\/blog\/zf2-introduction\/"},"wordCount":407,"commentCount":0,"publisher":{"@id":"https:\/\/louis.hatier.me\/blog\/#\/schema\/person\/2f200d0368def135b452e65491c4dd11"},"image":{"@id":"https:\/\/louis.hatier.me\/blog\/zf2-introduction\/#primaryimage"},"thumbnailUrl":"http:\/\/louis.hatier.me\/blog\/wp-content\/uploads\/2015\/08\/logo-zf2.gif","keywords":["Open source","PHP","ZF2"],"articleSection":["PHP"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/louis.hatier.me\/blog\/zf2-introduction\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/louis.hatier.me\/blog\/zf2-introduction\/","url":"https:\/\/louis.hatier.me\/blog\/zf2-introduction\/","name":"ZF2 : introduction - Melting Poutre","isPartOf":{"@id":"https:\/\/louis.hatier.me\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/louis.hatier.me\/blog\/zf2-introduction\/#primaryimage"},"image":{"@id":"https:\/\/louis.hatier.me\/blog\/zf2-introduction\/#primaryimage"},"thumbnailUrl":"http:\/\/louis.hatier.me\/blog\/wp-content\/uploads\/2015\/08\/logo-zf2.gif","datePublished":"2015-08-13T17:01:38+00:00","dateModified":"2018-08-22T07:43:53+00:00","description":"Introduction au framework ZF2","inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/louis.hatier.me\/blog\/zf2-introduction\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/louis.hatier.me\/blog\/zf2-introduction\/#primaryimage","url":"http:\/\/louis.hatier.me\/blog\/wp-content\/uploads\/2015\/08\/logo-zf2.gif","contentUrl":"http:\/\/louis.hatier.me\/blog\/wp-content\/uploads\/2015\/08\/logo-zf2.gif"},{"@type":"WebSite","@id":"https:\/\/louis.hatier.me\/blog\/#website","url":"https:\/\/louis.hatier.me\/blog\/","name":"Melting Poutre","description":"Du web et d&#039;autres choses","publisher":{"@id":"https:\/\/louis.hatier.me\/blog\/#\/schema\/person\/2f200d0368def135b452e65491c4dd11"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/louis.hatier.me\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":["Person","Organization"],"@id":"https:\/\/louis.hatier.me\/blog\/#\/schema\/person\/2f200d0368def135b452e65491c4dd11","name":"Louis Hatier","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/louis.hatier.me\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/cd8d107ede5a4ec340326655e74a00ca62b02e41a02442f961c36f085aa89942?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/cd8d107ede5a4ec340326655e74a00ca62b02e41a02442f961c36f085aa89942?s=96&d=mm&r=g","caption":"Louis Hatier"},"logo":{"@id":"https:\/\/louis.hatier.me\/blog\/#\/schema\/person\/image\/"},"sameAs":["https:\/\/louis.hatier.me","https:\/\/www.linkedin.com\/in\/louishatier\/"]}]}},"_links":{"self":[{"href":"https:\/\/louis.hatier.me\/blog\/wp-json\/wp\/v2\/posts\/493","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/louis.hatier.me\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/louis.hatier.me\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/louis.hatier.me\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/louis.hatier.me\/blog\/wp-json\/wp\/v2\/comments?post=493"}],"version-history":[{"count":7,"href":"https:\/\/louis.hatier.me\/blog\/wp-json\/wp\/v2\/posts\/493\/revisions"}],"predecessor-version":[{"id":723,"href":"https:\/\/louis.hatier.me\/blog\/wp-json\/wp\/v2\/posts\/493\/revisions\/723"}],"wp:attachment":[{"href":"https:\/\/louis.hatier.me\/blog\/wp-json\/wp\/v2\/media?parent=493"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/louis.hatier.me\/blog\/wp-json\/wp\/v2\/categories?post=493"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/louis.hatier.me\/blog\/wp-json\/wp\/v2\/tags?post=493"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}