วิธีปฏิบัติที่ดีที่สุดสำหรับผู้ช่วยที่กำหนดเองใน Laravel 5 [ปิด]


472

ฉันต้องการสร้างฟังก์ชันตัวช่วยเพื่อหลีกเลี่ยงการทำซ้ำรหัสระหว่างมุมมองใน Laravel 5:

view.blade.php

<p>Foo Formated text: {{ fooFormatText($text) }}</p>

ฟังก์ชั่นการจัดรูปแบบข้อความเป็นพื้น ฉันจะสร้างไฟล์ด้วยฟังก์ชั่นเหล่านี้ได้ที่ไหนและอย่างไร

คำตอบ:


595

สร้างhelpers.phpไฟล์ในโฟลเดอร์แอพของคุณและโหลดมันด้วยผู้แต่ง:

"autoload": {
    "classmap": [
        ...
    ],
    "psr-4": {
        "App\\": "app/"
    },
    "files": [
        "app/helpers.php" // <---- ADD THIS
    ]
},

หลังจากเพิ่มลงในcomposer.jsonไฟล์ของคุณแล้วให้รันคำสั่งต่อไปนี้:

composer dump-autoload

ถ้าคุณไม่ชอบการรักษาของคุณhelpers.phpไฟล์ของคุณในappไดเรกทอรี (เพราะมันไม่ได้เป็น PSR-4 namespaced ไฟล์ class) คุณสามารถทำสิ่งที่เป็นlaravel.comเว็บไซต์ไม่: เก็บในไดเรกทอรีบูตhelpers.php อย่าลืมตั้งไว้ในcomposer.jsonไฟล์ของคุณ:

"files": [
    "bootstrap/helpers.php"
]

85
เคล็ดลับสำหรับ noobs: ใช้คำสั่งนี้หลังจากเปลี่ยนผู้แต่ง นักแต่งเพลง dump-autoload
Allfarid Morales García

11
@ AllfaridMoralesGarcíaหรืออาจเป็นเพียงแค่ 'เคล็ดลับที่มีประโยชน์เนื่องจากคำตอบไม่ได้ทำให้ชัดเจนว่าคุณต้องทำสิ่งนี้ในภายหลัง'
Matt McDonald

8
ฉันเห็นด้วยกับฟังก์ชั่นของผู้ช่วยเพื่อทำให้การเขียนง่ายขึ้น แต่ฉันเกลียดว่าคำตอบนี้มีการอ้างอิงในคำตอบอื่น ๆ เพียงใด อย่าเข้าใจฉันผิดมันเป็นคำตอบที่ดีและถูกต้องฉันแค่กลัวว่าผู้คนจะใช้ในทางที่ผิดและเริ่มเขียน PHP ที่มีคุณภาพต่ำ
andrewtweber

39
ฉันไม่เข้าใจวิธีการนี้ นักแต่งเพลงควรเป็นเครื่องมือในการรวมไลบรารี: Laravel จะทำงานได้อย่างสมบูรณ์แบบหากไม่มีมันและนักแต่งเพลงที่ไม่มี Laravel คำแนะนำนี้บอกให้เราสร้างไฟล์ภายในแอพของเราปล่อยแอพของเราไปที่นักแต่งเพลงบอกนักแต่งเพลงเพื่อกลับไปที่แอพของเราและรวมไฟล์ไว้ด้วย Laravel จัดการกับไฟล์อย่างชัดเจนใช่มั้ย เหตุใดเราจะละทิ้งการใช้งานดั้งเดิมของ Laravel และใช้เครื่องมือภายนอกนี้เพื่อรวมไฟล์ให้กับเรา มันเป็นความเกียจคร้านหรือว่าฉันขาดอะไรไป?
dKen

6
Laravel ใช้ออโต้โหลดเดอร์ของนักแต่งเพลงเพื่อทราบว่าจะรวมไลบรารีและไฟล์ทั้งหมดที่พึ่งพาได้อย่างไร สิ่งนี้อ้างถึงใน bootstrap / autoload.php อ่านความคิดเห็นในไฟล์นั้น วิธีการคือการเพิ่มการอ้างอิงไปยังไฟล์ลงใน composer.json จากนั้น "dump autoload" ซึ่งจะสร้างการโหลดอัตโนมัติของนักแต่งเพลงเพื่อให้ Laravel สามารถค้นหาได้ การใช้คอลเล็กชัน "ไฟล์" ของนักแต่งเพลงเป็นวิธีที่ดีในการเพิ่มไลบรารี่หรือไฟล์ฟังก์ชั่นใช้ครั้งเดียวที่ไม่ได้ห่อในแพ็คเกจผู้แต่ง เป็นเรื่องดีที่มีสถานที่สำหรับทุกคน "โดยวิธีที่ฉันจะต้องรวมสถานการณ์นี้ไฟล์แปลก"
Phillip Harrington

370

คลาสที่กำหนดเองใน Laravel 5 วิธีที่ง่าย

คำตอบนี้ใช้ได้กับคลาสที่กำหนดเองทั่วไปภายใน Laravel สำหรับคำตอบมากขึ้น Blade เฉพาะให้ดูที่กำหนดเอง Blade Directives ใน Laravel 5

ขั้นตอนที่ 1:สร้างไฟล์ Helpers ของคุณ (หรือคลาสที่กำหนดเองอื่น ๆ ) และกำหนดเนมสเปซที่ตรงกัน เขียนชั้นเรียนและวิธีการของคุณ:

<?php // Code within app\Helpers\Helper.php

namespace App\Helpers;

class Helper
{
    public static function shout(string $string)
    {
        return strtoupper($string);
    }
}

ขั้นตอนที่ 2:สร้างนามแฝง:

