Thực tiễn tốt nhất cho người trợ giúp tùy chỉnh trong Laravel 5 [đã đóng]


472

Tôi muốn tạo các hàm trợ giúp để tránh lặp lại mã giữa các chế độ xem trong Laravel 5:

view.blade.php

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

Về cơ bản chúng là các chức năng định dạng văn bản. Tôi có thể tạo một tập tin với các chức năng này ở đâu và như thế nào?

Câu trả lời:


595

Tạo một helpers.phptệp trong thư mục ứng dụng của bạn và tải nó lên với trình soạn thảo:

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

Sau khi thêm nó vào composer.jsontập tin của bạn , hãy chạy lệnh sau:

composer dump-autoload

Nếu bạn không thích giữ helpers.phptệp của mình trong appthư mục của mình (vì đó không phải là tệp lớp có tên PSR-4), bạn có thể thực hiện những gì laravel.comtrang web thực hiện: lưu trữ helpers.php trong thư mục bootstrap . Hãy nhớ đặt nó trong composer.jsontập tin của bạn :

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

86
Mẹo cho noobs: sử dụng lệnh này sau khi thay đổi composer.json. nhà soạn nhạc dump-autoload
Allfarid Morales García

11
@ AllfaridMoralesGarcía Hoặc có lẽ chỉ là 'Một mẹo hữu ích, vì câu trả lời không làm rõ bạn cần phải làm điều này sau đó'.
Matt McDonald

8
Tôi chấp nhận các chức năng của trình trợ giúp để làm cho các lượt xem dễ dàng hơn nhưng tôi ghét câu trả lời này được tham chiếu trong các câu trả lời khác. Đừng hiểu sai ý tôi, đó là một câu trả lời hay và chính xác, tôi chỉ sợ rằng mọi người sẽ lạm dụng nó và bắt đầu viết lại hàng tấn PHP được viết kém, tổ chức kém chức năng.
andrewtweber

39
Tôi không hiểu cách tiếp cận này. Trình soạn thảo được coi là một công cụ để bao gồm các thư viện: Laravel sẽ hoạt động hoàn hảo nếu không có nó và Trình soạn thảo không có Laravel. Đề xuất này cho chúng tôi biết để tạo một tệp trong ứng dụng của chúng tôi, rời khỏi ứng dụng của chúng tôi, đi tới Trình soạn thảo, yêu cầu nhà soạn nhạc quay lại ứng dụng của chúng tôi và bao gồm một tệp. Laravel xử lý rõ ràng việc bao gồm các tập tin, phải không? Tại sao chúng tôi lại từ bỏ việc triển khai riêng của Laravel và sử dụng công cụ bên ngoài này để bao gồm một tệp cho chúng tôi, do đó ghép ứng dụng của chúng tôi với Trình soạn thảo nhiều hơn? Là sự lười biếng, hay tôi đang thiếu một cái gì đó?
dKen

6
Laravel sử dụng trình tải tự động của nhà soạn nhạc để biết nơi bao gồm tất cả các thư viện và tệp mà nó dựa vào. Điều này được tham chiếu trong bootstrap / autoload.php. Đọc bình luận trong tập tin đó. Cách tiếp cận là thêm tham chiếu vào tệp vào composer.json, sau đó "dump autoload", giúp tái tạo trình tải tự động của nhà soạn nhạc để Laravel có thể tìm thấy nó. Sử dụng bộ sưu tập "tệp" của Nhà soạn nhạc là một cách tốt để thêm thư viện hoặc các tệp chức năng một lần không được gói gọn gàng trong các gói của nhà soạn nhạc. Thật tuyệt khi có một nơi dành cho tất cả các tình huống "nhân tiện tôi phải đưa vào một tập tin kỳ lạ" này.
Phillip Harrington

370

Các lớp tùy chỉnh trong Laravel 5, cách dễ dàng

Câu trả lời này có thể áp dụng cho các lớp tùy chỉnh chung trong Laravel. Để có câu trả lời cụ thể hơn cho Blade, hãy xem Chỉ thị Blade tùy chỉnh trong Laravel 5 .

