วิธีปฏิบัติที่ดีที่สุดสำหรับผู้ช่วย Laravel 4 และฟังก์ชั่นพื้นฐาน?


152

ฉันกำลังพยายามทำความเข้าใจสถานที่ที่ดีที่สุดในการใส่ฟังก์ชั่นระดับโลกใน Laravel 4 ตัวอย่างเช่นการจัดรูปแบบวันที่ ฉันไม่คิดว่าการสร้างด้านหน้าจะคุ้มค่าเพราะอาคารเป็นแบบแยกส่วนเกินไป ฉันได้อ่านบทความเกี่ยวกับการสร้างโฟลเดอร์ไลบรารีและจัดเก็บคลาสไว้ที่นั่น แต่ก็ดูเหมือนว่าจะมีฟังก์ชั่นง่าย ๆ มากมาย ไม่ควรมี 'เครื่องมือ' แบบนี้ในเทมเพลต Blade หรือไม่

อะไรคือแนวทางปฏิบัติที่ดีที่สุดสำหรับบางสิ่งเช่นนี้และฉันจะให้แม่แบบใบมีดใช้ได้อย่างไร

คำตอบ:


233

วิธีน่าเกลียดขี้เกียจและน่ากลัวในตอนท้ายbootstrap/start.phpเพิ่มinclude('tools.php')และวางฟังก์ชันของคุณในไฟล์ใหม่