<?php // Code within config/app.php

    'aliases' => [
     ...
        'Helper' => App\Helpers\Helper::class,
     ...

ขั้นตอนที่ 3:รันcomposer dump-autoloadในรูทโปรเจ็กต์

ขั้นตอนที่ 4:ใช้ในเทมเพลต Blade ของคุณ:

<!-- Code within resources/views/template.blade.php -->

{!! Helper::shout('this is how to use autoloading correctly!!') !!}

เครดิตพิเศษ:ใช้คลาสนี้ได้ทุกที่ในแอป Laravel ของคุณ:

<?php // Code within app/Http/Controllers/SomeController.php

namespace App\Http\Controllers;

use Helper;

class SomeController extends Controller
{

    public function __construct()
    {
        Helper::shout('now i\'m using my helper class in a controller!!');
    }
    ...

ที่มา: http://www.php-fig.org/psr/psr-4/

ทำไมจึงใช้งานได้: https://github.com/laravel/framework/blob/master/src/Illuminate/Support/ClassLoader.php

ตำแหน่งที่การโหลดอัตโนมัติมาจาก: http://php.net/manual/en/language.oop5.autoload.php


35
เพื่อความชัดเจนคำตอบนี้ไม่ได้เกี่ยวข้องกับผู้ช่วยเหลือซึ่งเป็นฟังก์ชั่น global-namespaced แต่เป็นการสนับสนุนให้ผู้เปลี่ยนใจเลื่อมใสเปลี่ยนเป็นวิธีการเรียนแทน นี่เป็นวิธีที่ดีที่สุด แต่จริงๆแล้วไม่ได้ตอบคำถามที่ถามนี่นี่คือเหตุผลว่าทำไมคำตอบอื่น ๆ จึงมีความซับซ้อนโดยการเปรียบเทียบ
Dan Hunsaker

1
ผู้ช่วยฟังก์ชั่นหมายความว่ามันมีอยู่ในเบลดเช่นกันคุณจะทำให้ฟังก์ชั่นนี้ใช้งานได้ในเบลดอย่างไร? คุณไม่สามารถเรียก Helper :: prettyJason (พารามิเตอร์) ในเบลด
MaXi32

@ MaXi32 คุณสามารถเพิ่มคลาสภายใต้aliasesอาร์เรย์ในapp/config.php: 'Helper' => App\Helpers\Helper::class, จากนั้นคุณจะสามารถเรียกใช้Helper::prettyJson();เบลดได้ดี
heisian

@DanHunsaker แก้ไขเพื่อตอบคำถามโดยตรงและมันก็ยังคงเป็นวิธีที่ง่ายเหมือนกัน คุณยังสามารถเขียนคำสั่งเบลดแบบกำหนดเองของคุณเองได้เช่น: stackoverflow.com/questions/28290332/…
heisian

1
ใช่ฉันขุดผ่านกรอบการทำงานหนึ่งครั้งและพบว่าพวกเขาดึงผู้ช่วยเหลือเข้ามาและฉันก็เห็นด้วยอย่างยิ่งว่าวิธีการเรียนแบบสแตติกเนมสเปซนั้นมีความสะอาดกว่าที่ร้องขอ ความจริงก็คือผู้ช่วยไม่ใช่ทาง Laravel จริงๆในตอนแรก แต่เป็นการครอบครองโดย CodeIgniter 2.x ซึ่งยังไม่ได้ยุติลง ดังนั้นคนที่ใช้ความคิดของฉันเกี่ยวกับวิธีนี้ที่ไม่ตอบ OP อย่างที่ถามก็คือความพยายามที่จะเน้นความจริงที่ว่าคุณไม่ได้รับผู้ช่วย แต่เป็นสิ่งที่ดีกว่า
Dan Hunsaker

315

ความคิดเริ่มต้นของฉันคือนักแต่งเพลงอัตโนมัติเช่นกัน แต่มันก็ไม่ได้รู้สึก Laravel 5ish สำหรับฉัน L5 ใช้บริการของผู้ให้บริการอย่างหนัก แต่เป็นสิ่งที่บูตแอปพลิเคชันของคุณ

เพื่อเริ่มต้นผมสร้างโฟลเดอร์ของฉันไดเรกทอรีที่เรียกว่าapp Helpersจากนั้นภายในHelpersโฟลเดอร์ฉันเพิ่มไฟล์สำหรับฟังก์ชั่นที่ฉันต้องการเพิ่ม การมีโฟลเดอร์ที่มีหลายไฟล์ทำให้เราสามารถหลีกเลี่ยงไฟล์ใหญ่ ๆ ที่ยาวเกินไปและไม่สามารถจัดการได้

ต่อไปฉันสร้าง a HelperServiceProvider.phpโดยรันคำสั่ง artisan:

artisan make:provider HelperServiceProvider

ภายในregisterวิธีที่ฉันเพิ่มตัวอย่างนี้

public function register()
{
    foreach (glob(app_path().'/Helpers/*.php') as $filename){
        require_once($filename);
    }
}

สุดท้ายลงทะเบียนผู้ให้บริการในของคุณconfig/app.phpในอาร์เรย์ผู้ให้บริการ

'providers' => [
    'App\Providers\HelperServiceProvider',
]

ตอนนี้ไฟล์ใด ๆ ในHelpersไดเรกทอรีของคุณจะถูกโหลดและพร้อมใช้งาน

อัพเดท 2016-02-22

มีตัวเลือกที่ดีมากมายที่นี่ แต่ถ้าคำตอบของฉันเหมาะกับคุณฉันไปข้างหน้าและทำแพ็คเกจสำหรับการรวมผู้ช่วยด้วยวิธีนี้ คุณสามารถใช้แพ็คเกจเพื่อเป็นแรงบันดาลใจหรือดาวน์โหลดได้ฟรีด้วย Composer เช่นกัน มันมีตัวช่วยในตัวที่ฉันใช้บ่อย ๆ (แต่ไม่ได้ใช้งานเป็นค่าเริ่มต้น) และช่วยให้คุณสร้างตัวช่วยของคุณเองด้วยเครื่องกำเนิด Artisan แบบง่าย ๆ นอกจากนี้ยังระบุถึงข้อเสนอแนะที่ผู้ตอบกลับใช้ในการใช้ mapper และอนุญาตให้คุณกำหนดผู้ช่วยที่กำหนดเองเพื่อโหลดหรือโดยค่าเริ่มต้นโหลดไฟล์ PHP ทั้งหมดในไดเรกทอรีผู้ช่วยของคุณโดยอัตโนมัติ ข้อเสนอแนะและการประชาสัมพันธ์มีความนิยมมาก!

composer require browner12/helpers

Github: browner12 / ผู้ช่วยเหลือ


29
สำหรับผู้ที่มีฟังก์ชั่นเพียงไม่กี่อย่างที่พวกเขาต้องการเพิ่มการเรียบเรียงเพลงอัตโนมัตินั้นดีมาก แต่สำหรับพวกเราที่อาจมีฟังก์ชั่นผู้ช่วยจำนวนมากต้องมีการจัดระเบียบไฟล์หลายไฟล์ วิธีการแก้ปัญหานี้เป็นสิ่งที่ฉันทำใน L4 ยกเว้นว่าฉันลงทะเบียนไฟล์ในไฟล์ของฉันstart.php(ซึ่งไม่ดี แต่ให้บริการตามวัตถุประสงค์ในขณะนั้น) คุณมีคำแนะนำอื่นสำหรับการโหลดหลายไฟล์หรือไม่?
แอนดรูว์บราวน์

7
หากคุณมีหลายไฟล์ให้เพิ่มทั้งหมดลงในไฟล์ผู้แต่งของคุณ เพิ่มแม้แต่ 5-10 เส้นมีทำให้ทางความรู้สึกมากกว่าสิ่งที่คุณได้ที่นี่
Joseph Silber

22
ฉันคิดว่าเทคนิคนี้มีข้อดีมากมาย มันสวยงามและมีประสิทธิภาพเพราะคุณไม่จำเป็นต้องยุ่งกับไฟล์ composer.json ทุกครั้งที่คุณสร้างไฟล์ตัวช่วย
impeto

8
ทางออกที่ดีจริงๆ สิ่งเดียวที่ฉันไม่เห็นด้วยคือวิธีที่คุณเพิ่มไฟล์ฉันคิดว่าควรเป็นผู้ทำแผนที่แทนโดยที่เราเพิ่มชื่อไฟล์ที่เราต้องการโหลด คิดว่าผิดพลาด! หากมีผู้ช่วยเพียงคนเดียวในไฟล์ใดไฟล์หนึ่งที่ล้มเหลวคุณควรลบออกทั้งหมดหรือทำให้ไซต์เสียหายจนกว่าคุณจะแก้ไขได้
Pablo Ezequiel Leone

3
คุณใช้เนมสเปซ App \ Providers หรือไม่ ฉันเรียกผู้ช่วยนั้นจากคอนโทรลเลอร์และดูได้อย่างไร ขออภัยไม่มีคำถาม
Cengkaruk

79

นี่คือสิ่งที่แนะนำโดยJeffreyWayในการสนทนา Laracastsนี้

  1. ภายในapp/Httpไดเรกทอรีของคุณสร้างhelpers.phpไฟล์และเพิ่มฟังก์ชั่นของคุณ
  2. ภายในcomposer.jsonในบล็อกเพิ่มautoload"files": ["app/Http/helpers.php"]
  3. composer dump-autoloadวิ่ง

15
ผู้ช่วยเหลืออาจไม่ใช่ HTTP เท่านั้น app/helpers.phpหรือapp/Helpers/ดูเหมือนจะเป็นสถานที่ที่ดีกว่า
sepehr

1
ถ้าเราอยู่บนเซิร์ฟเวอร์ที่ใช้ร่วมกันและไม่มีตัวเลือกให้ใช้composer dump-autoload ?
user3201500

@ user3201500 ที่เป็นคำถามอื่นและคุณอาจต้องทำด้วยตนเองหากคุณต้องการทำตามคำตอบข้างต้น หรือคุณสามารถเลือกจากคำตอบอื่น ๆ และเพื่อสะท้อนให้เห็นด้วยตนเองcomposer dump-autoloadคุณอาจทำตามนี้: developed.be/2014/08/29/composer-dump-autoload-laravel
itsazzad

55

หลังจากได้รับคำตอบที่หลากหลายใน SO และ Google แล้วฉันยังหาวิธีที่เหมาะสมไม่ได้ คำตอบส่วนใหญ่แนะนำให้เราออกจากแอปพลิเคชันและพึ่งพาเครื่องมือของบุคคลที่สามนักแต่งเพลงในการทำงาน แต่ฉันไม่เชื่อว่าการเชื่อมต่อกับเครื่องมือเพียงเพื่อรวมไฟล์นั้นเป็นเรื่องที่ฉลาด

คำตอบของ Andrew Brownนั้นใกล้เคียงที่สุดกับที่ฉันคิดว่าควรจะเข้าหา แต่ (อย่างน้อยใน 5.1) ขั้นตอนการให้บริการไม่จำเป็น คำตอบของ Heisianเน้นการใช้งานPSR-4ซึ่งทำให้เราใกล้ขึ้นหนึ่งก้าว นี่คือการใช้งานครั้งสุดท้ายของฉันสำหรับผู้ช่วยในมุมมอง:

ขั้นแรกสร้างไฟล์ตัวช่วยได้ทุกที่ในไดเรกทอรีแอพของคุณด้วยเนมสเปซ:

namespace App\Helpers;

class BobFinder
{
    static function bob()
    {
        return '<strong>Bob?! Is that you?!</strong>';
    }
}

ถัดไปนามแฝงคลาสของคุณconfig\app.phpในaliasesอาร์เรย์:

'aliases' => [
    // Other aliases
    'BobFinder' => App\Helpers\BobFinder::class
]

และนั่นคือทั้งหมดที่คุณต้องทำ PSR-4และนามแฝงควรแสดงตัวช่วยให้กับมุมมองของคุณดังนั้นในมุมมองของคุณหากคุณพิมพ์:

{!! BobFinder::bob() !!}

มันควรจะออก:

<strong>Bob?! Is that you?!</strong>

ขอบคุณที่โพสต์ข้อความนี้ เป็น @ Dan-Hunsaker ชี้ให้เห็นในการแก้ปัญหาของฉันเรายังไม่ได้จบลงด้วยฟังก์ชั่นทั่วโลก namespaced {!! bob() !!}คือความสามารถในการเขียนเพียง จะทำการค้นหาเพิ่มเติมและดูว่าเป็นไปได้ไหม
heisian

1
ฉันคิดเกี่ยวกับเรื่องนี้มากขึ้นและการพยายามทำให้bob()โลกอย่างแท้จริงนั้นไม่ใช่สิ่งที่ควรทำ Namespaces มีไว้สำหรับเหตุผลและเราไม่ควรเรียกใช้bob()ควบคู่ไปกับฟังก์ชั่น PHP พื้นฐาน ฉันจะเพิ่มชื่อแทนของคุณในรหัสของฉัน - ขอบคุณ!
# # Heisian

1
ฉันคิดว่านี่เป็นสิ่งที่ดีที่สุดของทั้งหมด
Jimmy Obonyo Abor

ทำไมถึงมีextends Helper? ดูเหมือนไม่จำเป็นสำหรับฉัน
bernie

@bernie @ user3201500 ทีมขอโทษฉันมีชั้นผู้ช่วยพื้นฐานของฉันที่ผู้ช่วยของฉันทั้งหมดสืบทอดมาจาก; extends Helperเป็นจริงไม่จำเป็น ขอบคุณสำหรับหัวขึ้น.
dKen

31

คำสั่งของ Blade แบบกำหนดเองใน Laravel 5

ใช่มีวิธีอื่นในการทำเช่นนี้!

ขั้นตอนที่ 1:ลงทะเบียนคำสั่ง Blade ที่กำหนดเอง:

<?php // code in app/Providers/AppServiceProvider.php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

use Blade; // <-- This is important! Without it you'll get an exception.

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
     public function boot()
     {
         // Make a custom blade directive:
         Blade::directive('shout', function ($string) {
             return trim(strtoupper($string), '(\'\')');
         });

         // And another one for good measure:
         Blade::directive('customLink', function () {
             return '<a href="#">Custom Link</a>';
         });
     }
    ...

ขั้นตอนที่ 2:ใช้คำสั่ง Blade ที่กำหนดเองของคุณ:

<!-- // code in resources/views/view.blade.php -->

@shout('this is my custom blade directive!!')
<br />
@customLink

ขาออก:

นี่คือใบขับขี่ของฉันเอง !!
ลิงก์ที่กำหนดเอง


ที่มา: https://laravel.com/docs/5.1/blade#extending-blade

อ่านเพิ่มเติม: https://mattstauffer.co/blog/custom-conditionals-with-laravels-blade-directives


หากคุณต้องการเรียนรู้วิธีสร้างคลาสที่กำหนดเองที่ดีที่สุดที่คุณสามารถใช้ได้ทุกที่ให้ดูที่คลาสที่กำหนดเองใน Laravel 5 วิธีที่ง่าย


ควรทำเครื่องหมายคำตอบที่ดีที่สุดเนื่องจากคำถามคือ "เพื่อหลีกเลี่ยงการทำซ้ำรหัสระหว่างบางมุมมอง" คำหลักคือ VIEWS :)
Aleksandrs

23

นี่คือไฟล์ HelpersProvider.php ของฉัน:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class HelperServiceProvider extends ServiceProvider
{
    protected $helpers = [
        // Add your helpers in here
    ];

    /**
     * Bootstrap the application services.
     */
    public function boot()
    {
        //
    }

    /**
     * Register the application services.
     */
    public function register()
    {
        foreach ($this->helpers as $helper) {
            $helper_path = app_path().'/Helpers/'.$helper.'.php';

            if (\File::isFile($helper_path)) {
                require_once $helper_path;
            }
        }
    }
}

คุณควรสร้างโฟลเดอร์ที่เรียกว่าHelpersภายใต้appโฟลเดอร์จากนั้นสร้างไฟล์ที่เรียกว่าwhatever.phpข้างในและเพิ่มสตริงwhateverภายใน $ helpers array

ทำ!

แก้ไข

ฉันไม่ได้ใช้ตัวเลือกนี้อีกต่อไปฉันกำลังใช้ผู้แต่งเพื่อโหลดไฟล์สแตติกเช่นผู้ช่วย

คุณสามารถเพิ่มผู้ช่วยเหลือได้โดยตรงที่:

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

มีเหตุผลอื่นนอกจากประสิทธิภาพในการสร้าง mapper แทนการโหลดไฟล์ทั้งหมดในไดเรกทอรีด้วยglob()อย่างที่ Andrew Brown เขียนไว้หรือไม่ หากคุณต้องการระบุไฟล์ที่คุณต้องการรวมทำไมไม่ระบุไฟล์ในไฟล์composer.jsonเพื่อโหลดโดยอัตโนมัติตามที่โจเซฟซิลเบอร์เขียน ทำไมคุณถึงชอบวิธีนี้ ฉันไม่ได้บอกว่านี่เป็นทางออกที่ไม่ดีฉันแค่อยากรู้อยากเห็น
Pelmered

3
ง่ายกว่าด้วยวิธีการที่แมปเพื่อเปิดใช้งาน / ปิดใช้งานตัวช่วยเลือกตัวอย่างเช่นไฟล์ตัวช่วยหนึ่งไฟล์มีข้อผิดพลาดร้ายแรง ที่กล่าวไว้ว่าการทำแผนที่ไฟล์ในผู้ให้บริการไม่แตกต่างจากการทำเช่นนั้นมากนักcomposer.jsonยกเว้นสองจุด - อันดับแรกมันจะเก็บแผนที่ภายในแอปพลิเคชันนั้นเองแทนที่จะเป็นไฟล์ข้อมูลเมตา สองไม่จำเป็นต้องให้คุณเรียกใช้ซ้ำcomposer dump-autoloadทุกครั้งที่คุณเปลี่ยนรายการไฟล์ที่จะโหลด
Dan Hunsaker

ไม่จำเป็นต้องใช้includeหรือrequireLaravel มีการโหลดอัตโนมัติ PSR-4 ในตัวแล้ว: php-fig.org/psr/psr-4
heisian

1
การใช้ PSR-4 และผู้แต่งจะไม่อนุญาตให้คุณเปิด / ปิดตัวช่วยเหลือ
Pablo Ezequiel Leone

@PabloEzequielLeone และฉันจะใช้ภายในคอนโทรลเลอร์หรือไฟล์เบลดได้อย่างไร นี่เป็นตัวเลือกที่ดีที่สุดหากคุณกังวลว่าจะไม่โหลดตัวช่วยทั้งหมดสำหรับตัวควบคุมทุกครั้ง แต่ไม่เหมาะสำหรับผู้เริ่มต้นใน Laravel (เหมือนตัวเอง)
VinGarcia

12

สำหรับ Custom Helper Libraries ในโครงการ Laravel ของฉันฉันได้สร้างโฟลเดอร์ที่มีชื่อLibrariesในLaravel/AppDirectory ของฉันและในDirectory Libraries ฉันได้สร้างไฟล์ต่าง ๆ สำหรับห้องสมุดผู้ช่วยเหลือที่แตกต่างกัน

หลังจากสร้างไฟล์ผู้ช่วยเหลือของฉันฉันก็รวมไฟล์เหล่านั้นทั้งหมดในไฟล์ผู้แต่งของฉันเช่นนี้

...
"autoload": {
        "classmap": [
            "database"
        ],
        "files": [
            "app/Libraries/commonFunctions.php"
        ],
        "psr-4": {
            "App\\": "app/"
        }
    },
...

และดำเนินการ

composer dump-autoload

composer dump-autoloadและcomposer dumpautoloadยังทำงาน Infact composer duจะทำงาน ...
Akshay Khale

10

เนื่องจาก OP ขอแนวทางปฏิบัติที่ดีที่สุดฉันคิดว่าเรายังขาดคำแนะนำดีๆอยู่ที่นี่

ไฟล์helpers.phpเดียวอยู่ไกลจากแนวปฏิบัติที่ดี ประการแรกเนื่องจากคุณผสมผสานฟังก์ชั่นที่แตกต่างกันมากมายดังนั้นคุณจึงไม่เห็นด้วยกับหลักการเข้ารหัสที่ดี นอกจากนี้อาจจะทำร้ายไม่ได้เป็นเพียงเอกสารรหัส แต่ยังชี้วัดรหัสเช่นCyclomatic ซับซ้อน , ดัชนีการบำรุงรักษาและสคีดไดรฟ์ ยิ่งคุณมีฟังก์ชั่นมากก็ยิ่งแย่

รหัสเอกสารจะตกลงใช้เครื่องมือเช่นphpDocumentorแต่ใช้Samiมันจะไม่ทำให้ไฟล์ขั้นตอน Laravel API เป็นกรณีดังกล่าว - ไม่มีเอกสารประกอบการทำงานของผู้ช่วยเหลือ: https://laravel.com/api/5.4

ตัวชี้วัดรหัสสามารถวิเคราะห์ด้วยเครื่องมือเช่นPhpMetrics ใช้ PhpMetrics รุ่น 1.x การวิเคราะห์ Laravel รหัส 5.4 กรอบจะทำให้คุณ CC / ตัวชี้วัด MI / HV ที่เลวร้ายมากสำหรับทั้งsrc / สว่าง / มูลนิธิ / helpers.phpและsrc / สว่าง / Support / helpers.phpไฟล์

ไฟล์ตัวช่วยบริบทหลายไฟล์ (เช่นstring_helpers.php , array_helpers.phpฯลฯ ) จะช่วยปรับปรุงการวัดที่ไม่ดีเหล่านั้นอย่างแน่นอนทำให้โค้ดง่ายขึ้น ขึ้นอยู่กับตัวสร้างเอกสารรหัสที่ใช้สิ่งนี้จะดีพอ

มันสามารถปรับปรุงเพิ่มเติมโดยใช้คลาสตัวช่วยด้วยวิธีการคงที่เพื่อให้พวกเขาสามารถบริบทโดยใช้เนมสเปซ เช่นเดียวกับวิธี Laravel แล้วจะมีIlluminate\Support\StrและIlluminate\Support\Arrชั้นเรียน สิ่งนี้ช่วยปรับปรุงทั้งการวัดรหัส / องค์กรและเอกสาร นามแฝงของคลาสสามารถใช้เพื่อทำให้ง่ายต่อการใช้

การสร้างโครงสร้างด้วยคลาสทำให้การจัดระเบียบโค้ดและเอกสารดีขึ้น แต่ในทางกลับกันเราสิ้นสุดการทำหน้าที่ส่วนกลางที่สั้นและง่ายต่อการจดจำ เราสามารถปรับปรุงวิธีการต่อไปได้โดยการสร้างฟังก์ชันนามแฝงกับวิธีการเรียนคงที่เหล่านั้น ซึ่งสามารถทำได้ด้วยตนเองหรือแบบไดนามิก

Laravel ใช้วิธีแรกภายในโดยการประกาศฟังก์ชั่นในไฟล์ตัวช่วยขั้นตอนที่แมปไปยังวิธีการเรียนแบบคงที่ สิ่งนี้อาจไม่ใช่สิ่งที่สมบูรณ์แบบในขณะที่คุณต้องการประกาศเนื้อหาทั้งหมดอีกครั้ง (docblocks / อาร์กิวเมนต์)
ฉันเองใช้วิธีการแบบไดนามิกกับHelperServiceProviderคลาสที่สร้างฟังก์ชั่นเหล่านั้นในเวลาดำเนินการ:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class HelperServiceProvider extends ServiceProvider
{
    /**
     * The helper mappings for the application.
     *
     * @var array
     */
    protected $helpers = [
        'uppercase' => 'App\Support\Helpers\StringHelper::uppercase',
        'lowercase' => 'App\Support\Helpers\StringHelper::lowercase',
    ];

    /**
     * Bootstrap the application helpers.
     *
     * @return void
     */
    public function boot()
    {
        foreach ($this->helpers as $alias => $method) {
            if (!function_exists($alias)) {
                eval("function {$alias}(...\$args) { return {$method}(...\$args); }");
            }
        }
    }

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

หนึ่งสามารถพูดได้ว่านี่เป็นงานวิศวกรรม แต่ฉันไม่คิดอย่างนั้น มันใช้งานได้ดีและตรงกันข้ามกับสิ่งที่คาดหวังว่าจะไม่เสียเวลาในการดำเนินการที่เกี่ยวข้องอย่างน้อยเมื่อใช้ PHP 7.x


8

นี่เป็นสคริปเชลล์ bash ที่ฉันสร้างขึ้นเพื่อทำให้ Laravel 5 facades อย่างรวดเร็ว

รันสิ่งนี้ในไดเร็กทอรีการติดตั้ง Laravel 5 ของคุณ

เรียกว่าเป็นแบบนี้:

make_facade.sh -f <facade_name> -n '<namespace_prefix>'

ตัวอย่าง:

make_facade.sh -f helper -n 'App\MyApp'

หากคุณเรียกใช้ตัวอย่างนั้นมันจะสร้างไดเรกทอรีFacadesและProvidersภายใต้ 'your_laravel_installation_dir / app / MyApp'

มันจะสร้างไฟล์ 3 ไฟล์ต่อไปนี้และจะส่งออกไปยังหน้าจอ:

./app/MyApp/Facades/Helper.php
./app/MyApp/Facades/HelperFacade.php
./app/MyApp/Providers/HelperServiceProvider.php

หลังจากเสร็จสิ้นมันจะแสดงข้อความที่คล้ายกับข้อความต่อไปนี้:

===========================
    Finished
===========================

Add these lines to config/app.php:
----------------------------------
Providers: App\MyApp\Providers\HelperServiceProvider,
Alias: 'Helper' => 'App\MyApp\Facades\HelperFacade',

ดังนั้นอัปเดตรายการผู้ให้บริการและชื่อแทนใน 'config / app.php'

วิ่ง composer -o dumpautoload

"./app/MyApp/Facades/Helper.php" จะมีลักษณะดังนี้:

<?php

namespace App\MyApp\Facades;


class Helper
{
    //
}

ตอนนี้เพียงเพิ่มวิธีการของคุณใน "./app/MyApp/Facades/Helper.php"

นี่คือสิ่งที่ "./app/MyApp/Facades/Helper.php" ดูเหมือนหลังจากที่ฉันเพิ่มฟังก์ชัน Helper

<?php

namespace App\MyApp\Facades;

use Request;

class Helper
{
    public function isActive($pattern = null, $include_class = false)
    {
        return ((Request::is($pattern)) ? (($include_class) ? 'class="active"' : 'active' ) : '');
    }
}

This is how it would be called:
===============================

{!!  Helper::isActive('help', true) !!}

ฟังก์ชั่นนี้คาดหวังรูปแบบและสามารถยอมรับอาร์กิวเมนต์บูลีนที่สองหรือไม่ก็ได้

หาก URL ปัจจุบันตรงกับรูปแบบที่ส่งไปจะมีการส่งออก 'active' (หรือ 'class = "active"' ถ้าคุณเพิ่ม 'true' เป็นอาร์กิวเมนต์ที่สองในการเรียกใช้ฟังก์ชัน)

ฉันใช้เพื่อเน้นเมนูที่ใช้งานอยู่

ด้านล่างเป็นรหัสที่มาสำหรับสคริปต์ของฉัน ฉันหวังว่าคุณจะพบว่ามีประโยชน์และโปรดแจ้งให้เราทราบหากคุณมีปัญหากับมัน

#!/bin/bash

display_syntax(){
    echo ""
    echo "  The Syntax is like this:"
    echo "  ========================"
    echo "      "$(basename $0)" -f <facade_name> -n '<namespace_prefix>'"
    echo ""
    echo "  Example:"
    echo "  ========"
    echo "      "$(basename $0) -f test -n "'App\MyAppDirectory'"
    echo ""
}


if [ $# -ne 4 ]
then
    echo ""
    display_syntax
    exit
else
# Use > 0 to consume one or more arguments per pass in the loop (e.g.
# some arguments don't have a corresponding value to go with it such
# as in the --default example).
    while [[ $# > 0 ]]
    do
        key="$1"
            case $key in
            -n|--namespace_prefix)
            namespace_prefix_in="$2"
            echo ""
            shift # past argument
            ;;
            -f|--facade)
            facade_name_in="$2"
            shift # past argument
            ;;
            *)
                    # unknown option
            ;;
        esac
        shift # past argument or value
    done
fi
echo Facade Name = ${facade_name_in}
echo Namespace Prefix = $(echo ${namespace_prefix_in} | sed -e 's#\\#\\\\#')
echo ""
}


function display_start_banner(){

    echo '**********************************************************'
    echo '*          STARTING LARAVEL MAKE FACADE SCRIPT'
    echo '**********************************************************'
}

#  Init the Vars that I can in the beginning
function init_and_export_vars(){
    echo
    echo "INIT and EXPORT VARS"
    echo "===================="
    #   Substitution Tokens:
    #
    #   Tokens:
    #   {namespace_prefix}
    #   {namespace_prefix_lowerfirstchar}
    #   {facade_name_upcase}
    #   {facade_name_lowercase}
    #


    namespace_prefix=$(echo ${namespace_prefix_in} | sed -e 's#\\#\\\\#')
    namespace_prefix_lowerfirstchar=$(echo ${namespace_prefix_in} | sed -e 's#\\#/#g' -e 's/^\(.\)/\l\1/g')
    facade_name_upcase=$(echo ${facade_name_in} | sed -e 's/\b\(.\)/\u\1/')
    facade_name_lowercase=$(echo ${facade_name_in} | awk '{print tolower($0)}')


#   Filename: {facade_name_upcase}.php  -  SOURCE TEMPLATE
source_template='<?php

namespace {namespace_prefix}\Facades;

class {facade_name_upcase}
{
    //
}
'


#  Filename: {facade_name_upcase}ServiceProvider.php    -   SERVICE PROVIDER TEMPLATE
serviceProvider_template='<?php

namespace {namespace_prefix}\Providers;

use Illuminate\Support\ServiceProvider;
use App;


class {facade_name_upcase}ServiceProvider extends ServiceProvider {

    public function boot()
    {
        //
    }

    public function register()
    {
        App::bind("{facade_name_lowercase}", function()
        {
            return new \{namespace_prefix}\Facades\{facade_name_upcase};
        });
    }

}
'

#  {facade_name_upcase}Facade.php   -   FACADE TEMPLATE
facade_template='<?php

namespace {namespace_prefix}\Facades;

use Illuminate\Support\Facades\Facade;

class {facade_name_upcase}Facade extends Facade {

    protected static function getFacadeAccessor() { return "{facade_name_lowercase}"; }
}
'
}


function checkDirectoryExists(){
    if [ ! -d ${namespace_prefix_lowerfirstchar} ]
    then
        echo ""
        echo "Can't find the namespace: "${namespace_prefix_in}
        echo ""
        echo "*** NOTE:"
        echo "           Make sure the namspace directory exists and"
        echo "           you use quotes around the namespace_prefix."
        echo ""
        display_syntax
        exit
    fi
}

function makeDirectories(){
    echo "Make Directories"
    echo "================"
    mkdir -p ${namespace_prefix_lowerfirstchar}/Facades
    mkdir -p ${namespace_prefix_lowerfirstchar}/Providers
    mkdir -p ${namespace_prefix_lowerfirstchar}/Facades
}

function createSourceTemplate(){
    source_template=$(echo "${source_template}" | sed -e 's/{namespace_prefix}/'${namespace_prefix}'/g' -e 's/{facade_name_upcase}/'${facade_name_upcase}'/g' -e 's/{facade_name_lowercase}/'${facade_name_lowercase}'/g')
    echo "Create Source Template:"
    echo "======================="
    echo "${source_template}"
    echo ""
    echo "${source_template}" > ./${namespace_prefix_lowerfirstchar}/Facades/${facade_name_upcase}.php
}

function createServiceProviderTemplate(){
    serviceProvider_template=$(echo "${serviceProvider_template}" | sed -e 's/{namespace_prefix}/'${namespace_prefix}'/g' -e 's/{facade_name_upcase}/'${facade_name_upcase}'/g' -e 's/{facade_name_lowercase}/'${facade_name_lowercase}'/g')
    echo "Create ServiceProvider Template:"
    echo "================================"
    echo "${serviceProvider_template}"
    echo ""
    echo "${serviceProvider_template}" > ./${namespace_prefix_lowerfirstchar}/Providers/${facade_name_upcase}ServiceProvider.php
}

function createFacadeTemplate(){
    facade_template=$(echo "${facade_template}" | sed -e 's/{namespace_prefix}/'${namespace_prefix}'/g' -e 's/{facade_name_upcase}/'${facade_name_upcase}'/g' -e 's/{facade_name_lowercase}/'${facade_name_lowercase}'/g')
    echo "Create Facade Template:"
    echo "======================="
    echo "${facade_template}"
    echo ""
    echo "${facade_template}" > ./${namespace_prefix_lowerfirstchar}/Facades/${facade_name_upcase}Facade.php
}


function serviceProviderPrompt(){
    echo "Providers: ${namespace_prefix_in}\Providers\\${facade_name_upcase}ServiceProvider,"
}

function aliasPrompt(){
    echo "Alias: '"${facade_name_upcase}"' => '"${namespace_prefix_in}"\Facades\\${facade_name_upcase}Facade'," 
}

#
#   END FUNCTION DECLARATIONS
#


###########################
## START RUNNING SCRIPT  ##
###########################

display_start_banner

init_and_export_vars
makeDirectories 
checkDirectoryExists
echo ""

createSourceTemplate
createServiceProviderTemplate
createFacadeTemplate
echo ""
echo "==========================="
echo "  Finished TEST"
echo "==========================="
echo ""
echo "Add these lines to config/app.php:"
echo "----------------------------------"
serviceProviderPrompt
aliasPrompt
echo ""

8

แทนที่จะรวมคลาสตัวช่วยที่กำหนดเองของคุณคุณสามารถเพิ่มลงในconfig/app.phpไฟล์ภายใต้ชื่อแทนได้

ควรมีลักษณะเช่นนี้

 'aliases' => [ 
    ...
    ...
    'Helper' => App\Http\Services\Helper::class,
 ]

จากนั้นไปที่ Controller ของคุณให้รวม Helper โดยใช้เมธอด 'use Helper' เพื่อให้คุณสามารถเรียกวิธีการบางอย่างในคลาส Helper ของคุณ

eg. Helper::some_function();

หรือในมุมมองทรัพยากรคุณสามารถเรียกคลาส Helper ได้โดยตรง

eg. {{Helper::foo()}}

แต่นี่ยังคงเป็นวิธีการเขียนโปรแกรมสไตล์นักพัฒนาที่จะปฏิบัติตาม เราอาจมีวิธีที่แตกต่างกันในการแก้ปัญหาและฉันต้องการแบ่งปันสิ่งที่ฉันมีสำหรับผู้เริ่มต้นด้วย


4

สร้างไดเรกทอรีของผู้ช่วยเหลือที่กำหนดเอง: ขั้นแรกให้สร้างไดเรกทอรีผู้ช่วยเหลือในไดเรกทอรีแอป สร้างคำจำกัดความของคลาส hlper: ตอนนี้เรามาสร้างฟังก์ชั่นตัวช่วยง่ายๆที่จะต่อกันสองสาย สร้างไฟล์ใหม่ MyFuncs.php ใน /app/Helpers/MyFuncs.php เพิ่มรหัสต่อไปนี้

<?php

namespace App\Helpers;

class MyFuncs {

    public static function full_name($first_name,$last_name) {
        return $first_name . ', '. $last_name;   
    }
}

แอปเนมสเปซ \ ผู้ช่วยเหลือ กำหนด Helpers namespace ภายใต้ App namespace คลาส MyFuncs {…} กำหนดคลาสผู้ช่วย MyFuncs ฟังก์ชั่นคงที่สาธารณะ full_name ($ first_name, $ last_name) {…} กำหนดฟังก์ชั่นคงที่ยอมรับสองพารามิเตอร์สตริงและส่งกลับสตริงที่ตัดแบ่ง

บริการผู้ช่วยจัดเตรียมคลาส

ผู้ให้บริการจะใช้ในการโหลดคลาสอัตโนมัติ เราจะต้องกำหนดผู้ให้บริการที่จะโหลดคลาสตัวช่วยทั้งหมดของเราในไดเรกทอรี / app / Helpers

เรียกใช้คำสั่งช่างต่อไปนี้:

ช่าง PHP ทำ: ผู้ให้บริการ HelperServiceProvider

ไฟล์จะถูกสร้างขึ้นใน /app/Providers/HelperServiceProvider.php

Open /app/Providers/HelperServiceProvider.php

เพิ่มรหัสต่อไปนี้:

<?php 

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class HelperServiceProvider extends ServiceProvider {

   /**
    * Bootstrap the application services.
    *
    * @return void
    */
   public function boot()
   {
      //
   }

   /**
    * Register the application services.
    *
    * @return void
    */
   public function register()
   {
        foreach (glob(app_path().'/Helpers/*.php') as $filename){
            require_once($filename);
        }
   }
}

ที่นี่

namespace App\Providers; defines the namespace provider
use Illuminate\Support\ServiceProvider; imports the ServiceProvider class namespace
class HelperServiceProvider extends ServiceProvider {…} defines a class HelperServiceProvider that extends the ServiceProvider class
public function boot(){…} bootstraps the application service
public function register(){…} is the function that loads the helpers
foreach (glob(app_path().'/Helpers/*.php') as $filename){…} loops through all the files in /app/Helpers directory and loads them.

ตอนนี้เราต้องลงทะเบียน HelperServiceProvider และสร้างนามแฝงสำหรับผู้ช่วยเหลือของเรา

เปิด/config/app.phpไฟล์

ค้นหาตัวแปรอาร์เรย์ผู้ให้บริการ

เพิ่มบรรทัดต่อไปนี้

App\Providers\HelperServiceProvider::class,

ค้นหาตัวแปรอาร์เรย์ aliases

เพิ่มบรรทัดต่อไปนี้

'MyFuncs' => App\Helpers\MyFuncs::class,

บันทึกการเปลี่ยนแปลงโดยใช้ผู้ช่วยที่กำหนดเองของเรา

เราจะสร้างเส้นทางที่จะเรียกฟังก์ชั่นตัวช่วยที่กำหนดเองของเราเปิด /app/routes.php

เพิ่มคำจำกัดความของเส้นทางต่อไปนี้

Route::get('/func', function () {
    return MyFuncs::full_name("John","Doe");
});

ที่นี่

return MyFuncs::full_name("John","Doe"); calls the static function full_name in MyFuncs class

4

ขั้นแรกให้สร้าง helpers.php ภายในไดเรกทอรี App \ Http จากนั้นเพิ่มรหัสต่อไปนี้ภายใน composer.json

"autoload": {
        "classmap": [
            "database"
        ],
        "files": [
            "app/Http/helpers.php"
        ],
        "psr-4": {
            "App\\": "app/"
        }
    },

ถัดไปเรียกใช้คำสั่งต่อไปนี้

composer dump-autoload

ตอนนี้คุณสามารถกำหนดฟังก์ชั่นที่คุณกำหนดเองได้ในไฟล์ helpers.php


3

อีกวิธีที่ฉันใช้คือ: 1) สร้างไฟล์ใน app \ FolderName \ fileName.php และมีรหัสนี้อยู่ข้างในนั่นคือ

