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 네임 스페이스 클래스 파일 아니기 때문에) 디렉토리, 당신은 무엇을 할 수 laravel.com를 저장 : 웹 사이트 않는 helpers.php 부트 스트랩 디렉토리에 . composer.json파일 에서 설정해야 합니다.

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

85
멍청한 놈을위한 팁 : composer.json을 변경 한 후이 명령을 사용하십시오. 작곡가 덤프 자동로드
Allfarid Morales García

11
@ AllfaridMoralesGarcía 또는 아마도 '유용한 팁, 대답이 확실하지 않으므로 나중에이 작업을 수행해야합니다.'
매트 맥도날드

8
뷰 작성을 더 쉽게하기 위해 도우미 함수를 승인했지만 다른 답변에서이 답변이 얼마나 많이 참조되는지 싫어합니다. 나를 잘못 이해하지 마라. 그것은 좋은 대답이며 정확하다. 사람들이 그것을 남용하고 잘못 작성되고 체계적으로 기능없는 PHP를 다시 작성하기를 두려워합니다.
andrewtweber

39
이 접근법을 이해하지 못합니다. Composer는 라이브러리를 포함하는 도구입니다. Laravel은 라이브러리없이 완벽하게 작동하고 Laravel 없이는 Composer입니다. 이 제안은 앱 내에서 파일을 만들고, 앱을 떠나고, Composer로 이동하고, Composer에게 앱으로 돌아가서 파일을 포함하도록 지시합니다. 라 라벨은 파일 포함을 명확하게 처리합니다. 왜 우리는 라 라벨의 기본 구현을 포기하고이 외부 도구를 사용하여 파일을 포함 시켜서 애플리케이션을 더 작곡가에 결합시킬까요? 게으름입니까, 아니면 뭔가 빠졌습니까?
dKen

6
Laravel은 composer의 오토로더를 사용하여 의존하는 모든 라이브러리와 파일을 어디에 포함시킬 것인지 알고 있습니다. 이것은 bootstrap / autoload.php에서 참조되었습니다. 해당 파일의 주석을 읽으십시오. 이 방법은 파일에 대한 참조를 composer.json에 추가 한 다음 "덤프 자동로드"를 추가하여 Laravel이 찾을 수 있도록 작성기의 자동 로더를 재생성하는 것입니다. Composer의 "파일"컬렉션을 사용하면 라이브러리 나 깔끔하게 정리되지 않은 일회용 함수 파일을 추가 할 수 있습니다. "이 이상한 파일을 포함시켜야하는 방식"상황을위한 장소를 마련하는 것이 좋습니다.
필립 해링턴

370

쉬운 방법 Laravel 5의 사용자 정의 클래스

이 답변은 Laravel의 일반 사용자 정의 클래스에 적용됩니다 . 블레이드 별 답변에 대한 자세한 내용 은 Laravel 5의 사용자 정의 블레이드 지시문을 참조하십시오 .

1 단계 : 헬퍼 (또는 기타 사용자 정의 클래스) 파일을 작성하고 일치하는 네임 스페이스를 제공하십시오. 수업과 방법을 작성하십시오.

<?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
분명히,이 답변은 실제로 전역 네임 스페이스 함수 인 도우미를 다루지 않습니다. 대신 도우미를 클래스 메서드로 변환하는 것이 좋습니다. 이것은 일반적으로 최선의 접근 방법이지만 실제로 여기에 묻는 질문에 대답하지는 않으므로 다른 답변이 비교에 의해 너무 복잡합니다.
Dan Hunsaker

1
기능 도우미는 블레이드에서도 사용할 수 있음을 의미합니다. 블레이드에서이 기능을 어떻게 사용할 수 있습니까? 블레이드에서 Helper :: prettyJason (parameters)을 호출 할 수 없습니다.
MaXi32

@ MaXi32 당신은 aliases배열 아래에 클래스를 추가 할 수 있습니다 app/config.php: 'Helper' => App\Helpers\Helper::class, 그러면 Helper::prettyJson();블레이드를 잘 호출 할 수 있습니다 .
heisian

@ DanHunsaker는 질문에 직접 대답하기 위해 편집했으며 여전히 동일한 간단한 접근 방식입니다. 당신은 또한 자신 만의 커스텀 블레이드 지시어를 작성할 수 있습니다 : stackoverflow.com/questions/28290332/…
heisian

1
예, 프레임 워크를 한 번 파헤 쳐서 도우미를 어디로 끌어 들였는지 알았습니다. 다시 한 번, 네임 스페이스 정적 클래스의 메소드가 대부분 요청되거나 권장되는 것보다 훨씬 깨끗하다는 데 완전히 동의합니다. 사실, 도우미는 실제로 라 라벨 방식이 아니라 아직 단계적으로 폐지되지 않은 CodeIgniter 2.x의 인수입니다. 따라서이 접근법에 대한 나의 pedantry는 요청대로 OP에 정확하게 대답하지 않는 것이 도우미를 얻지 않고 오히려 더 나은 것을 얻는 사실을 강조하려는 시도입니다.
Dan Hunsaker

