ללמוד Laravel

יידישע קאפ

משתמש סופר מקצוען
מנוי פרימיום
עיצוב גרפי
צילום מקצועי
עריכה והפקת סרטים
עימוד ספרים
הרעיון שלי הוא שכל מידע שמגיע לדף בפעם הראשונה אני מניח אותו באובייקט ההוא, כך שאין צורך לקרוא לו שוב כל עוד הדף לא רוענן, את כל המניפולציות הפילטרים וכו' אני מיישם בצד הלקוח בלבד,

וזה אכן השיטה המרווחת היום - ללכת יותר על צד הלקוח.
אבל יש לזה גם חסרונות, ואין לי כח להיכנס לזה כאן. הנה מאמר מחכים בענין זה. מצורף ציטוט חלקי:

IMG_20200511_202553.jpg


והנה ציוץ מ-Dan Abromov (מהמפתחים של ריאקט) שמצטט את המאמר הנ״ל:

IMG_20200511_202600.jpg


אסור לשכוח שכל שורה של קוד JS מוסיף לקוד שהלקוח צריך לטעון ולהריץ.
בהתחלה גם אני עשיתי הכל על הצד-לקוח, ואפילו בלי שרת בכלל (עם Firebase ל-database ו-serverless-functions)...
 

יידישע קאפ

משתמש סופר מקצוען
מנוי פרימיום
עיצוב גרפי
צילום מקצועי
עריכה והפקת סרטים
עימוד ספרים

קבצים מצורפים

  • Second-guessing the modern web - macwright.org.html.zip
    KB 7.6 · צפיות: 15

ש.ב.ח.

משתמש מקצוען
מנוי פרימיום
בוגר/תלמיד פרוג
עיצוב גרפי
D I G I T A L
אבל יש לזה גם חסרונות
אכן קראתי, תודה על הנקודה למחשבה.
לדעתי יש צד להכריע עם תכנון מראש של כמות המשתמשים בו זמנית,
כמו כן יש לקחת בחשבון בשיטה הראשונה שיש לטפל בנושא SEO (אם הוא נצרך).
 

ש.ב.ח.

משתמש מקצוען
מנוי פרימיום
בוגר/תלמיד פרוג
עיצוב גרפי
D I G I T A L
@ניוגראף שאלה 2 (מאלו שהם לעניין ;) )

יצרתי Policy חדש עם קובץ וclass בשם PostPolicy
עם השיטה הבאה:
PHP:
public function update(User $user, Post $post)
{
   return $post->user->is($user);
}

בview אני מבצע התניית יכולת כך
PHP:
@can('update', $post )
    <p><a href="{{ route('posts.edit', $post) }}" class="link">Edit Post</a></p>
@endcan

למה זה לא עובד?

משתנה ה$post הוא בבירור אובייקט המודל Post
1592906894216.png


זה לאחר שניסיתי להבין מה הבעיה... וללא הצלחה.
 

יידישע קאפ

משתמש סופר מקצוען
מנוי פרימיום
עיצוב גרפי
צילום מקצועי
עריכה והפקת סרטים
עימוד ספרים
למה זה לא עובד?

נראה לי שצריך לכתוב את הפונקציה ב-policy ככה:
PHP:
public function update(User $user, Post $post)
{
   return $post->user->id == $user->id;
}

יש לך אולי מדריך טוב איך ליצור אתר סטטי ב vue?
יש את Nuxt ואת Gridsome. לשניהם יכולת ייצוא לאתר סטטי.
הייתי ממליץ לקרוא את התיעוד הרשמי שלהם, מאוד ברור והכי מהר ללמוד.
 

@shaye

משתמש מקצוען
D I G I T A L
@ניוגראף יש לך אולי מדריך טוב איך ליצור אתר סטטי ב vue?
הנה מאמר בעברית בבלוג של אלעד כהן על בניית אתר סטטי עם Gridsome:

כמובן שאם תחפש באנגלית תמצא הרבה חומר...
 

ש.ב.ח.

משתמש מקצוען
מנוי פרימיום
בוגר/תלמיד פרוג
עיצוב גרפי
D I G I T A L
נראה לי שצריך לכתוב את הפונקציה ב-policy ככה:
האמת שאין הבדל, פשוט is משווה...
אמנם גם אם אני לא עושה התנייה אלא מחזיר true זה גם לא עובד, כלומר אין הפנייה בכלל לPolicy
 

יידישע קאפ

משתמש סופר מקצוען
מנוי פרימיום
עיצוב גרפי
צילום מקצועי
עריכה והפקת סרטים
עימוד ספרים
האמת שאין הבדל, פשוט is משווה...
צודק, TIL (כרגע למדתי)...

אפשר לראות את כל ה-PostPolicy?
אם זה בגיטהאב - יותר נח לשתף קישור לשמה, שאוכל לראות את כל הפרוייקט.
 

ש.ב.ח.

משתמש מקצוען
מנוי פרימיום
בוגר/תלמיד פרוג
עיצוב גרפי
D I G I T A L
אם זה בגיטהאב - יותר נח לשתף קישור לשמה, שאוכל לראות את כל הפרוייקט.
בבקשה
אני לא מכיר מספיק את גיטאהב אז אשמח לדיון להמשיך כאן,
בתודה מראש על הסובלנות למתחיל...
 

