Laravel 4 헬퍼 및 기본 기능에 대한 모범 사례?


152

Laravel 4에서 전역 함수를 배치하는 가장 좋은 장소를 이해하려고합니다. 예를 들어 날짜 형식. 나는 정면이 너무 모듈식이 기 때문에 정면을 만드는 것이 가치가 있다고 생각하지 않습니다. 라이브러리 폴더를 만들고 클래스를 저장하는 방법에 대한 기사를 읽었지만 간단한 기능에는 많은 것 같습니다. 블레이드 템플릿에서 이와 같은 '도구'를 사용할 수 없어야합니까?

이와 같은 모범 사례는 무엇이며 블레이드 템플릿에서 어떻게 사용할 수 있습니까?

답변:


233

추악하고 게으르고 끔찍한 방법 :의 끝에 새 기능을 bootstrap/start.php추가하고 include('tools.php')새 파일에 넣으십시오.

깨끗한 방법 : 라이브러리를 만듭니다. 그렇게하면 실제로 사용할 때만 자동으로로드됩니다.

  • 크리에이트 libraries당신의 내부에 폴더를 app폴더
  • 라이브러리 파일을 만들고 클래스를 만들고 정적 함수를 추가하십시오.
  • 옵션 1 : 편집 하여 배열 start/global.php에 추가 app_path().'/libraries'합니다 ClassLoader::addDirectories(.
  • 옵션 2 : 편집 하여 배열 composer.json에 추가 "app/libraries"합니다 autoload. 운영composer dump-autoload
  • 뷰에서 클래스와 정적 함수를 호출하십시오.

global.php파일 에서 인용 한 옵션 정보

Composer를 사용하는 것 외에도 Laravel 클래스 로더를 사용하여 컨트롤러와 모델을로드 할 수 있습니다. Composer를 업데이트하지 않고 모든 클래스를 "글로벌"네임 스페이스에 유지하는 데 유용합니다.

Laravel 클래스 로더가 등록 된 디렉토리에서 클래스를 자동으로 검색하는 옵션 ( 옵션 1 , 더 쉬움)과 Composer는 모든 클래스를 기록하지만 업데이트 한 후에 만 ​​( 옵션 2 ) 성능을 향상시킬 수있는 두 옵션을 결합 할 수 있습니다.


3
app_path().'/library'start / global.php에을 배치해야한다고 생각합니다 .
Alexandre Butynski

2
@AlexandreButynski 좋은 지적입니다. 이렇게하면 매번 작곡가를 업데이트하지 않고도 라이브러리를 추가 할 수 있습니다. 이것을 추가하기 위해 게시물을 편집했습니다.
Alexandre

그래서 IDK ... SiteHelpers라는 클래스를 만든 다음 formatDate 메소드를 정의하십시오. 그런 다음 템플릿에서 SiteHelpers :: formatDate ($ date) 할 수 있어야합니다.
Jason Spick

@JasonSpick 예, 파일 이름을 확인하십시오sitehelpers.php
Alexandre Danault

3
global.php 파일뿐만 아니라 작곡가의 자동로드에 추가해야하는 이유는 무엇입니까?
CashIsClay 3

82

이 작업을 수행하는 방법은 /appLaravel 4 프로젝트 루트의 디렉토리에 새 폴더를 만드는 것 입니다. 그런 다음이 폴더를 /app/start/global.php파일 의 첫 번째 배열에 추가하십시오 .

<?php

ClassLoader::addDirectories(array(

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

));

/app/classes폴더 내의 폴더 구조가 네임 스페이스 규칙을 따르는 한. Laravel 4는이 폴더 내의 모든 클래스 / 파일을 자동로드합니다. 이런 식으로 작곡가 파일을 파거나 작곡가 명령을 실행할 필요가 없습니다.

이것이 모범 사례인지 확실하지 않지만 확실히 작동합니다.

다음 /app/classes/Helpers/Helper.php과 같은 간단한 파일을 만든 경우 :

<?php namespace Helpers;

class Helper {

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

당신이해야 할 일은 전화 Helpers\Helper::helloWorld();

/app/config/app.php파일 에서이 헬퍼 클래스의 별명을 지정할 수도 있습니다 . aliases배열 끝에 다음과 같은 것을 추가하십시오 .

'Helper'          => 'Helpers\Helper'

4
작고 깨끗하고 고급스러운 솔루션으로 작곡가와 어울릴 필요가 없기 때문에이 방법이 마음에 듭니다. +1
Gadoma

3
app.php 파일에 도우미 클래스를 추가하려면 다음과 같이 클래스에 직접 액세스 할 수 있습니다. Helper :: hellowWorld ();
Helmut Granda

도우미가 수업이어야합니까? 여기서 간단한 기능을 정의 할 수 있습니까?
Webinan

2
당신이 composer.json을 편집하지 않고 작곡가 dumpautoload 실행하지 않는 경우 작동하지 않습니다
Rommy

1
훌륭한 솔루션. Rommy가 말했듯이 달리는 것을 잊지 마십시오 composer dump-autoload. 나는 머리를 긁는 데 20 분을 보냈습니다.
al_manchester

25

Laravel의 helpers.php 메소드는 composer.json ( https://github.com/laravel/framework/blob/master/composer.json ) 의 "파일"에 추가하는 것입니다 :

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

내가하는 일은 작은 클래스 (클래스 당 몇 가지 메소드, 메소드 당 한 줄, 무언가에서 확장 된 모든 것 및 DRY를 만드는 것)입니다.

class ExtendedCarbon extends Carbon\Carbon {

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

}

앱 / 라이브러리에 저장하고 composer.json에 추가하십시오.

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

실행

composer dump

그런 다음 필요할 때마다 사용하십시오

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

리팩토링에 대한이 비디오를보십시오 : http://www.youtube.com/watch?v=DC-pQPq0acs

그건 그렇고, 나는 그것이 단지 예일 것이라고 확신하지만, Laravel의 모든 날짜는 Carbon 인스턴스 ( https://github.com/briannesbitt/Carbon ) 이므로 날짜 형식을 지정하는 데 도우미가 필요하지 않을 수도 있습니다. 날짜 및 시간을 형식화하는 많은 메소드가 있습니다.


나는 정적 메소드를 좋아하는 팬이 아니며 필요할 때 인스턴스 메소드를 사용하려고합니다. 나는 확신 이러한 사용의 경우, 당신은 훨씬 더 갖는 것이라고 해요 버그 formatDDMMAAAA()static.
XedinUnknown

7

View::share()클로저와 함께 사용 하여이를 달성 할 수도 있습니다 . http://www.develophp.org/2014/07/laravel-4-blade-helper-functions/

추가 이점 : 추가 클래스를 만들 필요없이 전역 네임 스페이스를 깨끗하게 유지할 필요가 있습니다.


나는이 접근법을 좋아한다. 더 난간 적입니다. 형질 안에 모든 뷰 헬퍼 메소드를 추가하고 블레이드 뷰에서 사용할 수있는 방법이 있습니까?
bibstha

솔직히 말해서 PHP로는 가능하지 않다고 생각합니다.
프란츠
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.