Laravel 5의 커스텀 헬퍼 모범 사례 [닫기]

Laravel 5의 뷰간에 코드가 반복되는 것을 피하기 위해 도우미 함수를 만들고 싶습니다.

view.blade.php

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

기본적으로 텍스트 형식화 기능입니다. 이러한 기능으로 파일을 어디서 어떻게 만들 수 있습니까?



답변

크리에이트 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"
]


답변

쉬운 방법 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


답변

내 초기 생각은 작곡가 자동로드이기도했지만 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 / 헬퍼


답변

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

  1. app/Http디렉토리 내 에서 helpers.php파일을 작성하고 기능을 추가하십시오.
  2. 내에서 composer.json의에서 autoload블록, 추가 "files": ["app/Http/helpers.php"].
  3. 를 실행하십시오 composer dump-autoload.

답변

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>


답변

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의 커스텀 클래스를 참조하십시오.


답변

이것은 내 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",
        ...
    ]
},
...