Bước 1: Tạo tệp Người trợ giúp của bạn (hoặc lớp tùy chỉnh khác) và cung cấp cho nó một không gian tên phù hợp. Viết lớp và phương thức của bạn:

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

namespace App\Helpers;

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

Bước 2: Tạo bí danh:

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

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

Bước 3: Chạy composer dump-autoloadtrong root dự án

Bước 4: Sử dụng nó trong mẫu Blade của bạn:

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

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

Tín dụng bổ sung: Sử dụng lớp này ở bất cứ đâu trong ứng dụng Laravel của bạn:

<?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!!');
    }
    ...

Nguồn: http://www.php-fig.org/psr/psr-4/

Tại sao nó hoạt động: https://github.com/laravel/framework/blob/master/src/Illuminate/Support/ClassLoader.php

Trường hợp tự động tải bắt nguồn từ: http://php.net/manual/en/lingu.oop5.autoload.php


35
Để rõ ràng, câu trả lời này không thực sự liên quan đến người trợ giúp, đó là các chức năng được đặt tên toàn cầu. Thay vào đó, nó khuyến khích chuyển đổi người trợ giúp sang phương thức lớp. Đây thường là cách tiếp cận tốt nhất, nhưng thực tế không trả lời câu hỏi được hỏi ở đây, đó là lý do tại sao các câu trả lời khác rất phức tạp khi so sánh.
Dan Hunsaker

1
Trình trợ giúp chức năng có nghĩa là nó cũng có sẵn trong Blade. Làm thế nào để bạn thực hiện chức năng này trong lưỡi dao? Bạn không thể gọi Helper :: beautifulJason (tham số) trong lưỡi cắt.
MaXi32

@ MaXi32 bạn có thể thêm lớp dưới aliasesmảng trong app/config.php: 'Helper' => App\Helpers\Helper::class, Sau đó, bạn sẽ có thể gọi Helper::prettyJson();lưỡi kiếm tốt.
heisian

@DanHunaker đã chỉnh sửa để trả lời trực tiếp câu hỏi và đây vẫn là cách tiếp cận đơn giản. Bạn cũng có thể chỉ cần viết các chỉ thị lưỡi tùy chỉnh của riêng mình: stackoverflow.com/questions/28290332/
Khăn

1
Vâng, tôi đã đào qua khung một lần và tìm thấy nơi họ kéo người trợ giúp. Và một lần nữa, tôi hoàn toàn đồng ý rằng các phương thức của các lớp tĩnh được đặt tên là phù hợp hơn nhiều so với những gì được yêu cầu - hoặc được đề xuất - hầu hết thời gian. Thực tế là, những người trợ giúp không thực sự là Con đường của Rốn ngay từ đầu, mà là sự nắm giữ từ CodeIgniter 2.x vẫn chưa được loại bỏ. Vì vậy, nhà sư phạm của tôi về cách tiếp cận này không trả lời OP chính xác như đã hỏi là một nỗ lực để làm nổi bật thực tế là bạn không nhận được người trợ giúp, mà là một cái gì đó tốt hơn.
Dan Hunsaker

315

suy nghĩ ban đầu của tôi là trình soạn thảo tự động tải, nhưng nó không cảm thấy rất giống với tôi. L5 sử dụng rất nhiều Nhà cung cấp dịch vụ, họ là những gì khởi động ứng dụng của bạn.

Để bắt đầu, tôi đã tạo một thư mục trong thư mục của mình appđược gọi là Helpers. Sau đó, trong Helpersthư mục tôi đã thêm các tệp cho các chức năng tôi muốn thêm. Có một thư mục có nhiều tệp cho phép chúng tôi tránh một tệp lớn quá dài và không thể quản lý được.

Tiếp theo tôi tạo một HelperServiceProvider.phpbằng cách chạy lệnh thủ công:

artisan make:provider HelperServiceProvider

Trong registerphương thức tôi đã thêm đoạn trích này

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

