אינדקס אתרים net2u :: מאמרמאמר XML
https://www.net2u.co.il/modules/planet/view.article.php?68111
2024-03-28T11:46:35+18:00אינדקס אתרים net2u :: מאמר
https://www.net2u.co.il/modules/planet/
https://www.net2u.co.il/modules/planet/assets/images/logoModule.pngtext/html2017-04-26T12:29:06+18:00https://www.net2u.co.il/modules/planet/יונתן נקסוןהמדריך השלם ל – Composer
https://www.net2u.co.il/modules/planet/view.article.php?68111
<p>Composer הוא הכלי הפופולרי ביותר לניהול תלויות (Dependency management) בפרוייקט שמפותח בשפת PHP; הכלי מופעל במסוף (CLI).<br /><br>השימוש בו רווח מאד – סביבות עבודה כמו Laravel, Slim, Zend Framework, Symphony ועוד רבות וטובות מתבססות עליו ואי אפשר להאשים אותן – נכון להים ניתן למצוא קרוב ל – 137,000 חבילות במאגר!</p><br><p>מה הכוונה ב"ניהול תלויות"?<br /><br>בהינתן פרוייקט שבו נעשה שימוש במספר ספריות, שעושות בעצמן שימוש בספריות אחרות, Composer מתקין את כל הספריות שנדרשות לפרוייקט על-פי הגדרת המשתמש.<br /><br>Composer מאפשר להתקין <strong>חבילות</strong>, כשחבילה יכולה להיות ספריה, פרוייקט, מטא, תוסף או סוג מותאם-אישית; אבל זה נושא מתקדם יותר שארחיב עליו במאמר נפרד,<br /><br>לסקרנים מחכה מידע נוסף (באנגלית) <a href="https://getcomposer.org/doc/04-schema.md#type" target="_blank">כאן</a>. במאמר הזה אתייחס לחבילות מסוג ספרייה: ספרייה מכילה אוסף של מחלקות. עוד על זה בהמשך <img src="https://s.w.org/images/core/emoji/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p><br><p>בקיצור – אם עוד לא התחלתם, זה הזמן המושלם להתקדם ל – Composer! נצא לדרך?</p><br><h2>דרישות מערכת</h2><br><p>Composer רץ על PHP ולכן הדרישה המינימלית ביותר היא גרסה PHP 5.3.2 ומעלה.<br /><br>הכלי רץ באופן זהה על Windows, לינוקס ו – OSX.</p><br><p>במקרים מסויימים, ייתכן שתידרשו להתקין מערכות ניהול גרסאות (Git, Svn וכו') כדי להתקין חבילה, בהתאם לדרך שבה ניהול הגרסאות של החבילה נעשה.</p><br><h2>דרישות מכם</h2><br><p>אף-על-פי ש – Composer רץ על PHP 5.3.2 ומעלה, המדריך נכתב ל – PHP 7.<br /><br>בנוסף, עליכם להכיר:</p><br><ul><br><li><a href="http://php.net/manual/en/language.namespaces.php" target="_blank">PHP Namespacing</a></li><br><li>JSON</li><br></ul><br><h2>איך להתקין Composer ב – Windows</h2><br><h3>שלב א' – PHP במסוף</h3><br><p>אם כבר התקנתם PHP במסוף, אתם יכולים לדלג לשלב הבא.<br /><br>לא יודעים אם התקנתם? היכנסו למסוף (Command Prompt) והריצו את הפקודה הבאה:</p><br><p><code>php -v</code></p><br><p>אם גרסת ה – PHP שמותקנת הודפסה, מזל טוב! אתם יכולים לדלג על שלב א' ולעבור היישר לשלב ב'.<br /><br>קיבלתם הודעת שגיאה? אל ייאוש! המשיכו לביצוע שלב א' ולפני שתשימו לב, גם אתם תוכלו להריץ PHP במסוף.<br /><br>חשוב לי להתעכב על השלב הזה אף-על-פי שהוא לא חובה בשביל להתקין Composer, כי הרצת PHP במסוף היא דרך מהירה ונכונה לבצע בדיקות והרצות של סקריפטים,<br /><br>ואין סיבה שלא תהפכו את האפשרות הזו לזמינה עבורכם. ההתקנה ממש פשוטה – בואו נעשה את זה <img src="https://s.w.org/images/core/emoji/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p><br><p>קודם כל, עלינו לאתר את התיקייה שבה PHP מותקנת.<br /><br>אם אתם לא יודעים, הדרך הפשוטה ביותר היא ליצור קובץ (השם לא משנה) בשרת המקומי שיכיל:</p><pre class="crayon-plain-tag"><?php phpinfo(); ?></pre><p>כעת, הריצו את הקובץ בדפדפן וחפשו את המחרוזת הבאה: <code>Loaded Configuration File</code>:</p><br><p><img class="aligncenter wp-image-1272 size-full" src="http://masterscripter.co.il/wp-content/uploads/2017/04/lcf.jpg" alt="phpinfo loaded configuration file" width="600" height="536" srcset="http://masterscripter.co.il/wp-content/uploads/2017/04/lcf.jpg 600w, <a href="http://masterscripter.co.il/wp-content/uploads/2017/04/lcf-300x268.jpg" title="http://masterscripter.co.il/wp-content/uploads/2017/04/lcf-300x268.jpg" rel="external">http://masterscripter.co.il/wp-conten ... s/2017/04/lcf-300x268.jpg</a> 300w" sizes="(max-width: 600px) 100vw, 600px" /><br /><br>העתיקו את הנתיב ללא <code>php.ini</code>.</p><br><p>כשאתם מחומשים בנתיב התקנת ה – PHP, היכנסו ללוח הבקרה (Control Panel) > מערכת (System) > הגדרות מערכת מתקדמות (Advanced system settings) > משתני סביבה (Environment Variables):</p><br><p><img class="aligncenter size-full wp-image-1273" src="http://masterscripter.co.il/wp-content/uploads/2017/04/cp.jpg" alt="משתני סביבה בפאנל ניהול" width="680" height="342" srcset="http://masterscripter.co.il/wp-content/uploads/2017/04/cp.jpg 680w, <a href="http://masterscripter.co.il/wp-content/uploads/2017/04/cp-300x151.jpg" title="http://masterscripter.co.il/wp-content/uploads/2017/04/cp-300x151.jpg" rel="external">http://masterscripter.co.il/wp-conten ... ds/2017/04/cp-300x151.jpg</a> 300w" sizes="(max-width: 680px) 100vw, 680px" /></p><br><p>החלון שנפתח מציגים בפניכם את כל משתני הסביבה של המערכת, מחולקים למשתני סביבה ספציפיים למשתמש ומשתני סביבה גלובליים.<br /><br>אם אתם מעוניינים להתקין PHP במסוף רק עבור המשתמש הספציפי איתו אתם מחוברים, חפשו את המשנה <code>Path</code> בחלק העליון:<br /><br><img class="aligncenter size-full wp-image-1275" src="http://masterscripter.co.il/wp-content/uploads/2017/04/userpath.jpg" alt="User Path" width="617" height="291" srcset="http://masterscripter.co.il/wp-content/uploads/2017/04/userpath.jpg 617w, <a href="http://masterscripter.co.il/wp-content/uploads/2017/04/userpath-300x141.jpg" title="http://masterscripter.co.il/wp-content/uploads/2017/04/userpath-300x141.jpg" rel="external">http://masterscripter.co.il/wp-conten ... 7/04/userpath-300x141.jpg</a> 300w" sizes="(max-width: 617px) 100vw, 617px" /></p><br><p>אם אתם מעוניינים להתקין PHP במסוף עבור כל המשתמשים, חפשו את המשתנה Path בחלק התחתון:</p><br><p><img class="aligncenter size-full wp-image-1274" src="http://masterscripter.co.il/wp-content/uploads/2017/04/systempath.jpg" alt="System Path" width="617" height="291" srcset="http://masterscripter.co.il/wp-content/uploads/2017/04/systempath.jpg 617w, <a href="http://masterscripter.co.il/wp-content/uploads/2017/04/systempath-300x141.jpg" title="http://masterscripter.co.il/wp-content/uploads/2017/04/systempath-300x141.jpg" rel="external">http://masterscripter.co.il/wp-conten ... 04/systempath-300x141.jpg</a> 300w" sizes="(max-width: 617px) 100vw, 617px" /></p><br><p>סמנו את המשתנה ולחצו על עריכה (Edit) ובמסך שנפתח, לחצו על הכפתור "חדש" (New) והדביקו את נתיב ההתקנה של PHP:</p><br><p><img class="aligncenter size-full wp-image-1276" src="http://masterscripter.co.il/wp-content/uploads/2017/04/ev.jpg" alt="הוספת PHP למשתנה הסביבה PATH" width="527" height="507" srcset="http://masterscripter.co.il/wp-content/uploads/2017/04/ev.jpg 527w, <a href="http://masterscripter.co.il/wp-content/uploads/2017/04/ev-300x289.jpg" title="http://masterscripter.co.il/wp-content/uploads/2017/04/ev-300x289.jpg" rel="external">http://masterscripter.co.il/wp-conten ... ds/2017/04/ev-300x289.jpg</a> 300w" sizes="(max-width: 527px) 100vw, 527px" /></p><br><p>כמאמר השיר של סטטיק ובנאל תבורי – לחצו OK OK OK ו… שימו PHP!<br /><br>בחלק ממערכות ההפעלה תצטרכו לבצע הפעלה מחדש בטרם השינויים יכנסו לתוקף ובכל מקרה עליכם לפתוח חלון מסוף חדש.<br /><br>הקלידו בו את הפקודה מתחילת השלב:</p><br><p><code>php -v</code></p><br><p>ועכשיו, אתם אמורים לראות מול עיניכם את גרסת ה – PHP שמותקנת על מחשבכם. בשעה טובה ומוצלחת – יש PHP במסוף!</p><br><h3>שלב ב' – התקנת Composer</h3><br><h4>התקנה באמצעות אשף</h4><br><p>הדרך הפשוטה ביותר היא להוריד את קובץ ההתקנה <a href="https://getcomposer.org/download/" target="_blank">כאן</a> ולהתקין באמצעות ממשק התקנה ווינדוסי-טיפוסי.<br /><br>ההתקנה מבצעת עבורכם שתי פעולות:</p><br><ol><br><li>מתקינה את הכלי</li><br><li>מוסיפה אותו ל – PATH ככה שתוכלו להשתמש בו גלובלית</li><br></ol><br><p>יש לסגור את המסוף ולפתוח אותו מחדש בסיום ההתקנה.</p><br><p>סיימתם? אתם יכולים לעבור למדריך!</p><br><h4>התקנה ידנית</h4><br><p>אפשרות נוספת היא להתקין באופן ידני את הכלי.<br /><br>כדי לבצע התקנה ידנית, עליכם לבצע את שלב א' (התקנת PHP במסוף).<br /><br>האפשרות הראשונה עדיפה עבור רוב המשתמשים, במיוחד אם אין לכם ידע בסיסי במשתני מערכת ושימוש במסוף.</p><br><p>פתחו את המסוף ונווטו לתיקייה שבה תרצו להתקין את הכלי, לדוגמה בנתיב הבא:</p><br><p><code>C:\bin</code></p><br><p>והכניסו את ארבע הפקודות הבאות (לפי הסדר):</p><pre class="crayon-plain-tag">php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"<br>php -r "if (hash_file('SHA384', 'composer-setup.php') === '669656bab3166a7aff8a7506b8cb2d1c292f042046c5a994c43155c0be6190fa0355160742ab2e1c88d40d5be660b410') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"<br>php composer-setup.php<br>php -r "unlink('composer-setup.php');"</pre><p>הסבר קצר לגבי הפקודות:</p><br><ol><br><li>מורידה את סקריפט ההתקנה של הכלי</li><br><li>מאמתת את קובץ ההתקנה</li><br><li>מריצה את קובץ ההתקנה ומורידה את הקובץ composer.phar</li><br><li>מוחקת את קובץ ההתקנה (<code>composer-setup.php</code>)</li><br></ol><br><p>כעת צרו קובץ <code>composer.bat</code> באמצעות הרצת השורה הבאה:</p><br><p><code>C:\bin>echo @php "%~dp0composer.phar" %*>composer.bat</code></p><br><p>עכשיו חזרו על שלב א', רק שבמקום להוסיף את ההתקנה של PHP ל – PATH, הוסיפו את ההתקנה של Composer.</p><br><p>לא משנה באיזו דרך בחרתם, אם הגעתם עד הלום – הכלי אמור להיות זמין לשימוש. בואו נבדוק:</p><br><p>הריצו במסוף את הפקודה הבאה, שמדפיסה את הגרסה המותקנת:</p><br><p><code>composer -V</code></p><br><p>אם מוצגת למול עיניכם גרסת ה – Composer שברשותכם, טפחו לעצמכם קלות על השכם – שרדתם את התקנת הכלי! כפיים!</p><br><h2>מדריך התקנה ב – Linux / Unix / OSX</h2><br><h3>שלב א' – התקנת Composer</h3><br><p>הריצו את ארבע הפקודות הבאות במסוף:</p><pre class="crayon-plain-tag">php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"<br>php -r "if (hash_file('SHA384', 'composer-setup.php') === '669656bab3166a7aff8a7506b8cb2d1c292f042046c5a994c43155c0be6190fa0355160742ab2e1c88d40d5be660b410') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"<br>php composer-setup.php<br>php -r "unlink('composer-setup.php');"</pre><p>הסבר על הפקודות אפשר לקבל בשלב ב' של מדריך ההתקנה למשתמשי ווינדוס.<br /><br>בקצרה – הפקודות מריצות סקריפט התקנה שמוריד קובץ בשם <code>composer.phar</code>.</p><br><h3>שלב ב' – הזזת <code>composer.phar</code> ל PATH</h3><br><p>עכשיו אנחנו רוצים להזיז את הקובץ הזה לתיקייה שנמצאת בנתיב המערכת (PATH). לשם כך נריץ את הפקודה הבאה:</p><br><p><code>mv composer.phar /usr/local/bin/composer</code></p><br><ul><br><li>אם התקבלה שגיאת הרשאות, השתמשו ב <code>sudo</code></li><br><li>אם התיקייה <code>/usr</code> לא קיימת, צרו אותה:<br /><br><code>mkdir -p /usr/local/bin</code></li><br><li><a href="https://superuser.com/questions/488173/how-can-i-edit-the-path-on-linux" target="_blank">איך לשנות את ה – PATH</a></li><br></ul><br><p>כמובן שאתם יכולים למקם את הקובץ בכל תיקייה שהיא, כל עוד התיקייה נמצאת בנתיב המערכת.</p><br><p>כדי לבדוק האם צלחתם את ההתקנה, הריצו במסוף את הפקודה הבאה:</p><br><p><code>composer -V</code></p><br><p>אם מוצגת למול עיניכם גרסת ה – Composer שברשותכם, דעו שהצלחתם <img src="https://s.w.org/images/core/emoji/72x72/1f60e.png" alt="😎" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p><br><h2>מוכנים? בואו נלחין קצת PHP עם Composer!</h2><br><p>ממש תכף, נבנה פרוייקט קטנטן שעושה שימוש בכלי, אבל לפני שאנחנו מריצים שורות, אני רוצה ללמד אתכם את הבסיס:</p><br><h3>composer.json</h3><br><p>כאמור, Composer הוא כלי לניהול תלויות <strong>בפרוייקט</strong>.<br /><br>כשנרצה להשתמש בכלי בפרוייקט מסויים, ניצור קובץ <code>composer.json</code> בתיקייה הראשית של הפרוייקט.</p><br><p><code>composer.json</code> הוא קובץ ההגדרות שלפיו הכלי פועל ועבור כל פרוייקט ניצור קובץ הגדרות חדש.<br /><br>שימו לב ש – JSON, בניגוד ל – PHP, רגיש לפסיקים מיותרים וסוגי נתונים לא נכונים (אם JSON יצפה לערך בוליאני ונזין <code>"true"</code>, נקבל שגיאה).</p><br><p>כל קובץ <code>composer.json</code> יכיל עצם אחד בלבד שיתאר את הפרוייקט:</p><pre class="crayon-plain-tag">{}</pre><p>המידע היחיד שאנחנו חייבים להעביר לעצם הוא רשימת החבילות שהפרוייקט דורש, או אם להשתמש במינוח נכון יותר: רשימת התלויות של הפרוייקט, באמצעות התכונה <code>require</code>:</p><pre class="crayon-plain-tag">{<br> "require": {<br> <br> }<br>}</pre><p>כמו שאתם יכולים לראות, <code>require</code> היא עצם שבתוכו נפרט על התלויות של הפרוייקט:</p><pre class="crayon-plain-tag">{<br> "require": {<br> "vendor-name/package-name": "version"<br> }<br>}</pre><p>שם התכונה (<code>vendor-name/package-name</code>) מכיל את החבילה שבה אנחנו רוצים להשתמש וערך התכונה מכיל הגבלות גרסה.<br /><br>שימו לב שכדי לייבא חבילה, עלינו "לגלות" ל – Composer גם מי הוא המפיץ (vendor) וגם מה שם החבילה (package-name).<br /><br>מעבר לרשימת התלויות (<code>require</code>), יש עוד הרבה מאד מידע שאפשר להעביר לעצם, כמו תלויות לפיתוח (<code>require-dev</code>), טעינה אוטומטית (<code>autoload</code>) ועודהגדרות שעליהן ארחיב במאמר נפרד.</p><br><p>* בסוף המדריך רשמתי CHEATSHEET עם מספר פקודות-מסוף נפוצות, כולל פקודה לייבוא חבילה.</p><br><h3>חבילה? על שום מה ולמה?</h3><br><p>חבילה (package) מאגדת תחתיה קוד PHP לשימוש חוזר.<br /><br>חבילה יכולה להכיל מספר רב של מחלקות, אבל יכולה להכיל מצד שני רק ממשק אחד, אין באמת תנאי סף ליצירת חבילה, כל עוד היא משיגה את המטרה שלשמה היא נבנתה.</p><br><p>כל חבילה היא פרוייקט Composer ומכילה קובץ <code>composer.json</code> ובו רשימת תלויות לצד מידע נוסף: שם החבילה, יוצר, גרסה, תלויות ועוד.<br /><br>כאמור, יש ארבעה סוגי חבילות:</p><br><h4>ספריה</h4><br><p>ברירת מחדל.<br /><br>כאשר דורשים חבילה מסוג ספריה, כל קבצי החבילה מועתקים לפרוייקט קיים.</p><br><h4>פרוייקט</h4><br><p>חבילה שיוצרת פרוייקט חדש.<br /><br>דוגמה לחבילות כאלה: Symphony, SilverStripe, Laravel ועוד</p><br><h4>מטא</h4><br><p>חבילה ריקה שמכילה רשימת תלויות.</p><br><h4>פלאגין</h4><br><p>חבילה שמספקת אשף התקנה לחבילה עם סוג מותאם אישית</p><br><h4></h4><br><p>Composer מאפשר לנו ליצור גם סוג חבילה מותאם-אישית, אבל זה כבר נושא למתקדמים.<br /><br>בכל מקרה חשוב שתדעו שלפחות במאמר הזה, נתמקד בסוג הראשון – ספריה בלבד.</p><br><p>ALRIGHT! עברנו על כל המידע שצריך כדי להתחיל להשתמש ב – Composer. אבל רגע, מאיפה בעצם החבילות האלה מגיעות?!</p><br><h3>Packagist: מאגר חבילות PHP</h3><br><p><a href="https://packagist.org/" target="_blank">Packagist</a> הוא מאגר חבילות PHP ל – Composer.<br /><br>אלא אם הוגדר אחרת, כשנייבא חבילה לפרוייקט היא תגיע מ – Packagist.</p><br><p>כל אחד יכול לשלוח חבילות למאגר ופה טמון הכוח שבו – 136,965 חבילות (נכון לכתיבת המאמר, ככל הנראה בפועל המספר גבוה יותר) וסדר גודל של 12 מיליון חבילות מותקנות בחודש הופכים אותו למאגר החבילות הפופולרי ביותר, אבל לא היחיד: כל אחד יכול להקים מאגר פרטי / ציבורי של חבילות, אבל זה כבר נושא מתקדם שאני מבטיח לכתוב עליו!</p><br><p>האתר עצמו מכיל מנוע חיפוש שבאמצעותו אתם יכולים לחפש חבילות. נשתמש במאגר בשביל הפרוייקט הלימודי שלנו.</p><br><h2>PasswordApi</h2><br><p><code>PasswordAPI</code> הינו ממשק קטנטן שמאפשר לחולל סיסמאות ומחזיר אותן באחד ממבני הנתונים הבאים: <code>JSON</code>, <code>XML</code> או טקסט רגיל.</p><br><p>ישנם שני סוגי סיסמה:</p><br><ul><br><li>לא-קריאה: מורכבת מרצף תווים חסר משמעות</li><br><li>קריאה: מורכבת ממילים</li><br></ul><br><p>עבור סיסמה לא-קריאה, המשתמש יכול להחליט:</p><br><ul><br><li>מה יהיה אורך הסיסמה</li><br><li>האם תכיל תווים מיוחדים</li><br><li>האם תכיל אותיות קטנות</li><br><li>האם תכיל אותיות גדולות</li><br><li>האם תכיל מספרים</li><br></ul><br><p>עבור סיסמה קריאה, המשתמש יכול להחליט:</p><br><ul><br><li>מה יהיה אורך הסיסמה</li><br></ul><br><p>בנוסף, המשתמש יכול לקבוע כמה סיסמאות הוא רוצה לחולל וכמובן באיזה פורמט הוא מעוניין לקבל אותן.</p><br><p>לפני שאני מתחיל לפתח, אני אוהב לרשום בצורה מסודרת בדיוק מה אני צריך לעשות:</p><br><h4>computer</h4><br><p>מחוללת סיסמה לא-קריאה.</p><br><ul><br><li><strong>שיטת בקשה</strong>: GET</li><br><li><strong>נתיב:</strong> <code>/computer</code></li><br><li><strong>פרמטרים</strong><strong>:</strong><br><ul><br><li>passwordLength (מספר, ברירת מחדל: <code>8</code>)</li><br><li>specialChars (בוליאני, ברירת מחדל: <code>false</code>)</li><br><li>lowerCase (בוליאני, ברירת מחדל: <code>true</code>)</li><br><li>upperCase (בוליאני, ברירת מחדל:<code>true</code>)</li><br><li>numbers (בוליאני, ברירת מחדל: <code>true</code>)</li><br><li>count (בוליאני, ברירת מחדל: <code>1</code>)</li><br><li>returnType (מחרוזת, ברירת מחדל: <code>JSON</code>, אפשרויות: <code>JSON</code>, <code>XML</code>, <code>TEXT</code>)</li><br></ul><br></li><br></ul><br><h4>human</h4><br><p>מחוללת סיסמה קריאה.</p><br><ul><br><li><strong>שיטת בקשה:</strong> GET</li><br><li><strong>נתיב:</strong> <code>/human</code></li><br><li><strong>פרמטרים:</strong><br><ul><br><li>passwordLength (מספר, ברירת מחדל: <code>13</code>)</li><br><li>count (מספר, ברירת מחדל: <code>1</code>)</li><br><li>returnType (מחרוזת, ברירת מחדל: <code>JSON</code>, אפשרויות: <code>JSON</code>, <code>XML</code>, <code>TEXT</code>)</li><br></ul><br></li><br></ul><br><p>כמו שאתם שמים לב, הממשק מאד פשוט ומכיל רק שתי קריאות אפשריות.</p><br><p>נפתח תיקייה חדשה עבור הפרוייקט בשרת המקומי שתכיל, כרגע, רק את הקובץ <code>composer.json</code>.<br /><br>בתוך הקובץ ניצור עצם JSON ריק: <code>{}</code>.</p><br><p>הממשק שאנחנו בונים צריך לחולל סיסמאות רנדומליות. במקום לכתוב בעצמנו מחלקה שתעשה את זה, בואו נבדוק אם יש חבילה שיכולה לעשות את העבודה השחורה בשבילנו:</p><br><p>ניגש ל – Packagist.org ונחפש את המחרוזת <span style="font-family: monospace;"><code>password</code></span><br /><br>אתרו את החבילה <a href="https://packagist.org/packages/hackzilla/password-generator" target="_blank"><code>hackzilla/password-generator</code></a> ולחצו עליה כדי לפתוח את מסך החבילה שמכיל מידע על החבילה: שם, תיאור, גרסאות ותלויות;<br /><br>בואו נתעכב על התלויות:</p><br><p>בתחילת המדריך הסברתי ש – Composer הוא כלי לניהול תלויות בפרוייקט.<br /><br>כל חבילה נחשבת לפרוייקט כלומר – כל חבילה מכילה קובץ <code>composer.json</code> רשימת תלויות לצד פרטים נוספים (שם החבילה, מי עומד מאחוריה, גרסה ועוד)<br /><br>החבילה <code>hackzilla/password-generator</code> למשל, תלויה רק בגרסה 5.3.2 ומעלה של PHP.<br /><br>ממש תכף נסתכל על חבילה שתלויה בחבילות אחרות.</p><br><p>בקובץ <code>composer.json</code>, נוסיף את התכונה <code>require</code> ובתוכה את החבילה:</p><pre class="crayon-plain-tag">{<br> "require": {<br> "hackzilla/password-generator": "1.3.*"<br> }<br>}</pre><p>ככל הנראה, אתם שואלים את עצמכם שתי שאלות כרגע:</p><br><h3>איך אני אמור לדעת להשתמש בחבילות?</h3><br><p>בכל דף חבילה תוכלו לגלול ולמצוא בתחתית העמוד הסבר שימוש.<br /><br>בנוסף, בתפריט הצד יש קישור לעמוד החבילה ב – GitHub, שם לרוב ניתן למצוא תיעוד מלא, אם כי לעיתים לא-כל-כך נדירות תמצאו שחבילה חסרה תיעוד איכותי.</p><br><h3>למה, למען השם, יש כוכבית בגרסת החבילה?!</h3><br><p>שאלה מעולה! <img src="https://s.w.org/images/core/emoji/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p><br><p>Composer מאפשר לנו לכתוב מגבלות גרסה או במילים פשוטות יותר: חוקים שידריכו אותו איזו גרסה להוריד.<br /><br>ישנן ארבע מגבלות בסיסיות:</p><br><h4>גרסה מדוייקת</h4><br><p>נגדיר את הגרסה המדוייקת בה נרצה להשתמש:</p><pre class="crayon-plain-tag">{<br> "require": {<br> "vendor/package": "1.0.0"<br> }<br>}</pre><p></p><br><h4>טווח לוגי</h4><br><p>נגדיר טווח גרסאות באמצעות אופרטורים:</p><pre class="crayon-plain-tag">{<br> "require": {<br> "vendor/package": ">=1.0"<br> }<br>}</pre><p>גם קשרים לוגיים באים בחשבון:</p><br><ul><br><li><strong>או (OR):</strong><code>||</code></li><br><li><strong>וגם (AND):</strong> <code> </code> (רווח) או <code>,</code> (פסיק)</li><br></ul><br><p></p><pre class="crayon-plain-tag">{<br> "require": {<br> "vendor/package": ">=1.0 < 1.2"<br> }<br>}</pre><p></p><pre class="crayon-plain-tag">{<br> "require": {<br> "vendor/package": "> 1.0,<1.3 || <= 1.5"<br> }<br>}</pre><p></p><br><h4>טווח רגיל</h4><br><p>אפשר גם להגדיר טווח עם מקף <code>-</code>:</p><pre class="crayon-plain-tag">{<br> "require": {<br> "vendor/package": "1.0 - 2.0"<br> }<br>}</pre><p></p><br><h4>Wildcard</h4><br><p>נוכל להגדיר תבנית גרסה.<br /><br>למשל, אם נרצה להשתמש בגרסה הכי חדשה של החבילה, אבל להישאר בדומיין של גרסה 2.0, נשתמש באופרטור <code>*</code>:</p><pre class="crayon-plain-tag">{<br> "require": {<br> "vendor/package": "2.0.*"<br> }<br>}</pre><p></p><br><h4>טילדה</h4><br><p>למי שלא יודע, הסימן <code>~</code> נקרא בעברית.. טילדה!<br /><br>השימוש העיקרי בטילדה הוא לחבילות שאוכפות <a href="http://semver.org/lang/he/" target="_blank">גרסאות סמנטיות</a>, ככה שאם אין לכם מושג על מה מדובר, יהיה לכם קשה להבין מה הכוונה ולמה הטילדה קיימת.<br /><br>נשתמש בו כדי להגדיר מהי גרסת המינימום בה אנחנו מוכנים להשתמש ובו זמנית להגדיר שאנחנו רוצים להישאר בדומיין של הגרסה המשנית (המספר השני). מה הכוונה? אסביר באמצעות דוגמה:</p><pre class="crayon-plain-tag">{<br> "require": {<br> "vendor/package": "~3.1.1"<br> }<br>}</pre><p>יכולנו להשיג אותה תוצאה על-ידי שימוש בטווח לוגי: <code>>=3.1.0 <3.2.0</code></p><br><h4>קארט</h4><br><p>קארט <code>^</code> דומה מאד בהתנהגות שלו לטילדה, אבל גמיש יותר: הוא מורה לסקריפט ההתקנה להישאר בדומיין של הגרסה הראשית, אך מאפשר לו להוריד גרסה משנית גבוהה יותר:</p><pre class="crayon-plain-tag">{<br> "require": {<br> "vendor/package": "^2.2.3"<br> }<br>}</pre><p>הגמישות של הקארט מתאימה יותר לגרסה 2.0.0 של גרסאות סמנטיות והשימוש בו רווח יותר מאשר בטילדה.</p><br><h4>הגבלות נוספות</h4><br><p>מעבר לשש ההגבלות שציינתי, יש עוד מספר דרכים בהן ניתן <a href="https://getcomposer.org/doc/articles/versions.md#writing-basic-version-constraints" target="_blank">להגביל את גרסת החבילה</a>.</p><br><p>בחזרה לממשק:</p><br><p>מצאנו את החבילה שתחולל עבורנו סיסמאות בקלות ובנוחות. השלב הבא הוא לקבל בקשות ולהחזיר תשובות – כלומר לבנות ראוטר.<br /><br>בשביל המדריך אשתמש ב – Slim Framework, סביבת פיתוח קלה להתמודדות עם הודעות HTTP.</p><br><p>אתרו את החבילה במנוע החיפוש של packagist; שימו לב שבניגוד לחבילה הראשונה, <a href="https://packagist.org/packages/slim/slim" target="_blank">Slim</a> כן תלויה בחבילות נוספות:</p><br><p><img class="aligncenter size-full wp-image-1293" src="http://masterscripter.co.il/wp-content/uploads/2017/04/slimrequire.jpg" alt="slim requires" width="261" height="172" /></p><br><p>האם זה אומר שעלינו לציין את כל החבילות האלה בקובץ ההגדרות שלנו? תכף נגלה:<br /><br>כמו שעשינו עם <code>hackzilla/password-generator</code>, נוסיף גם את החבילה הזו לרשימת התלויות שלנו בקובץ <code>composer.json</code>:</p><pre class="crayon-plain-tag">{<br> "require": {<br> "hackzilla/password-generator": "1.3.*",<br> "slim/slim": "~3.8.1"<br> }<br>}</pre><p></p><br><h3>התקנת החבילות</h3><br><p>פתחו את המסוף, נווטו לתיקיית הפרוייקט והריצו את הפקודה הבאה:</p><br><p><code>composer install</code></p><br><p>וכאן הקסם מתחיל לקרות: הפקודה <code>install</code> מתקינה את כל התלויות של הפרוייקט:</p><br><figure id="attachment_1292" style="width: 622px" class="wp-caption aligncenter"><img class="wp-image-1292 size-full" src="http://masterscripter.co.il/wp-content/uploads/2017/04/composerinstall.jpg" alt="composer install" width="622" height="231" srcset="http://masterscripter.co.il/wp-content/uploads/2017/04/composerinstall.jpg 622w, <a href="http://masterscripter.co.il/wp-content/uploads/2017/04/composerinstall-300x111.jpg" title="http://masterscripter.co.il/wp-content/uploads/2017/04/composerinstall-300x111.jpg" rel="external">http://masterscripter.co.il/wp-conten ... mposerinstall-300x111.jpg</a> 300w" sizes="(max-width: 622px) 100vw, 622px" /><figcaption class="wp-caption-text">(אם אצלכם המסך נראה קצת שונה ומופיעות הודעות 'Downloading' זה בסדר – מכיוון שהתקנתי בעבר את הספריות הללו, הן נטענות מהמטמון)</figcaption></figure><br><p>הכלי יודע להתקין את כל התלויות, גם אלה של החבילות, מבלי שנצטרך לציין אותן מפורשות. דיי מגניב, לא?<br /><br>אם תציצו בתיקיית הפרוייקט, תוכלו לראות שנוספה תיקייה חדשה בשם <code>vendor</code> שמכילה את כל התלויות של הפרוייקט לצד קובץ <code>autoload.php</code>.</p><br><h3>איך להשתמש בחבילות</h3><br><p>צרו קובץ חדש בשם <code>index.php</code> בתיקיה הראשית של הפרוייקט.<br /><br>חשוב לי להבהיר, שבעולם האמיתי ככל הנראה לא היינו בונים ממשק בצורה כזו – בקובץ אחד בו הכל מרוכז; בשביל שהדברים יהיו פשוטים וקלים לביצוע ככל האפשר, במדריך הזה כן נרכז את הקוד תחת <code>index.php</code>.<br /><br>כדי להשתמש בחבילות עלינו לטעון את הקובץ <code>autoload.php</code> שנמצא בתיקייה <code>vendor</code>:</p><pre class="crayon-plain-tag"><?php<br><br>require('./vendor/autoload.php');</pre><p>הקובץ הזה מבצע טעינה אוטומטית של כל החבילות שבהן נעשה שימוש בפרוייקט.<br /><br>במאמר הזה אני לא אסביר איך מתבצעת טעינה אוטומטית, אבל אם אין לכם סבלנות לחכות שאכתוב על כך (ואני אכתוב), אתם יכולים לקרוא על טעינה אוטומטית ב – Composer <a href="https://getcomposer.org/doc/04-schema.md#autoload" target="_blank">כאן</a>.</p><br><p>עכשיו כשכל החבילות זמינות לשימוש, בואו נכתוב קצת PHP איתן, כדי שתדעו שאני לא עובד עליכם!</p><br><p>מחולל הסיסמה יעבוד לפי ארבעת השלבים הבאים:</p><br><ol><br><li>מתקבלת בקשת <code>GET</code> לסיסמה לא-קריאה (<code>/computer</code>) או לסיסמה קריאה (<code>/human</code>)</li><br><li>נעשית בדיקה האם התקבלו פרמטרים שונים מברירת המחדל</li><br><li>יצירת הסיסמאות</li><br><li>הסיסמאות מוחזרות בפורמט המתאים</li><br></ol><br><h4>'תפיסת' בקשות <code>GET</code> מתאימות (סיסמה קריאה / לא קריאה)</h4><br><p></p><pre class="crayon-plain-tag"><?php<br><br>require('./vendor/autoload.php');<br><br>$app = new \Slim\App;</pre><p>ונגדיר את הראוטר שלנו על-פי טבלת הפעולות הזמינות:</p><pre class="crayon-plain-tag"><?php<br><br>require('./vendor/autoload.php');<br><br>$app = new \Slim\App;<br><br>$app->get('/computer', function($request, $response, $args) {<br> <br>});<br><br>$app->get('/human', function($request, $response, $args) {<br> <br>});</pre><p>הפונקציה <code>get</code> מקבלת שני פרמטרים:</p><br><ol><br><li>נתיב</li><br><li>פונקציה שתבוצע כאשר התקבלה בקשת <code>GET</code> לנתיב שצוין</li><br></ol><br><p>גם הפונקציה האנונימית שתבוצע בעת בקשת <code>GET</code> מתאימה מקבלת שלושה פרמטרים:</p><br><ol><br><li>מופע שמתאר את בקשת ה – HTTP שהתקבלה</li><br><li>מופע שמתאר את התשובה שנחזיר</li><br><li>ארגומנטים שהתקבלו עם הבקשה</li><br></ol><br><h4>השוואת פרמטרים לברירת המחדל</h4><br><p>בשלב השני נגדיר פונקציית עזר שמשווה בין ברירת המחדל לפרמטרים שהתקבלו:</p><pre class="crayon-plain-tag">function compareSettings($settings, $args) {<br> foreach($args as $key => $val) {<br> if(isset($settings[$key]) && $val != $settings[$key])<br> $settings[$key] = $val;<br> }<br><br> return $settings;<br>}</pre><p></p><br><h4>יצירת הסיסמאות</h4><br><p>אם נסתכל בתיעוד של <code>hackzilla/password-generator</code> נוכל למצוא שתי מחלקות שמתאימות בדיוק למה שאנחנו צריכים: <code>computerPasswordGenerator</code> ו – <code>humanPasswordGenerator</code>.</p><br><p><code>computerPasswordGenerator</code> ישמש אותנו ליצירת סיסמה חסרת-משמעות:</p><pre class="crayon-plain-tag">$app->get('/computer', function($request, $response, $args) {<br> $generator = new Hackzilla\PasswordGenerator\Generator\ComputerPasswordGenerator;<br><br> $defaults = [<br> 'passwordLength' => 13,<br> 'specialChars' => false,<br> 'lowerCase' => true,<br> 'upperCase' => true,<br> 'numbers' => true,<br> 'count' => 1,<br> 'returnType' => 'JSON'<br> ];<br><br> $config = compareSettings($defaults, $request->getQueryParams());<br><br> $generator<br> ->setLength((int)$config['passwordLength'])<br> ->setSymbols((bool)$config['specialChars'])<br> ->setLowercase((bool)$config['lowerCase'])<br> ->setUppercase((bool)$config['upperCase'])<br> ->setNumbers((bool)$config['numbers']);<br><br> $passwords = $generator->generatePasswords((int)$config['count']);<br>});</pre><p></p><br><ul><br><li><code>$request->getQueryParams()</code> מחזירה מערך של פרמטרי Query string</li><br></ul><br><p><code>humanPasswordGenerator</code> ישמש אותנו ליצירת סיסמה שמורכבת ממילים:</p><pre class="crayon-plain-tag">$app->get('/human', function($request, $response, $args) {<br> $generator = new Hackzilla\PasswordGenerator\Generator\HumanPasswordGenerator;<br><br> $defaults = [<br> 'passwordLength' => 12,<br> 'count' => 1<br> ];<br><br> $config = compareSettings($defaults, $request->getQueryParams());<br><br> $generator<br> ->SetWordList('./words.txt')<br> ->setWordSeparator('');<br> ->setLength((int)$config['passwordLength']);<br><br> $passwords = $generator->generatePasswords((int)$config['count']);<br>});</pre><p>לצערי, התיעוד של החבילה <code>hackzilla/password-generator</code> לוקה בחסר, מה שעלול לקרות מידי פעם.<br /><br>במקרים כאלה יש לנו שתי אפשרויות:</p><br><ol><br><li>GOOGLE IT</li><br><li>להיכנס לקבצי המקור ולהבין מה קורה שם</li><br></ol><br><p>בשביל לחולל סיסמה שמורכבת ממילים, אנחנו צריכים ליצור קובץ אוצר מילים.<br /><br>כדי להבין איך הקובץ, שאותו נעביר לפונקציה <code>setWordList</code> צריך להראות, נכנסתי לקבצי המקור וגיליתי שכל מילה צריכה להתחיל בשורה חדשה.<br /><br>אתם יכולים או ליצור בעצמכם קובץ מילים, או להוריד אחד כזה <a href="https://github.com/dwyl/english-words" target="_blank">כאן</a>; בכל מקרה את הקובץ מקמו בתיקייה הראשית של הפרוייקט.</p><br><h4>החזרת הסיסמאות במבנה הנתונים המתאים</h4><br><p>הדבר האחרון שנשאר לנו לעשות הוא להחזיר את הסיסמאות בפורמט המתאים – כלומר <code>JSON</code> או <code>XML</code> או <code>TEXT</code>.<br /><br>הממ.. למישהו יש רעיון איך נעשה את זה? אפשר לכתוב מחלקה שתעשה את זה בשבילנו, אבל למה אנחנו לומדים Composer? בואו נחפש חבילה כזאת <img src="https://s.w.org/images/core/emoji/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p><br><p>אחרי חיפוש קצר, מצאתי את החבילה <a href="https://packagist.org/packages/jms/serializer" target="_blank"><code>jms/serializer</code></a> שבצירוף מקרים מדהים תומכת בשלושת סוגי הנתונים שהממשק שלנו מחזיר!<br /><br>הוסיפו את החבילה לקובץ ההגדרות:</p><pre class="crayon-plain-tag">{<br> "require": {<br> "hackzilla/password-generator": "1.3.0",<br> "slim/slim": "~3.8.1",<br> "jms/serializer": "^1.6.2"<br> }<br>}</pre><p>והריצו את הפקודה: <code>composer install</code></p><br><p>אם מילאתם אחר הוראות המדריך כראוי, קיבלתם את ההודעה הבאה:</p><br><blockquote class="ltr"><p>Loading composer repositories with package information<br /><br>Installing dependencies (including require-dev) from lock file<br /><br><strong>Warning: The lock file is not up to date with the latest changes in composer.json. You may be getting outdated dependencies. Run update to update them.</strong><br /><br>Nothing to install or update<br /><br>Generating autoload files</p></blockquote><br><p>ההודעה הזו נותנת לנו שלוש פיסות אינפורמציה:</p><br><ol><br><li>בניגוד לפעם הקודמת בה הרצנו את הפקודה <code>composer install</code>, הפעם הכלי מתקין את התלויות שנמצאות ב'lock file'</li><br><li>אזהרה שה – 'lock file' שלנו לא מעודכן!</li><br><li>יש להריץ את הפקודה <code>update</code></li><br></ol><br><p>אבל רגע, מה זה בכלל ה – 'lock file' הזה?</p><br><h4>composer.lock</h4><br><p>את התלויות של הפרוייקט ומידע נוסף אנחנו מגדירים בקובץ <code>composer.json</code>. כאשר אנחנו קוראים לפקודה <code>composer install</code> בפעם הראשונה, נוצר קובץ נוסף שאולי שמתם לב אליו בשם <code>composer.lock</code> שהוא בעצם ה – 'lock file' המפורסם מהפסקה הקודמת.<br /><br>קובץ המנעול 'נועל' את האפליקציה למצב מסויים ומציין באופן מפורש את החבילות בהן נעשה שימוש כולל גרסה מלאה, מקור ועוד.</p><br><p>אם ב – <code>composer.json</code>, נכתוב:</p><pre class="crayon-plain-tag">{<br> "require": {<br> "package/vendor": "1.0.*"<br> }<br>}</pre><p>והגרסה המתאימה ביותר נכון לרגע שבו התקנו את החבילות (כלומר הרצנו את הפקודה <code>composer install</code>) היא <code>1.0.7</code>, בקובץ המנעול יצויין שאנחנו משתמשים בחבילה בגרסה <code>1.0.7</code>:</p><pre class="crayon-plain-tag">{<br> ...<br> "packages": [<br> {<br> "name": "vendor/name",<br> "version": "1.0.7",<br> ...<br> }<br> ...<br> ]<br> ...<br>}</pre><p>אפשר להגיד שקובץ המנעול מתאר את מצב הפרוייקט <strong>בפועל</strong>, והוא דואג שכשתתקינו חבילה או פרוייקט, ייעשה שימוש במרכיבים הנכונים ובגרסאות הנכונות שבהם נעשה שימוש במהלך הפיתוח.</p><br><h4>חפרת.. מה אני עושה עכשיו?</h4><br><p>כשאנחנו מעוניינים לעדכן את התלויות של הפרוייקט, נשתמש בפקודה <code>composer update</code>, שבפועל עושה את הפעולות הבאות:</p><br><ol><br><li>קוראת את הקובץ <code>composer.json</code></li><br><li>מתקינה את החבילות שנדרשו בגרסאות המתאימות</li><br><li>כותבת קובץ <code>composer.lock</code> חדש כדי שישקף את מצב הפרוייקט לאחר העדכון</li><br><li>מחוללת קבצי טעינה אוטומטית</li><br></ol><br><p>חשוב להבין שהפעולה <code>composer install</code> בודקת האם הקובץ <code>composer.lock</code> קיים:</p><br><ol><br><li>אם לא: מבצעת את הפעולה <code>composer update</code></li><br><li>אם כן: מתקינה את החבילות הנדרשות לפי הקובץ <code>composer.lock</code></li><br><li>מחוללת קבצי טעינה אוטומטית</li><br></ol><br><p>ובכן, למה אתם מחכים? הריצו את הפקודה <code>composer update</code> והחבילה החדשה שלנו תותקן ונוכל לסיים את הממשק שלנו.<br /><br>שימו לב שהפקודה מבצעת <strong>עדכון</strong> ומתקינה רק חבילות חדשות / חבילות עם גרסה חדשה יותר, בהתאם להגבלות.<br /><br>נוסיף מתחת לפונקציה <code>compareSettings</code> שלוש פעולות עזר שחוזרות על עצמן בין אם המשתמש בחר בסיסמה לא קריאה ובין אם בחר בסיסמה קריאה:</p><pre class="crayon-plain-tag">function serializePasswords($passwords, $type) {<br> $type = strtolower($type);<br> $serializer = JMS\Serializer\SerializerBuilder::create()->build();<br><br> if($type == "text")<br> return implode("\n", $passwords);<br><br> if(!in_array($type, ["json", "xml"]))<br> $type = "json";<br><br> return $serializer->serialize($passwords, $type);<br>}<br><br>function getHeaderContentType($type) {<br> $type = strtolower($type);<br><br> if($type == "xml")<br> return "text/xml";<br><br> if($type == "text")<br> return "text/plain";<br><br> return "application/json";<br>}<br><br>function generateResponse($response, $passwords, $returnType) {<br> // Response body<br> $body = $response->getBody();<br> $body->write(serializePasswords($passwords, $returnType));<br><br> // Create new response with appropriate header<br> $newResponse = $response->withHeader('Content-type', getHeaderContentType($returnType));<br><br> return $newResponse->withBody($body);<br>}</pre><p></p><br><ul><br><li><code>serializePasswords</code> משתמשת בחבילה שזה עתה ייבאנו, <code>jms/serializer</code> כדי להפוך את המערך שלנו לטיפוס הנתונים המתאים</li><br><li><code>getHeaderContentType</code> מחזירה את סוג הנתונים שנשלח ב – Header של התגובה</li><br><li><code>generateResponse</code> מייצרת תגובה חדשה עם הנתונים שהתקבלו משתי הפונקציות למעלה</li><br></ul><br><p>כל שנותר לנו לעשות הוא לקרוא לפונקציה <code>generateResponse</code> בפונקציות האנונימיות שלנו, ונקבל את הקוד המלא של הממשק:</p><pre class="crayon-plain-tag"><?php<br><br>require('./vendor/autoload.php');<br><br>$app = new \Slim\App();<br><br><br>function compareSettings($settings, $args) {<br> foreach($args as $key => $val) {<br> if(isset($settings[$key]) && $val != $settings[$key])<br> $settings[$key] = $val;<br> }<br><br> return $settings;<br>}<br><br>function serializePasswords($passwords, $type) {<br> $type = strtolower($type);<br> $serializer = JMS\Serializer\SerializerBuilder::create()->build();<br><br> if($type == "text")<br> return implode("\n", $passwords);<br><br> if(!in_array($type, ["json", "xml"]))<br> $type = "json";<br><br> return $serializer->serialize($passwords, $type);<br>}<br><br>function getHeaderContentType($type) {<br> $type = strtolower($type);<br><br> if($type == "xml")<br> return "text/xml";<br><br> if($type == "text")<br> return "text/plain";<br><br> return "application/json";<br>}<br><br>function generateResponse($response, $passwords, $returnType) {<br> // Response body<br> $body = $response->getBody();<br> $body->write(serializePasswords($passwords, $returnType));<br><br> // Create new response with appropriate header<br> $newResponse = $response->withHeader('Content-type', getHeaderContentType($returnType));<br><br> return $newResponse->withBody($body);<br>}<br><br>$app->get('/computer', function($request, $response, $args) {<br> $generator = new Hackzilla\PasswordGenerator\Generator\ComputerPasswordGenerator;<br><br> $defaults = [<br> 'passwordLength' => 8,<br> 'specialChars' => false,<br> 'lowerCase' => true,<br> 'upperCase' => true,<br> 'numbers' => true,<br> 'count' => 1,<br> 'returnType' => 'json'<br> ];<br><br> $config = compareSettings($defaults, $request->getQueryParams());<br><br> $generator<br> ->setLength((int)$config['passwordLength'])<br> ->setSymbols((bool)$config['specialChars'])<br> ->setLowercase((bool)$config['lowerCase'])<br> ->setUppercase((bool)$config['upperCase'])<br> ->setNumbers((bool)$config['numbers']);<br><br> $passwords = $generator->generatePasswords((int)$config['count']);<br><br> return generateResponse($response, $passwords, $config['returnType']);<br>});<br><br>$app->get('/human', function($request, $response, $args) {<br> $generator = new Hackzilla\PasswordGenerator\Generator\HumanPasswordGenerator;<br><br> $defaults = [<br> 'passwordLength' => 12,<br> 'count' => 1,<br> 'returnType' => 'json'<br> ];<br><br> $config = compareSettings($defaults, $request->getQueryParams());<br><br> $generator<br> ->SetWordList('./words.txt')<br> ->setWordSeparator('')<br> ->setLength((int)$config['passwordLength']);<br><br> $passwords = $generator->generatePasswords((int)$config['count']);<br><br> return generateResponse($response, $passwords, $config['returnType']);<br><br>});<br><br>$app->run();</pre><p>הפעולה <code>$app->run()</code> מפעילה את הראוטר.</p><br><p>וזהו זה! יש לנו ממשק מחולל סיסמאות לתפארת!</p><br><p>כעת תוכלו לגלוש בדפדפן לשרת המקומי ולבחון את הממשק שזה עתה בנינו.</p><br><p>כמובן שתצטרכו לגשת לנתיב הרצוי עם הפרמטרים, לדוגמה:</p><br><p><a href="http://localhost/passwordApi/index.php/human?passwordLength=20&count=5" title="http://localhost/passwordApi/index.php/human?passwordLength=20&count=5" rel="external">http://localhost/passwordApi/index.ph ... ordLength=20&count=5</a></p><br><h2>בונוס: להקים שרת מקומי עם המסוף</h2><br><p>אם התקנתם PHP במסוף כפי שהמלצתי, אתם יכולים להקליד את השורה הבאה, מתוך תיקיית הפרוייקט:</p><br><p><code>php -S localhost:8000</code></p><br><p>ושרת חדש יקום בכתובת <a href="http://localhost:8000" title="http://localhost:8000" rel="external">http://localhost:8000</a></p><br><p>ואז תוכלו לבצע את הבדיקות בשרת מבודד:</p><br><p><a href="http://localhost:8000/index.php/human?passwordLength=20&count=5" title="http://localhost:8000/index.php/human?passwordLength=20&count=5" rel="external">http://localhost:8000/index.php/human ... ordLength=20&count=5</a></p><br><h2>CHEATSHEET: פקודות נפוצות למסוף</h2><br><p>הכלי, כאמור, רץ במסוף. כ-כזה, הוא מכיל מספר גדול של פקודות, בחלקן תשתמשו באופן יום-יומי, בחלקן לעיתים נדירות.<br /><br>אם רמת ההיכרות הנוכחית שלכם עם הכלי מבוססת על המדריך הזה, יש 4 פקודות ששווה שתכירו:</p><br><h3>install</h3><br><p><code>composer install</code></p><br><p>מתקינה את תלויות הפרוייקט לפי הקובץ <code>composer.lock</code> או <code>composer.json</code>, אם הראשון לא קיים מבצעת את הפקודה <code>update</code></p><br><p><a href="https://getcomposer.org/doc/03-cli.md#install" target="_blank">תיעוד מלא</a></p><br><h3>update</h3><br><p><code>composer update</code></p><br><p>מתקינה את תלויות הפרוייקט לפי הקובץ <code>composer.json</code> וכותבת קובץ <code>composer.lock</code> חדש</p><br><p><a href="https://getcomposer.org/doc/03-cli.md#update" target="_blank">תיעוד מלא</a></p><br><h3>require</h3><br><p><code>composer require vendor/package:version</code></p><br><p>מוסיפה לקובץ <code>composer.json</code> את החבילה שצוינה ומריצה את הפקודה <code>composer install/update</code></p><br><p><a href="https://getcomposer.org/doc/03-cli.md#require" target="_blank">תיעוד מלא</a></p><br><h3>remove</h3><br><p><code>composer remove vendor/package</code></p><br><p>מוחקת מקובץ composer.json את החבילה שצוינה ומריצה את הפקודה <code>composer update</code></p><br><p><a href="https://getcomposer.org/doc/03-cli.md#remove" target="_blank">תיעוד מלא</a></p><br><h2></h2><br><h2>זה לא הסוף..</h2><br><p>תנו לעצמכם טפיחה על השכם: התמדתם והגעתם לסוף המאמר – ריספקט.<br /><br>אני מקווה שהצלחתי ללמד אתכם את המהות של Composer ואיך להשתמש בו.</p><br><p>אבל אל תיכנסו לאופוריה! עוד יש לנו על מה לעבור ואני מבטיח שאני ארשום מאמר המשך עם נושאים מתקדמים יותר כמו התקנת חבילות גלובלית, טעינה אוטומטית, כתיבת חבילות ועוד.<br /><br>עד לפעם הבאה <img src="https://s.w.org/images/core/emoji/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p><br><p>הפוסט <a rel="nofollow" href="http://masterscripter.co.il/%d7%9e%d7%93%d7%a8%d7%99%d7%9a-composer/">המדריך השלם ל – Composer</a> הופיע ראשון ב<a rel="nofollow" href="http://masterscripter.co.il">MasterScripter</a></p><br><br>מקור המאמר: http://masterscripter.co.il/%d7%9e%d7%93%d7%a8%d7%99%d7%9a-composer/ יונתן נקסון