<?php
namespace App\library
{
 class hrapplication{
  public static function libData(){
   return "Data";
  }
 }
}
?>

2) หลังจากนั้นในใบมีดของเรา

 $FmyFunctions = new \App\FolderName\classsName;
  echo $is_ok = ($FmyFunctions->libData());

แค่นั้นแหละ. และมันใช้งานได้


3

วิธีปฏิบัติที่ดีที่สุดในการเขียนผู้ช่วยที่กำหนดเองคือ

1) ภายในappไดเรกทอรีของรูทโปรเจคให้สร้างโฟลเดอร์ชื่อ Helpers (เพื่อแยกและจัดโครงสร้างโค้ด)

2) ข้างในโฟลเดอร์เขียนไฟล์ psr-4 หรือไฟล์ php ปกติ

หากไฟล์ PHP อยู่ในรูปแบบของ psr-4 มันจะถูกโหลดโดยอัตโนมัติมิฉะนั้นให้เพิ่มบรรทัดต่อไปนี้ใน composer.json ซึ่งอยู่ในไดเรกทอรีรากโครงการ

ภายในautoloadคีย์สร้างคีย์ใหม่ที่ชื่อfilesเพื่อโหลดไฟล์ในเวลาที่โหลดอัตโนมัติภายในfilesวัตถุเพิ่มเส้นทางที่เริ่มต้นจากไดเรกทอรีแอปนี่คือตัวอย่าง