ש.ב.ח.

משתמש מקצוען
מנוי פרימיום
בוגר/תלמיד פרוג
עיצוב גרפי
D I G I T A L
@ניוגראף לא תאמין אבל עליתי על הפואנטה!

לא יודע למה ומי אשם (ברור שאני לא!!! :confused:, אולי איזה קיצור מקלדת בטעות או משהו כזה... אני עשיתי הכל עם הCLI כך זה לא אני אשם :(... ברצינות... מבטיח...:cool:)
אבל הnamespase וה class של הPost היו עם א קליינע אוסייות.
איך בסוף גיליתי את זה הנה:
PHP:
{{dd($post)}}
באמצע view file
והנה, (שמתי לב לזה רק אחרי 100 פעם בערך, (למה האלו בLaravel לא מבינים שצריך לעשות את שם המחלקה יותר בולט, הם באמת לא ידעו שאני אמור ליפול עם זה?!?!?!?)
1592930489668.png


,תודה על הכל.
 

יידישע קאפ

משתמש סופר מקצוען
מנוי פרימיום
עיצוב גרפי
צילום מקצועי
עריכה והפקת סרטים
עימוד ספרים
בתודה מראש על הסובלנות למתחיל...

ישבתי על זה יותר משעה, והיה ממש תעלומה למה לא עובד...
ועכשיו עליתי על זה שהיה namespace app עם אותיות קטנות... :rolleyes:

כל ה-Post Class היו כתוב באותיות קטנות:
CleanShot 2020-06-23 at 9.06.04.png

CleanShot 2020-06-23 at 9.06.13.png

CleanShot 2020-06-23 at 9.06.18.png


לא הייתי מאשים ה-CLI של Laravel... והא ראיה שהפונקציה user() שהוספת גם היה ככה. נראה שאיזה קיצור מקלדת הפך את כל הקובץ לאותיות קטנות...
 

ש.ב.ח.

משתמש מקצוען
מנוי פרימיום
בוגר/תלמיד פרוג
עיצוב גרפי
D I G I T A L
אתה צודק אבל זה עובד אותו דבר. דו"ק.
(אני מתכוון לפרמטר במתודה - זה משהו שמופיע כמה פעמים בתיעוד שלהם, בהקשר לשם הפונקציה עצמה, זה נורא מעניין אבל זה גם עובד...:rolleyes:)

שוב תודה.
 

יידישע קאפ

משתמש סופר מקצוען
מנוי פרימיום
עיצוב גרפי
צילום מקצועי
עריכה והפקת סרטים
עימוד ספרים
אתה צודק אבל זה עובד אותו דבר. דו"ק.
(אני מתכוון לפרמטר במתודה

כי זה אותו דבר. App\User::class מחזיר מחרוזת של שם ה-class.
מה שיותר בעיה זה שם הפונקציה belongsTo, שיהיה ב-camel case.
 

ש.ב.ח.

משתמש מקצוען
מנוי פרימיום
בוגר/תלמיד פרוג
עיצוב גרפי
D I G I T A L
@ניוגראף, שאלה נוספת.

יש לי יחוס תגיות לפוסטים בשיטת רבים לרבים.
אני מעוניין לתת חופש פעולה לקליינט ליצור תגים חדשים בעת שמירת הפוסט.

איך ניתן לבצע את זה?

בעיה ראשונה: שיטת הattach מקבל מספר מזהה של התגית, אני צריך לשלוח ערכי מחרוזת.
בעיה שנייה: איך באמת יוצרים חדש תוך כדי.

אולי התשובה: "אין ברירה צריך לעבוד יותר קשה", אני רק שואל אם יש משהו מובנה בORM הכל כך כייפי הזה.. :)
 
נערך לאחרונה ב:

יידישע קאפ

משתמש סופר מקצוען
מנוי פרימיום
עיצוב גרפי
צילום מקצועי
עריכה והפקת סרטים
עימוד ספרים
בעיה ראשונה: שיטת הattach מקבל מספר מזהה של התגית, אני צריך לשלוח ערכי מחרוזת.

attach מקבל גם מערך של מודלים, מחרוזת של IDs, או collection!

בעיה שנייה: איך באמת יוצרים חדש תוך כדי.

הנה שיטה אלגנטית:
ב-controller כשאתה מחבר את התגיות לפוסט:
PHP:
$post->tags()->sync(
     $this->syncTags(request('tags'))
);

והנה המתודה syncTags (על אותו controller):
PHP:
private function syncTags(array $incomingTags): array {
        if ($incomingTags) {
            //  get all current tags
            $tags = Tag::get(['id', 'name']);

            return collect($incomingTags)->map(function ($incomingTag) use ($tags) {
                // try to get existing tag
                $tag = $tags->where('slug', $incomingTag['name'])->first();
                if (!$tag) {
                    // tag doesn't exist - create it now
                    $tag = Tag::create([
                        'name' => $incomingTag['name'],
                    ]);
                }
                // return the new or existing
                return (string) $tag->id;
            })->toArray();
        } else {
            return [];
        }
    }

ההבדל בין attach ל-sync:
attach רק מוסיף יחוס.
sync מחליף את כל היחוסים של המודל.
 
נערך לאחרונה ב:

ש.ב.ח.

משתמש מקצוען
מנוי פרימיום
בוגר/תלמיד פרוג
עיצוב גרפי
D I G I T A L
מחרוזת של מודלים
מה זה אומר? לאיפה הוא דוחף את המודל בטבלת הביניים?
מחרוזת של IDs
אתה מתכוון למחרוזת של מספרים מופרדים בפסיקים?
עדיין לא למדתי, גם לזה אגיע בעזרת ה'
ההבדל בין attach ל-sync:
attach רק מוסיף יחוס.
sync מחליף את כל היחוסים של המודל.
בהחלט, הכרתי את העובדה, זו רק הייתה דוגמא לשאלה, אמנם בהחלט השימוש בכגון דא בsync יותר נכון.

ד.א.
$tag = $tags->where('slug', $incomingTag['name'])->first();
הוא מבצע את השאילתה על הערך שחזר כבר מהמסד, הוא לא יוצר עוד שאילתות, נכון?
 

יידישע קאפ

משתמש סופר מקצוען
מנוי פרימיום
עיצוב גרפי
צילום מקצועי
עריכה והפקת סרטים
עימוד ספרים
אתה מתכוון למחרוזת של מספרים מופרדים בפסיקים?
סליחה, התכוונתי ל״מערך״ - array...

מה זה אומר? לאיפה הוא דוחף את המודל בטבלת הביניים?
מערך של מודלים - תגיות, והוא ישתמש ב-ID שלהם.

הוא מבצע את השאילתה על הערך שחזר כבר מהמסד, הוא לא יוצר עוד שאילתות, נכון?
נכון! ראה כאן.
 

ש.ב.ח.

משתמש מקצוען
מנוי פרימיום
בוגר/תלמיד פרוג
עיצוב גרפי
D I G I T A L
והנה המתודה syncTags (על אותו controller):

אני חושב שזה קצת יותר מינימליסטי, גם שמתי אותו על ה Model במקום על ה Controller
(שים לב שהשאילתה לא מושכת את כל הטבלה אלא רק את השמות שיש מהם בטבלה)
PHP:
    public function syncTags($incomingTags) : void
    {
        if(!$incomingTags) return;

        //temp to dev
        if(!$incomingTags = explode(',', $incomingTags)) return;

        $tags = Tag::whereIn('name', $incomingTags)->get(['id', 'name']);
        $syncTags = collect($incomingTags)->map( function($incomingTags) use($tags){

            $tag = $tags->where('name', $incomingTags);

            if(!$tag){
                $tag = Tag::create([
                    'name' => $incomingTags
                ]);
            }
            return (string) $tag->id;
        })->toArray();

        $this->tags()->sync($syncTags);
    }

רק בעיה אחת נשארה גם בקוד שלך
המתודה where על הcollection יש לה רגישות יתר לאותיות גדולות וקטנות
כך שאם במקרה המשתמש רשם laravel ובטבלה כבר קיים Laravel אז הוא לא ישווה וינסה ליצור אותו
ומכיוון שיש לי ייחודיות על השם בטבלה תיזרק שגיאה.
 

אולי מעניין אותך גם...

הפרק היומי

הפרק היומי! כל ערב פרק תהילים חדש. הצטרפו אלינו לקריאת תהילים משותפת!


תהילים פרק קמט

א הַלְלוּיָהּ שִׁירוּ לַיהוָה שִׁיר חָדָשׁ תְּהִלָּתוֹ בִּקְהַל חֲסִידִים:ב יִשְׂמַח יִשְׂרָאֵל בְּעֹשָׂיו בְּנֵי צִיּוֹן יָגִילוּ בְמַלְכָּם:ג יְהַלְלוּ שְׁמוֹ בְמָחוֹל בְּתֹף וְכִנּוֹר יְזַמְּרוּ לוֹ:ד כִּי רוֹצֶה יְהוָה בְּעַמּוֹ יְפָאֵר עֲנָוִים בִּישׁוּעָה:ה יַעְלְזוּ חֲסִידִים בְּכָבוֹד יְרַנְּנוּ עַל מִשְׁכְּבוֹתָם:ו רוֹמְמוֹת אֵל בִּגְרוֹנָם וְחֶרֶב פִּיפִיּוֹת בְּיָדָם:ז לַעֲשׂוֹת נְקָמָה בַּגּוֹיִם תּוֹכֵחֹת בַּלְאֻמִּים:ח לֶאְסֹר מַלְכֵיהֶם בְּזִקִּים וְנִכְבְּדֵיהֶם בְּכַבְלֵי בַרְזֶל:ט לַעֲשׂוֹת בָּהֶם מִשְׁפָּט כָּתוּב הָדָר הוּא לְכָל חֲסִידָיו הַלְלוּיָהּ:
נקרא  12  פעמים

ספירת העומר

לוח מודעות

למעלה