cuối cùng đăng ký nhà cung cấp dịch vụ trong config/app.phpmảng nhà cung cấp của bạn

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

bây giờ bất kỳ tập tin trong Helpersthư mục của bạn đã được tải, và sẵn sàng để sử dụng.

CẬP NHẬT 2016 / 02-22

Có rất nhiều lựa chọn tốt ở đây, nhưng nếu câu trả lời của tôi có hiệu quả với bạn, tôi đã tiếp tục và thực hiện một gói bao gồm cả người trợ giúp theo cách này. Bạn có thể sử dụng gói cho cảm hứng hoặc thoải mái tải xuống với Trình soạn thảo. Nó có một số trình trợ giúp tích hợp mà tôi thường sử dụng (nhưng tất cả đều không hoạt động theo mặc định) và cho phép bạn tạo các trình trợ giúp tùy chỉnh của riêng bạn với một trình tạo Artisan đơn giản. Nó cũng giải quyết đề xuất mà một người trả lời đã sử dụng một trình ánh xạ và cho phép bạn xác định rõ ràng các trình trợ giúp tùy chỉnh để tải hoặc theo mặc định, tự động tải tất cả các tệp PHP trong thư mục trợ giúp của bạn. Phản hồi và PR được nhiều đánh giá cao!

composer require browner12/helpers

Github: browner12 / người trợ giúp


29
Đối với những người chỉ có một vài chức năng họ cần thêm, trình tải tự động của trình soạn thảo là hoàn toàn tốt, nhưng đối với những người trong chúng ta có thể có nhiều chức năng trợ giúp thì phải tổ chức nhiều tệp. giải pháp này về cơ bản là những gì tôi đã làm trong L4 ngoại trừ tôi đã đăng ký các tệp trong start.phptệp của mình (điều này không tuyệt vời, nhưng phục vụ mục đích của nó trong thời gian đó). Bạn có đề nghị nào khác để tải nhiều tập tin không?
Andrew Brown

7
Nếu bạn có nhiều tệp, hãy thêm tất cả chúng vào tệp composer.json của bạn. Thêm thậm chí 5-10 dòng có làm cách ý nghĩa hơn so với những gì bạn có ở đây.
Joseph Silber

22
Tôi nghĩ rằng kỹ thuật này có rất nhiều công đức. Thật thanh lịch và hiệu quả vì bạn không phải nhớ làm phiền với tệp composer.json mỗi khi bạn tạo tệp trợ giúp.
chấp nhận

8
Giải pháp thực sự tốt. Điều duy nhất tôi không đồng ý là cách bạn thêm các tệp, thay vào đó tôi nghĩ nên là một người lập bản đồ, nơi chúng tôi thêm tên của tệp mà chúng tôi muốn tải. Hãy suy nghĩ về lỗi! nếu chỉ có một người trợ giúp trong một trong các tệp bị lỗi, thì bạn nên xóa tất cả chúng hoặc để trang web bị hỏng cho đến khi bạn giải quyết nó.
Pablo Ezequiel Leone

3
Bạn có sử dụng không gian tên App \ Providers không? Làm thế nào tôi gọi người trợ giúp đó từ bộ điều khiển và xem. Xin lỗi, câu hỏi không.
Cengkaruk

79

Đây là những gì được đề xuất JeffreyWaytrong Cuộc thảo luận về Laracasts này .

  1. Trong app/Httpthư mục của bạn , tạo một helpers.phptệp và thêm các chức năng của bạn.
  2. Trong composer.json, trong autoloadkhối, thêm "files": ["app/Http/helpers.php"].
  3. Chạy đi composer dump-autoload.

15
Những người trợ giúp có thể không chỉ HTTP. app/helpers.phphoặc app/Helpers/dường như là một nơi tốt hơn.
sepehr

1
Điều gì xảy ra nếu chúng ta ở trên một máy chủ dùng chung và không có tùy chọn để sử dụng composer dump-autoload ?
user3201500