"autoload": {
    "classmap": [
        "database"
    ],
    "psr-4": {
        "App\\": "app/"
    },
    "files": [
        "app/Helpers/customHelpers.php"
    ]
},
"autoload-dev": {
    "classmap": [
        "tests/TestCase.php"
    ]
},

PS: ลองใช้งานcomposer dump-autoloadถ้าไฟล์ไม่ได้ถูกโหลดไว้


3

สร้าง Helpers.php ในแอพ / Helper / Helpers.php

namespace App\Helper
class Helpers
{


}

เพิ่มในการปรับปรุงผู้แต่งและผู้แต่ง

 "autoload": {
        "classmap": [
            "database/seeds",
            "database/factories",
            "database","app/Helper/Helpers.php"
        ],
        "psr-4": {
            "App\\": "app/"
        },
         "files": ["app/Helper/Helpers.php"]
    },

ใช้ในการควบคุม

ใช้ App \ Helper \ Helpers

ใช้ในมุมมอง การเปลี่ยนแปลงในไฟล์ config-> app.php

   'aliases' => [
    ...
    'Helpers'   => 'App\Helper\Helpers'
    ],

โทรในมุมมอง

<?php echo Helpers::function_name();  ?>

ขอบคุณคุณจะช่วยอธิบายเพิ่มเติมหน่อยได้ไหม?
Felipe Valdes