วิธีที่สะอาด: สร้างห้องสมุด วิธีนั้นจะถูกโหลดอัตโนมัติเมื่อคุณใช้งานจริงเท่านั้น

  • สร้างlibrariesโฟลเดอร์ภายในappโฟลเดอร์ของคุณ
  • สร้างไฟล์ไลบรารีของคุณสร้างคลาสในนั้นและเพิ่มฟังก์ชั่นคงที่
  • ตัวเลือกที่ 1 : แก้ไขstart/global.phpเพื่อเพิ่มapp_path().'/libraries'ในClassLoader::addDirectories( อาร์เรย์
  • ตัวเลือกที่ 2 : แก้ไขcomposer.jsonเพื่อเพิ่ม"app/libraries"ในautoloadอาร์เรย์ วิ่งcomposer dump-autoload
  • เรียกคลาสและฟังก์ชันแบบสแตติกของคุณจากมุมมองของคุณ

เกี่ยวกับตัวเลือกของคุณที่ยกมาจากglobal.phpไฟล์

นอกเหนือจากการใช้ Composer คุณสามารถใช้ Laravel class loader เพื่อโหลดคอนโทรลเลอร์และรุ่นของคุณ สิ่งนี้มีประโยชน์ในการรักษาคลาสทั้งหมดของคุณในเนมสเปซ "global" โดยไม่ต้องมีการปรับปรุง Composer

คุณสามารถรวมตัวเลือกทั้งสองได้โดยที่ตัวโหลดคลา Laravel จะค้นหาคลาสโดยอัตโนมัติในไดเรกทอรีที่ลงทะเบียน ( ตัวเลือก 1ง่ายกว่า) และนักแต่งเพลงจะเก็บบันทึกคลาสทั้งหมด แต่หลังจากคุณอัปเดตแล้ว ( ตัวเลือก 2อาจปรับปรุงประสิทธิภาพ)


3
ฉันคิดว่าคุณต้องวางapp_path().'/library'ใน start / global.php
Alexandre Butynski

2
@AlexandreButynski จุดดี วิธีนี้จะทำให้สามารถเพิ่ม libaries ได้โดยไม่ต้องอัพเดทผู้แต่งทุกครั้ง ฉันแก้ไขโพสต์เพื่อเพิ่ม
Alexandre Danault

ดังนั้นฉันจึงสร้างคลาสที่เรียกว่า IDK ... SiteHelpers แล้วกำหนดวิธีการจัดรูปแบบวันที่ แล้วในเทมเพลตฉันควรจะสามารถทำ SiteHelpers :: formatDate ($ date) ได้หรือไม่
Jason Spick

@JasonSpick ใช่และให้แน่ใจว่าคุณตั้งชื่อไฟล์ของคุณsitehelpers.php
Alexandre Danault

3
เหตุใดคุณจึงต้องเพิ่มลงใน autoload ของผู้แต่งรวมถึงไฟล์ global.php
CashIsClay

82

วิธีของฉันในการทำเช่นนี้คือการสร้างโฟลเดอร์ใหม่ใน/appไดเรกทอรีในรากของโครงการ Laravel 4 ของคุณ จากนั้นเพิ่มโฟลเดอร์นี้ในอาร์เรย์แรกของ/app/start/global.phpไฟล์ดังนี้:

<?php

ClassLoader::addDirectories(array(

app_path().'/commands',
app_path().'/controllers',
app_path().'/models',
app_path().'/database/seeds',
app_path().'/classes', // This line is the one I've added.

));

ตราบใดที่โครงสร้างโฟลเดอร์ภายใน/app/classesโฟลเดอร์ใหม่เป็นไปตามข้อตกลงการกำหนดเนมสเปซของคุณ Laravel 4 จะโหลดคลาส / ไฟล์ทั้งหมดในโฟลเดอร์นี้โดยอัตโนมัติ วิธีนี้ไม่จำเป็นต้องขุดลงในไฟล์ผู้แต่งหรือเรียกใช้คำสั่งผู้แต่ง

ไม่แน่ใจว่านี่เป็นวิธีปฏิบัติที่ดีที่สุดหรือไม่

หากคุณสร้างไฟล์อย่างง่ายที่เรียกว่า/app/classes/Helpers/Helper.phpเช่นนี้:

<?php namespace Helpers;

class Helper {

    public static function helloWorld()
    {
        return 'Hello World';
    }
}

สิ่งที่คุณต้องทำคือโทรออก Helpers\Helper::helloWorld();

คุณสามารถใช้นามแฝงคลาสผู้ช่วยนี้ใน/app/config/app.phpไฟล์ของคุณได้ เพียงเพิ่มสิ่งนี้ในตอนท้ายของaliasesอาร์เรย์:

'Helper'          => 'Helpers\Helper'

4
ฉันชอบวิธีนี้เพราะคุณไม่ต้องคบหากับนักแต่งเพลง - อิชช่าวิธีแก้ปัญหาที่สะอาดและดีงาม +1
Gadoma

3
หากคุณต้องเพิ่มคลาสผู้ช่วยของคุณไปยังไฟล์ app.php ตอนนี้คุณสามารถเข้าถึงชั้นเรียนได้โดยตรงเช่นนี้: ผู้ช่วย :: hellowWorld ();
Helmut Granda

ผู้ช่วยควรเป็นชั้นเรียนหรือไม่? ฉันจะกำหนดฟังก์ชั่นง่าย ๆ ได้ที่นี่?
Webinan

2
วิธีนี้ใช้ไม่ได้หากคุณไม่แก้ไข composer.json และไม่เรียกใช้ dumperoload ผู้แต่งเพลง
Rommy

1
ทางออกที่ดี อย่างที่ Rommy บอกไว้อย่าลืมวิ่งcomposer dump-autoload- ฉันทำและใช้เวลา 20 นาทีเกาหัว
al_manchester

25

วิธี helpers.php ของ Laravel คือการเพิ่มลงใน "ไฟล์" ของคุณใน composer.json ( https://github.com/laravel/framework/blob/master/composer.json ):

"autoload": {
    "classmap": [
        ...
    ],
    "files": [
        "app/libraries/helpers.php"
    ],
},

สิ่งที่ฉันทำคือการสร้างชั้นเรียนขนาดเล็ก (ไม่กี่วิธีต่อชั้น, หนึ่งบรรทัดต่อวิธี, ทุกอย่างขยายจากบางสิ่งและ DRY นั่นคือเป้าหมายของฉัน)

class ExtendedCarbon extends Carbon\Carbon {

    public function formatDDMMAAAA($date)
    {
        /// format and return
    }

}

บันทึกลงในแอพ / ไลบรารีและเพิ่มลงใน composer.json:

"autoload": {
    "classmap": [
        ...
        "app/libraries",
        ...
    ],
},

ปฏิบัติ

composer dump

จากนั้นก็ใช้งานได้ทุกที่ที่คุณต้องการ

$formatted = (new ExtendedCarbon)->formatDDMMAAAA($date);

ดูวิดีโอนี้เกี่ยวกับการปรับโครงสร้างใหม่: http://www.youtube.com/watch?v=DC-pQPq0acs

อย่างไรก็ตามฉันแน่ใจว่ามันเป็นเพียงตัวอย่าง แต่คุณอาจไม่จำเป็นต้องมีผู้ช่วยในการจัดรูปแบบวันที่เนื่องจากทุกวันใน Laravel เป็นกรณีของ Carbon ( https://github.com/briannesbitt/Carbon ) และ มีวิธีการมากมายในการจัดรูปแบบวันที่และเวลา


ฉันไม่ได้เป็นแฟนตัวยงของวิธีการแบบคงที่ด้วยตนเองและพยายามใช้วิธีการอินสแตนซ์เมื่อจำเป็น ข้อผิดพลาดที่ผมค่อนข้างมั่นใจว่าในกรณีของการใช้งานดังกล่าวคุณจะดีมากของการมีฐานะformatDDMMAAAA() static
XedinUnknown

7

คุณสามารถใช้View::share()ร่วมกับการปิดเพื่อให้บรรลุ - ฉันเพิ่งโพสต์เกี่ยวกับเรื่องนี้: http://www.develophp.org/2014/07/laravel-4-blade-helper-functions/

สิทธิประโยชน์เพิ่มเติม: คุณไม่จำเป็นต้องสร้างคลาสพิเศษและรักษาเนมสเปซส่วนกลางให้สะอาด


ฉันชอบวิธีนี้ มากขึ้นรถไฟ ish เราจะเพิ่มวิธีดู - ผู้ช่วยทั้งหมดในลักษณะและวิธีที่พวกเขามีอยู่ในมุมมองใบมีดได้อย่างไร
bibstha

ฉันไม่คิดว่าเป็นไปได้กับ PHP ที่จะซื่อสัตย์
ฟรานซ์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.