@ user3201500 đó là một câu hỏi khác và bạn có thể cần phải làm thủ công nếu bạn muốn làm theo câu trả lời ở trên. Hoặc bạn có thể chọn từ các câu trả lời khác. Và để phản ánh thủ công, composer dump-autoloadbạn có thể làm theo điều này: được phát
triển.be / 2014/08/29 / composer

55

Đã chọn lọc qua nhiều câu trả lời trên SO và Google, tôi vẫn không thể tìm thấy một cách tiếp cận tối ưu. Hầu hết các câu trả lời đề nghị chúng tôi rời khỏi ứng dụng và dựa vào công cụ soạn thảo của bên thứ 3 để thực hiện công việc, nhưng tôi không tin rằng việc kết hợp với một công cụ chỉ để bao gồm một tệp là khôn ngoan.

Câu trả lời của Andrew Brown gần nhất với cách tôi nghĩ nên tiếp cận, nhưng (ít nhất là trong 5.1), bước cung cấp dịch vụ là không cần thiết. Câu trả lời của Heisian nêu bật việc sử dụng PSR-4mang lại cho chúng ta một bước gần hơn. Đây là triển khai cuối cùng của tôi cho người trợ giúp trong quan điểm:

Đầu tiên, tạo một tệp trợ giúp ở bất cứ đâu trong thư mục ứng dụng của bạn, với một không gian tên:

namespace App\Helpers;

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

Tiếp theo, bí danh lớp của bạn trong config\app.php, trong aliasesmảng:

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

Và đó nên là tất cả những gì bạn cần làm. PSR-4và bí danh sẽ hiển thị người trợ giúp cho chế độ xem của bạn, vì vậy, trong chế độ xem của bạn, nếu bạn nhập:

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

Nó sẽ xuất ra:

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

cảm ơn vì đã đăng bài này như @ Dan-Hunsaker đã chỉ ra trong giải pháp của tôi, chúng tôi vẫn chưa kết thúc với một chức năng được đặt tên toàn cầu, tức là có thể viết đơn giản {!! bob() !!}. sẽ thực hiện thêm một số tìm kiếm và xem nếu điều đó là có thể
heisian

1
Tôi đã nghĩ về nó nhiều hơn và cố gắng để thực bob()sự toàn cầu sẽ không phải là một điều khôn ngoan để làm. Không gian tên là có lý do và chúng ta không nên gọi bob()bên cạnh các hàm PHP cơ bản. Tôi sẽ thêm bit bí danh của bạn vào mã của tôi - cảm ơn!
heisian

1
Tôi thấy điều này là tốt nhất trong tất cả
Jimmy Obonyo Abor

Tại sao có extends Helper? Nó dường như không cần thiết đối với tôi.
bernie

@bernie @ user3201500 Xin lỗi nhóm, tôi đã có lớp người trợ giúp cơ sở của riêng mình mà tất cả những người trợ giúp của tôi thừa hưởng từ; các extends Helperthực sự là không cần thiết. Cảm ơn cho những người đứng đầu lên.
dKen

31

Chỉ thị lưỡi tùy chỉnh trong Laravel 5

Vâng, có một cách khác để làm điều này!

Bước 1: Đăng ký một lệnh Blade tùy chỉnh:

<?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>';
         });
     }
    ...

Bước 2: Sử dụng chỉ thị Blade tùy chỉnh của bạn:

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

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

Đầu ra:

ĐÂY LÀ TRỰC TIẾP TÙY CHỈNH CỦA TÔI !!
Liên kết tùy chỉnh


Nguồn: https://laravel.com/docs/5.1/blade#extending-blade

Đọc thêm: https://mattstauffer.co/blog/custom-conditables-with-laravels-blade-directives


Nếu bạn muốn tìm hiểu cách tạo các lớp tùy chỉnh tốt nhất mà bạn có thể sử dụng ở bất cứ đâu , hãy xem Lớp tùy chỉnh trong Laravel 5, Cách dễ dàng


Điều này nên được đánh dấu câu trả lời tốt nhất, bởi vì câu hỏi là "để tránh lặp lại mã giữa một số lượt xem". Từ khóa là XEM. :)
Aleksandrs