2
หากคลาสเนมสเปซการเพิ่มไฟล์ในcomposer.jsonนั้นไม่มีประโยชน์เนื่องจาก psr-4 autoload จะทำงานดังกล่าว
Arcesilas

2

ใน dir bootstrap \ autoload.php

require __DIR__.'/../vendor/autoload.php';
require __DIR__.'/../app/Helpers/function.php'; //add

เพิ่มไฟล์นี้

app\Helpers\function.php

2

**

  • ผู้ช่วยสถานะ

** สร้างผู้ช่วยใหม่

<?php

namespace App\Helpers;

use Illuminate\Database\Eloquent\Collection;

class StatusHelper
{
 protected static $_status = [
        1=> [
            'value' => 1,
            'displayName' => 'Active',
        ],
        2 => [
            'value' => 2,
            'displayName' => 'Inactive',
        ],
        3 => [
            'value' => 3,
            'displayName' => 'Delete',
        ],

    ];

     public static function getStatusesList()
    {
        $status = (new Collection(self::$_status))->pluck('displayName', 'value')->toArray();


        return $status;
    }
}

ใช้สำหรับตัวควบคุมและไฟล์มุมมองใด ๆ

use App\Helpers\StatusHelper;

class ExampleController extends Controller
{
        public function index()
        {
            $statusList = StatusHelper::getStatusesList();

            return view('example.index', compact('statusList'));
        }
}