315

내 초기 생각은 작곡가 자동로드이기도했지만 Laravel 5ish는별로 느끼지 못했습니다. L5는 서비스 제공 업체를 많이 사용하므로 응용 프로그램을 부트 스트랩합니다.

우선 app디렉토리에이라는 폴더를 만들었습니다 Helpers. 그런 다음 Helpers폴더 내에서 추가하려는 기능에 대한 파일을 추가했습니다. 여러 개의 파일이있는 폴더가 있으면 너무 길고 관리하기 어려운 큰 파일 하나를 피할 수 있습니다.

다음으로 HelperServiceProvider.phpartisan 명령을 실행하여를 만들었습니다 .

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 생성기로 사용자 정의 도우미를 만들 수 있습니다. 또한 응답자가 매퍼를 사용했을 때의 제안을 해결하고 사용자 정의 헬퍼를 명시 적으로 정의하여 헬퍼 디렉토리에 모든 PHP 파일을 자동으로로드하거나 기본적으로로드 할 수 있습니다. 피드백과 PR은 대단히 감사합니다!

composer require browner12/helpers

Github : Browner12 / 헬퍼


29
추가해야 할 기능이 적은 사람들에게는 작곡가 자동로드가 완벽하지만, 많은 도우미 기능이있는 사람들에게는 다중 파일 구성이 필수적입니다. 이 솔루션은 파일에 파일을 등록한 것을 제외하고는 본질적으로 L4에서 수행 한 것입니다 start.php(대단하지는 않지만 그 목적을 달성했습니다). 여러 파일을로드하기위한 다른 제안이 있습니까?
앤드류 브라운

7
파일이 여러 개인 경우 모두 composer.json 파일에 추가하십시오. 심지어 5 ~ 10 라인을 추가하면이 만드는 방법 당신이 여기있는 것보다 더 의미.
Joseph Silber 2019

22
이 기술에는 많은 장점이 있다고 생각합니다. 도우미 파일을 만들 때마다 composer.json 파일을 엉망으로 만들 필요가 없으므로 우아하고 효율적입니다.
impeto

8
정말 좋은 해결책입니다. 내가 동의하지 않는 유일한 것은 파일을 추가하는 방법입니다. 대신 매퍼가되어야한다고 생각합니다.로드 할 파일의 이름을 추가합니다. 오류를 생각하십시오! 실패한 파일 중 하나에 도우미가 하나만 있으면 모든 도구를 제거하거나 문제가 해결 될 때까지 사이트를 손상시켜야합니다.
Pablo Ezequiel Leone

3
App \ Providers 네임 스페이스를 사용합니까? 컨트롤러 및보기에서 도우미를 호출하는 방법. 죄송합니다, 멍청한 질문입니다.
Cengkaruk 2016 년

79

이것이이 라라 캐스트 토론JeffreyWay 에서 제안 된 것입니다 .

  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에 대한 다양한 답변을 조사했지만 여전히 최적의 접근 방식을 찾지 못했습니다. 대부분의 답변은 응용 프로그램을 종료하고 타사 도구 Composer를 사용하여 작업을 수행한다고 제안하지만 파일을 포함하기 위해 도구에 연결하는 것이 현명하다고 확신하지는 않습니다.

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가 내 솔루션에서 지적했듯이 우리는 여전히 글로벌 네임 스페이스 된 함수, 즉 간단히 쓸 수있는 것으로 끝나지 않았습니다 {!! bob() !!}. 더 많은 검색을 수행하고
이것이

1
나는 그것에 대해 더 많이 생각했고 bob()진정으로 세계화 하려고 노력 하는 것이 현명한 일이 아닙니다. 네임 스페이스는 이유가 있으므로 bob()기본 PHP 함수와 함께 호출해서는 안됩니다 . 내 코드에 앨리어싱 비트를 추가 할 것입니다-감사합니다!
heisian

1
나는 이것이 최고라고 생각한다
Jimmy Obonyo Abor

왜 거기에 extends Helper있습니까? 필요하지 않은 것 같습니다.
bernie

@bernie @ user3201500 죄송합니다. 모든 헬퍼가 상속 한 기본 헬퍼 클래스가 있습니다. 는 extends Helper실제로 필요하지 않습니다. 고마워요
dKen

31

Laravel 5의 커스텀 블레이드 지시어

예, 다른 방법이 있습니다!