23

Đây là tệp HelpersProvider.php của tôi:

<?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;
            }
        }
    }
}

Bạn nên tạo một thư mục được gọi Helperstrong appthư mục, sau đó tạo tệp được gọi whatever.phpbên trong và thêm chuỗi whateverbên trong mảng $ helpers.

Làm xong!

Biên tập

Tôi không còn sử dụng tùy chọn này nữa, hiện tôi đang sử dụng trình soạn thảo để tải các tệp tĩnh như người trợ giúp.

Bạn có thể thêm người trợ giúp trực tiếp tại:

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

Có bất kỳ lý do nào khác ngoài hiệu suất để tạo một trình ánh xạ thay vì tải tất cả các tệp trong thư mục với glob()như Andrew Brown đã viết không? Nếu bạn muốn có thể chỉ định các tệp mà bạn muốn đưa vào, tại sao không chỉ định các tệp trong composer.jsonđể tự động tải chúng như Joseph Silber đã viết? Tại sao bạn thích giải pháp này? Tôi không nói đây là một giải pháp tồi, tôi chỉ tò mò thôi.
Pelmered

3
Thật dễ dàng hơn, với cách tiếp cận được ánh xạ, để bật / tắt một cách có chọn lọc những người trợ giúp nếu, chẳng hạn, một trong những tệp trợ giúp có lỗi phá vỡ. Điều đó nói rằng, các tệp ánh xạ trong một nhà cung cấp dịch vụ không khác lắm so với làm như vậy composer.jsonngoại trừ hai điểm - đầu tiên, nó giữ bản đồ bên trong ứng dụng, thay vì tệp siêu dữ liệu; thứ hai, nó không yêu cầu bạn chạy lại composer dump-autoloadmỗi khi bạn thay đổi danh sách các tệp cần tải.
Dan Hunsaker

Không cần includehoặc require, Laravel đã tích hợp sẵn tính năng tự động tải PSR-4: php-fig.org/psr/psr-4
heisian

1
sử dụng PSR-4 và trình soạn thảo sẽ không cho phép bạn bật / tắt trợ giúp.
Pablo Ezequiel Leone

@PabloEzequielLeone và làm cách nào tôi sử dụng nó trong bộ điều khiển hoặc tập tin lưỡi cắt? Đây có vẻ là tùy chọn tốt nhất nếu bạn lo lắng về việc không tải tất cả các trợ giúp cho tất cả các bộ điều khiển mọi lúc, nhưng không tốt cho người mới bắt đầu ở Laravel (như bản thân tôi).
VinGarcia

12

Đối với Thư viện người trợ giúp tùy chỉnh trong dự án Laravel của tôi, tôi đã tạo một thư mục có tên Librariestrong Laravel/AppThư mục của mình và trong thư mục Thư viện, tôi đã tạo các tệp khác nhau cho các thư viện trợ giúp khác nhau.

Sau khi tạo các tệp trợ giúp của tôi, tôi chỉ cần bao gồm tất cả các tệp đó trong tệp composer.json của mình như thế này

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

và thực hiện

composer dump-autoload

composer dump-autoloadcomposer dumpautoloadcũng hoạt động nguyên vẹn composer ducũng sẽ hoạt động ...
Akshay Khale

10

Vì OP yêu cầu thực hành tốt nhất , tôi nghĩ chúng ta vẫn còn thiếu một số lời khuyên tốt ở đây.

Một tập tin helpers.php khác xa với một thực tiễn tốt. Thứ nhất bởi vì bạn pha trộn rất nhiều loại chức năng khác nhau, vì vậy bạn chống lại các nguyên tắc mã hóa tốt. Hơn nữa, điều này có thể làm tổn thương không chỉ tài liệu mã mà còn cả các số liệu mã như Độ phức tạp theo chu kỳ , Chỉ số duy trìKhối lượng Halstead . Càng nhiều chức năng bạn càng có nhiều nó trở nên tồi tệ.