0

ใน laravel 5.3 ขึ้นไปทีม laravel ย้ายไฟล์ขั้นตอนทั้งหมด ( routes.php) ออกจากapp/ไดเรกทอรีและapp/โฟลเดอร์ทั้งหมดจะถูกpsr-4โหลดอัตโนมัติ คำตอบที่ยอมรับจะใช้งานได้ในกรณีนี้ แต่มันก็ไม่เหมาะสม

ดังนั้นสิ่งที่ฉันทำคือฉันสร้างhelpers/ไดเรกทอรีที่รูทของโปรเจคและวางไฟล์ผู้ช่วยเหลือไว้ในนั้นและในcomposer.jsonไฟล์ของฉันฉันทำสิ่งนี้:

...
"autoload": {
    "classmap": [
        "database"
    ],
    "psr-4": {
        "App\\": "app/"
    },
    "files": [
        "helpers/ui_helpers.php"
    ]
},
...

ด้วยวิธีนี้ของฉัน app/ไดเรกทอรียังคงเป็น psr-4 ที่โหลดอัตโนมัติและผู้ช่วยเหลือจะได้รับการจัดระเบียบที่ดีขึ้นเล็กน้อย

หวังว่านี่จะช่วยใครซักคน


0

มีคำตอบที่ดีที่นี่ แต่ฉันคิดว่านี่เป็นวิธีที่ง่ายที่สุด ใน Laravel 5.4 (และรุ่นก่อนหน้าโพรบด้วย) คุณสามารถสร้างคลาสที่สะดวกสำหรับคุณเช่น App / Libraries / Helper.php

class Helper() {
    public function uppercasePara($str) {
        return '<p>' .strtoupper($str). '<p>;
    }
}

จากนั้นคุณสามารถเรียกมันได้ในเทมเพลต Blade ของคุณดังนี้:

@inject('helper', \App\Libraries\Helper)
{{ $helper->drawTimeSelector() }}

หากคุณไม่ต้องการใช้ @inject ให้ใช้ฟังก์ชัน 'uppercasePara' เป็นแบบสแตติกและฝังการโทรในเทมเพลต Blade ของคุณดังนี้:

{{ \App\Libraries\Helper::drawTimeSelector() }}

ไม่จำเป็นต้องใช้ชื่อแทน Laravel แก้ไขคลาสคอนกรีตโดยอัตโนมัติ

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