1 단계 : 사용자 정의 블레이드 지시문을 등록합니다.

<?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 단계 : 사용자 정의 블레이드 지시문을 사용하십시오.

<!-- // 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.phpinside 라는 파일을 만들고 whatever$ helpers 배열 안에 문자열을 추가해야합니다 .

끝난!

편집하다

더 이상이 옵션을 사용하지 않고 도우미와 같은 정적 파일을로드하기 위해 작성기를 사용하고 있습니다.

다음에서 직접 도우미를 추가 할 수 있습니다.

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

glob()Andrew Brown이 쓴 것처럼 디렉토리의 모든 파일을로드하는 대신 매퍼를 만드는 성능 이외의 다른 이유가 있습니까? 포함 할 파일을 지정하려면 composer.jsonJoseph Silber가 작성한 것처럼 파일 을 자동로드하도록 파일을 지정하지 않겠습니까? 이 솔루션을 선호하는 이유는 무엇입니까? 나는 이것이 나쁜 해결책이라고 말하지 않고 단지 궁금하다.
Pelmered

3
예를 들어 도우미 파일 중 하나에 오류가 포함 된 경우 매핑 된 접근 방식을 사용하면 도우미를 선택적으로 활성화 / 비활성화하는 것이 더 쉽습니다. 즉, 서비스 제공 업체의 파일 매핑 composer.json은 두 가지 점 을 제외 하고는 그렇게하는 것과 크게 다르지 않습니다. 먼저 메타 데이터 파일이 아니라 응용 프로그램 자체 내에 맵을 유지합니다. 둘째, composer dump-autoload로드 할 파일 목록을 변경할 때마다 다시 실행할 필요가 없습니다 .
Dan Hunsaker

include또는 필요 없음 require, 라 라벨은 이미 내장 된 PSR-4 자동 로딩 기능을 가지고 있습니다 : php-fig.org/psr/psr-4
heisian

1
PSR-4와 작곡가를 사용하면 헬퍼를 켜거나 끌 수 없습니다.
Pablo Ezequiel Leone

@PabloEzequielLeone 및 컨트롤러 또는 블레이드 파일 내에서 어떻게 사용합니까? 매번 모든 컨트롤러에 대한 모든 도우미를로드하지 않는 것이 가장 좋은 옵션이지만 Laravel의 초보자에게는 좋지 않습니다 (나처럼).
VinGarcia

12

Laravel 프로젝트의 Custom Helper Libraries의 경우, 디렉토리와 Libraries 디렉토리에 이름 Libraries을 가진 폴더를 만들었고, Laravel/App다른 헬퍼 라이브러리에 대한 다양한 파일을 만들었습니다.

내 도우미 파일을 만든 후에는 다음 과 같이 composer.json 파일 에 모든 파일을 포함시킵니다.

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

실행

composer dump-autoload

composer dump-autoload그리고 composer dumpautoload또한 composer du
실제로

10

OP가 모범 사례를 요구했기 때문에 여전히 유용한 조언이 누락 된 것 같습니다.

하나의 helpers.php 파일은 좋은 습관과는 거리가 멀다. 첫째, 많은 종류의 기능을 혼합하기 때문에 좋은 코딩 원칙에 위배됩니다. 또한 이는 코드 문서뿐만 아니라 Cyclomatic Complexity , Maintenanceability IndexHalstead Volume 과 같은 코드 메트릭스를 손상 시킬 수 있습니다. 기능이 많을수록 더 나빠집니다.

코드 문서는 확인이 같은 도구를 사용하는 것입니다 phpDocumentor 만 사용 사미를절차 파일을 렌더링하지 않습니다 . 라 라벨 API 문서는 이와 같은 경우입니다. 헬퍼 함수 문서는 없습니다 : https://laravel.com/api/5.4

코드 메트릭은 PhpMetrics 와 같은 도구를 사용하여 분석 할 수 있습니다 . PhpMetrics 버전 1.x를 사용하여 Laravel 5.4 프레임 워크 코드를 분석하면 src / Illuminate / Foundation / helpers.phpsrc / Illuminate / Support / helpers.php 파일 모두에 대해 매우 나쁜 CC / MI / HV 메트릭이 제공 됩니다.

여러 상황에 맞는 헬퍼 파일 (예 : string_helpers.php , array_helpers.php 등)은 이러한 잘못된 메트릭을 확실히 개선하여 관리하기 쉬운 코드를 생성합니다. 사용 된 코드 문서 생성기에 따라 이것으로 충분합니다.