Tài liệu mã sẽ được sử dụng các công cụ như phpDocumentor , nhưng sử dụng Sami,sẽ không hiển thị các tệp thủ tục . Tài liệu API của Laravel là một trường hợp như vậy - không có tài liệu về chức năng của người trợ giúp: https://laravel.com/api/5.4

Số liệu mã có thể được phân tích với các công cụ như PhpMetrics . Sử dụng PhpMetrics phiên bản 1.x để phân tích mã khung của Laravel 5.4 sẽ cung cấp cho bạn các số liệu CC / MI / HV rất tệ cho cả hai tệp src / Illuminate / Foundation / helpers.phpsrc / Illuminate / Support / helpers.php .

Nhiều tệp trợ giúp theo ngữ cảnh (ví dụ: string_helpers.php , Array_helpers.php , v.v.) chắc chắn sẽ cải thiện các số liệu xấu đó dẫn đến mã dễ dàng hơn để xác định. Tùy thuộc vào trình tạo tài liệu mã được sử dụng, điều này sẽ đủ tốt.

Nó có thể được cải thiện hơn nữa bằng cách sử dụng các lớp của trình trợ giúp với các phương thức tĩnh để chúng có thể được ngữ cảnh hóa bằng cách sử dụng các không gian tên. Giống như cách mà Laravel đã làm với Illuminate\Support\StrIlluminate\Support\Arrcác lớp học. Điều này cải thiện cả số liệu / tổ chức và tài liệu mã. Các bí danh lớp có thể được sử dụng để làm cho chúng dễ sử dụng hơn.

Cấu trúc với các lớp làm cho tổ chức mã và tài liệu tốt hơn, nhưng mặt khác, chúng ta cuối cùng lại mất đi những chức năng toàn cầu ngắn và dễ nhớ này. Chúng ta có thể cải thiện hơn nữa cách tiếp cận đó bằng cách tạo các bí danh hàm cho các phương thức lớp tĩnh đó. Điều này có thể được thực hiện bằng tay hoặc động.

Laravel sử dụng cách tiếp cận đầu tiên bằng cách khai báo các hàm trong các tệp của trình trợ giúp thủ tục ánh xạ tới các phương thức của lớp tĩnh. Đây có thể không phải là điều lý tưởng vì bạn cần phải phân phối lại tất cả mọi thứ (docblocks / argument).
Cá nhân tôi sử dụng một cách tiếp cận động với một HelperServiceProviderlớp tạo ra các hàm đó trong thời gian thực hiện:

<?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()
    {
        //
    }
}

Người ta có thể nói điều này là quá kỹ thuật nhưng tôi không nghĩ vậy. Nó hoạt động khá tốt và trái với những gì có thể được dự kiến, nó không tốn thời gian thực hiện có liên quan ít nhất là khi sử dụng PHP 7.x.


8

Đây là tập lệnh bash shell mà tôi đã tạo để tạo mặt tiền cho Laravel 5 rất nhanh.

Chạy cái này trong thư mục cài đặt Laravel 5 của bạn.

Gọi nó như thế này:

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

Thí dụ:

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

Nếu bạn chạy ví dụ đó, nó sẽ tạo các thư mục FacadesProviderstrong 'your_laravel_installation_dir / app / MyApp'.

Nó sẽ tạo 3 tệp sau và cũng sẽ xuất chúng ra màn hình:

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

Sau khi hoàn thành, nó sẽ hiển thị một thông báo tương tự như sau:

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

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

Vì vậy, hãy cập nhật danh sách Nhà cung cấp và Bí danh trong 'config / app.php'

Chạy composer -o dumpautoload

"./App/MyApp/Facades/Helper.php" ban đầu sẽ trông như thế này:

<?php

namespace App\MyApp\Facades;


class Helper
{
    //
}

Bây giờ chỉ cần thêm các phương thức của bạn vào "./app/MyApp/Facades/Helper.php".

Đây là "./app/MyApp/Facades/Helper.php" trông giống như sau khi tôi thêm chức năng Trình trợ giúp.

