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.