네임 스페이스를 사용하여 컨텍스트화할 수 있도록 정적 메소드와 함께 헬퍼 클래스를 사용하여 추가로 개선 할 수 있습니다. 그냥 Laravel 이미와 수행 방법을 좋아 Illuminate\Support\Str하고 Illuminate\Support\Arr수업. 이것은 코드 메트릭 / 조직 및 문서를 향상시킵니다. 클래스 별명을 사용하면 더 쉽게 사용할 수 있습니다.

클래스로 구조화하면 코드 구성 및 문서화가 향상되지만 다른 한편으로는 전역 기능을 짧고 기억하기 쉽게 잊어 버리게됩니다. 정적 클래스 메소드에 대한 함수 별명을 작성하여 해당 접근 방식을 추가로 개선 할 수 있습니다. 수동 또는 동적으로 수행 할 수 있습니다.

Laravel은 내부적으로 정적 클래스 메서드에 매핑되는 절차 도우미 파일에서 함수를 선언하여 첫 번째 방법을 사용합니다. 모든 내용을 다시 선언해야하기 때문에 이것이 이상적인 것은 아닙니다 (docblocks / arguments).
나는 개인적으로 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

Laravel 5 파사드를 매우 빠르게 만들기 위해 만든 bash 쉘 스크립트가 있습니다.

Laravel 5 설치 디렉토리에서이를 실행하십시오.

다음과 같이 호출하십시오.

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

예:

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

당신이 예제를 실행하면, 디렉토리 생성합니다 FacadesProviders'your_laravel_installation_dir / 응용 프로그램 / 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"에 메소드를 추가하십시오.

Helper 함수를 추가 한 후 "./app/MyApp/Facades/Helper.php"는 다음과 같습니다.

<?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'(또는 함수 호출의 두 번째 인수로 'true'를 추가하면 'class = "active"')가 출력됩니다.

사용중인 메뉴를 강조 표시하는 데 사용합니다.

아래는 내 스크립트의 소스 코드입니다. 도움이 되길 바랍니다. 문제가 있으면 알려주세요.

#!/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에 'use Helper'메소드를 사용하여 Helper를 포함 시키므로 Helper 클래스에서 일부 메소드를 간단히 호출 할 수 있습니다.

eg. Helper::some_function();

또는 리소스보기에서 이미 Helper 클래스를 직접 호출 할 수 있습니다.

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

그러나 이것은 여전히 ​​개발자 코딩 스타일 접근 방식입니다. 우리는 문제를 해결하는 다른 방법이있을 수 있으며 초보자에게도 가지고있는 것을 공유하고 싶습니다.


4

커스텀 헬퍼 디렉토리 만들기 : 먼저 app 디렉토리에 헬퍼 디렉토리를 만듭니다. hlper 클래스 정의 만들기 : 이제 두 문자열을 연결하는 간단한 도우미 함수를 만들어 보겠습니다. /app/Helpers/MyFuncs.php에 새 파일 MyFuncs.php를 만듭니다. 다음 코드를 추가하십시오.

<?php

namespace App\Helpers;

class MyFuncs {

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

네임 스페이스 App \ Helpers; 앱 네임 스페이스에서 헬퍼 네임 스페이스를 정의합니다. MyFuncs 클래스 {…}는 도우미 클래스 MyFuncs를 정의합니다. 공용 정적 함수 full_name ($ first_name, $ last_name) {…}은 두 개의 문자열 매개 변수를 허용하고 연결된 문자열을 리턴하는 정적 함수를 정의합니다.

헬퍼 서비스는 수업을 제공합니다

서비스 제공자는 클래스를 자동로드하는 데 사용됩니다. / app / Helpers 디렉토리에 모든 헬퍼 클래스를로드 할 서비스 제공자를 정의해야합니다.

다음 장인 명령을 실행하십시오.

PHP 장인 make : 제공자 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,

별칭 배열 변수를 찾습니다

다음 줄을 추가하십시오

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

맞춤형 도우미를 사용하여 변경 사항 저장

우리는 커스텀 헬퍼 함수 Open /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

먼저 App \ Http 디렉토리 안에 helpers.php를 만드십시오. 그런 다음 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오브젝트 안에 app 디렉토리에서 시작하는 경로를 추가하십시오. 여기에 예가 있습니다.

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

추신 : composer dump-autoload파일이로드되지 않은 경우 실행을 시도 하십시오.


3

app / Helper / Helpers.php에서 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.jsonpsr-4 자동로드가 작업을 수행하므로 파일을 추가하는 것은 쓸모가 없습니다.
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>;
    }
}

그런 다음 블레이드 템플릿에서 다음과 같이 간단히 호출 할 수 있습니다.

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

@inject를 사용하지 않으려면 'uppercasePara'기능을 정적으로 만들고 블레이드 템플릿에 다음과 같이 호출을 포함하십시오.

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

별칭이 필요하지 않습니다. Laravel은 구체적 클래스를 자동으로 해결합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.