<?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) !!}

Hàm này mong đợi một mẫu và có thể chấp nhận một đối số boolean thứ hai tùy chọn.

Nếu URL hiện tại khớp với mẫu được truyền cho nó, nó sẽ xuất ra 'active' (hoặc 'class = "active"' nếu bạn thêm 'true' làm đối số thứ hai cho lệnh gọi hàm).

Tôi sử dụng nó để làm nổi bật menu đang hoạt động.

Dưới đây là mã nguồn cho kịch bản của tôi. Tôi hy vọng bạn thấy nó hữu ích và xin vui lòng cho tôi biết nếu bạn có bất kỳ vấn đề nào với nó.

#!/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

thay vì bao gồm lớp trình trợ giúp tùy chỉnh của bạn, bạn thực sự có thể thêm vào config/app.phptệp của mình dưới bí danh.

nên trông như thế này

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

và sau đó đến Trình điều khiển của bạn, bao gồm Trình trợ giúp bằng cách sử dụng phương thức 'sử dụng Trình trợ giúp' để bạn có thể gọi một số phương thức trên lớp Trình trợ giúp của mình.

eg. Helper::some_function();

hoặc trong chế độ xem tài nguyên, bạn có thể gọi trực tiếp lớp Trình trợ giúp.

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

Nhưng đây vẫn là cách tiếp cận phong cách mã hóa dành cho nhà phát triển được tuân theo. Chúng tôi có thể có cách giải quyết vấn đề khác nhau và tôi chỉ muốn chia sẻ những gì tôi có cho người mới bắt đầu.


4

Tạo thư mục người trợ giúp tùy chỉnh: Đầu tiên tạo thư mục Người trợ giúp trong thư mục ứng dụng. Tạo định nghĩa lớp hlper: Bây giờ chúng ta hãy tạo một hàm trợ giúp đơn giản sẽ nối hai chuỗi. Tạo một tệp mới MyFuncs.php trong /app/Helpers/MyFuncs.php Thêm mã sau đây

<?php

namespace App\Helpers;

class MyFuncs {

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

không gian tên Ứng dụng \ Người trợ giúp; định nghĩa không gian tên Người trợ giúp trong không gian tên Ứng dụng. class MyFuncs {Hoài} định nghĩa lớp MyFuncs của trình trợ giúp. Hàm tĩnh công khai full_name ($ first_name, $ last_name) {'}} định nghĩa một hàm tĩnh chấp nhận hai tham số chuỗi và trả về một chuỗi nối

Dịch vụ trợ giúp cung cấp lớp học

Các nhà cung cấp dịch vụ được sử dụng để tự động tải các lớp. Chúng tôi sẽ cần xác định một nhà cung cấp dịch vụ sẽ tải tất cả các lớp trợ giúp của chúng tôi trong thư mục / app / Helpers.

Chạy lệnh nghệ nhân sau:

Nghệ nhân php thực hiện: nhà cung cấp HelperServiceProvider

Các tập tin sẽ được tạo ra trong /app/Providers/HelperServiceProvider.php

Open /app/Providers/HelperServiceProvider.php

Thêm mã sau đây:

<?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);
        }
   }
}

ĐÂY,

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.

Bây giờ chúng ta cần đăng ký HelperServiceProvider và tạo bí danh cho người trợ giúp của chúng tôi.

Mở /config/app.phptập tin

Xác định vị trí biến mảng nhà cung cấp

Thêm dòng sau

App\Providers\HelperServiceProvider::class,

Xác định vị trí biến mảng bí danh

Thêm dòng sau

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

Lưu các thay đổi bằng cách sử dụng trình trợ giúp tùy chỉnh của chúng tôi

Chúng tôi sẽ tạo một tuyến sẽ gọi hàm trợ giúp tùy chỉnh của chúng tôi là Open /app/routes.php

Thêm định nghĩa tuyến đường sau

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

ĐÂY,

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

4

Đầu tiên tạo helpers.php trong thư mục App \ http. Sau đó thêm đoạn mã sau vào composer.json

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

Tiếp theo chạy lệnh sau

composer dump-autoload

Bây giờ bạn có thể xác định chức năng tùy chỉnh của mình bên trong tệp helpers.php.


3

Một cách khác mà tôi đã sử dụng là: 1) đã tạo một tệp trong app \ FolderName \ fileName.php và có mã này bên trong tức là

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

2) Sau đó trong lưỡi của chúng tôi

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

đó là nó. Và nó hoạt động


3

Thực hành tốt nhất để viết người trợ giúp tùy chỉnh là

1) Bên trong appthư mục của root dự án, tạo một thư mục có tên Helpers (Chỉ cần tách và cấu trúc mã).

2) Trong thư mục ghi tệp psr-4 hoặc tệp php bình thường

Nếu các tệp PHP có định dạng của psr-4 thì nó sẽ được tự động tải, nếu không thì thêm dòng sau vào composer.json nằm trong thư mục gốc của dự án

Bên trong autoloadkhóa, tạo một khóa mới có tên filesđể tải tệp tại thời điểm tải tự động, bên trong filesđối tượng thêm đường dẫn bắt đầu từ thư mục ứng dụng., Đây là một ví dụ.

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

PS: thử chạy composer dump-autoloadnếu tệp không được tải.


3

Tạo Helpers.php trong ứng dụng / Người trợ giúp / Người trợ giúp.php

namespace App\Helper
class Helpers
{


}

Thêm vào cập nhật nhà soạn nhạc và nhà soạn nhạc

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

sử dụng trong Bộ điều khiển

sử dụng Ứng dụng \ Người trợ giúp \ Người trợ giúp

sử dụng trong chế độ xem thay đổi trong tệp config-> app.php

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

gọi trong xem

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

Cảm ơn bạn, bạn có phiền mở rộng một chút về giải thích của bạn?
Felipe Valdes

2
Nếu lớp được đặt tên, việc thêm tệp vào composer.jsonlà vô ích, vì tự động tải psr-4 sẽ thực hiện công việc.
Arcesilas

2

trong thư mục bootstrap \ autoload.php

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

thêm tập tin này

app\Helpers\function.php

2

**

  • Trình trợ giúp trạng thái

** tạo người trợ giúp mới

<?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;
    }
}

Sử dụng cho bộ điều khiển và bất kỳ tập tin xem

use App\Helpers\StatusHelper;

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

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

0

Trong laravel 5.3 trở lên, nhóm laravel đã di chuyển tất cả các tệp thủ tục ( routes.php) ra khỏi thư mục app/và toàn bộ app/thư mục được psr-4tự động tải. Câu trả lời được chấp nhận sẽ hoạt động trong trường hợp này nhưng nó không phù hợp với tôi.

Vì vậy, những gì tôi đã làm là tôi đã tạo một helpers/thư mục ở thư mục gốc của dự án của mình và đặt các tệp trợ giúp bên trong đó, và trong composer.jsontệp của tôi, tôi đã làm điều này:

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

Bằng cách này, app/thư mục của tôi vẫn là một bản tự động tải psr-4, và những người trợ giúp được tổ chức tốt hơn một chút.

Hy vọng điều này sẽ giúp được ai đó.


0

Có một số câu trả lời tuyệt vời ở đây nhưng tôi nghĩ rằng đây là đơn giản nhất. Trong Laravel 5.4 (và cả các phiên bản trước đó nữa), bạn có thể tạo một lớp ở đâu đó thuận tiện cho bạn, ví dụ: Ứng dụng / Thư viện / Helper.php

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

Sau đó, bạn có thể chỉ cần gọi nó trong mẫu Blade của bạn như thế này:

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

Nếu bạn không muốn sử dụng @inject thì chỉ cần thực hiện chức năng 'chữ hoa' dưới dạng tĩnh và nhúng cuộc gọi vào mẫu Blade của bạn như thế này:

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

Không cần bí danh. Laravel tự động giải quyết lớp bê tông.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.