Laravel : 전역 배열 데이터와 상수를 어디에 저장할까요?


82

라 라벨과 함께 일하기 시작했습니다. 라 라벨 4를 기본 프레임 워크로 사용하여 몇 년 전에 만든 전체 시스템을 다시 작성해야합니다. 예전 시스템에서는 constant.php몇 가지 상수가 선언 된 파일과 globals.php많은 배열 세트 (예 : 카테고리 상태, 이벤트 유형, 언어 등)가 포함 된 파일이있었습니다. 이렇게하면 다음과 같은 것을 사용할 수 있습니다.

foreach ( $langs as $code => $domain ) {
    // Some stuff
}

내 앱 어디에서나.

제 질문은 어떻게 그 정보를 소위 "라 라벨 방식"으로 저장할 수 있는가입니다. 이 정보를 저장하기 위해 일종의 객체를 사용하여 이것을 서비스로 설정하고 파사드를 만들려고했습니다.

app / libraries / Project / Constants.php

namespace PJ;

class Constants {

    public static $langs = [
            'es' => 'www.domain.es',
            'en' => 'www.domain.us',
            'uk' => 'www.domain.uk',
            'br' => 'www.domain.br',
            'it' => 'www.domain.it',
            'de' => 'www.domain.de',
            'fr' => 'www.domain.fr'
        ];
}

app / libraries / Project / ConstantsServiceProvider.php

namespace PJ;

use Illuminate\Support\ServiceProvider;

class ConstantsServiceProvider extends ServiceProvider {
    public function register() {
        $this->app->singleton('PJConstants', function() {
            return new Constants;
        });
    }
}

app / libraries / Project / ConstantsFacade.php

namespace PJ;

use Illuminate\Support\Facades\Facade;

class ConstantsFacade extends Facade {
    protected static function getFacadeAccessor() { 
        return 'PJConstants';
    }
}

composer.json

"psr-4": {
     "PJ\\": "app/libraries/Project"
},

그래서 그 속성에 PJ\Constants::$langs.

이것은 효과가 있지만 가장 효율적이거나 올바른 방법이라고 생각하지 않습니다. 전체 서비스 제공 업체와 파사드 등 모든 것을 생성하여 변수를 "전파"하는 올바른 방법입니까? 아니면이 데이터를 어디에 넣어야합니까?

조언을 해주셔서 감사합니다.

# 01 수정

모든 컨트롤러와 뷰에 전달하려는 데이터는 내 게시물 시작 부분의 예제와 같이 스크립트에서 직접 설정할 수 있지만 예를 들어 데이터베이스에서 동적으로 생성 할 수도 있습니다. 이 데이터는 카테고리 목록이 될 수 있습니다. 내비게이션 바를 생성하려면 모든 뷰에서 필요하지만 라우팅 패턴 (예 :)을 정의 /category/subcategory/product하고 여러 컨트롤러에서 일부 정보를 구문 분석 하는데도 필요합니다 (예 : X 제품을 보유하는 카테고리에서 정보를 가져옴).

내 배열은 다음과 같습니다.

$categories = [
    1 => ['name' => 'General', 'parent' => 0, 'description' => 'Lorem ipsum...'],
    2 => ['name' => 'Nature', 'parent' => 0, 'description' => 'Lorem ipsum...'],
    3 => ['name' => 'World', 'parent' => 0, 'description' => 'Lorem ipsum...'],
    4 => ['name' => 'Animals', 'parent' => 2, 'description' => 'Lorem ipsum...']
]

예를 들면. 인덱스는 카테고리의 ID이고 값은 카테고리와 관련된 정보입니다.

모든 컨트롤러 및 뷰에서 사용할 수있는이 배열이 필요합니다.

그렇다면 Config 변수로 저장해야합니까? 이 데이터를 어떻게 저장할 수 있습니까? 가장 좋고 의미 상 올바른 방법은 무엇입니까?

답변:


117

애플리케이션 전체에서 전역 적으로 사용되는 대부분의 상수의 경우 구성 파일에 저장하는 것으로 충분합니다. 또한 꽤 간단합니다

app/config디렉토리에 새 파일을 만듭니다 . 그것을 부르 자constants.php

거기에서 구성 값의 배열을 반환해야합니다.

return [
    'langs' => [
        'es' => 'www.domain.es',
        'en' => 'www.domain.us'
        // etc
    ]
];

그리고 다음과 같이 액세스 할 수 있습니다.

Config::get('constants.langs');
// or if you want a specific one
Config::get('constants.langs.en');

또한 설정할 수 있습니다.

Config::set('foo.bar', 'test');

설정 한 값은 유지되지 않습니다. 현재 요청에만 사용할 수 있습니다.

최신 정보

구성은 아마도 데이터베이스에서 생성 된 정보를 저장하기에 적합한 장소가 아닐 것입니다. 다음 과 같은 Eloquent 모델을 사용할 수 있습니다 .

class Category extends Eloquent {
    // db table 'categories' will be assumed
}

그리고 모든 카테고리를 쿼리

Category::all();

어떤 이유로 전체 모델이 작동하지 않으면 자신 만의 클래스와 파사드를 만드는 것에 대해 생각할 수 있습니다. 또는 모든 정적 변수와 메서드로 클래스를 만든 다음 파사드없이 사용할 수도 있습니다.


쉬운 방법! 이렇게하면 프로젝트 코드에 이미 설정된 "상수 배열"에 적합합니다. 하지만 런타임에 생성 된 변수 나 배열은 다른 곳에서 전역 적으로 액세스하고 싶습니다. global.php에 몇 가지 기본 시작 코드가 있으며 일부 컨트롤러 또는 뷰에서 필요한 일부 변수가 생성됩니다. 해당 구성 변수의 값을 설정하거나 런타임에 새 변수를 만드는 방법이 있습니까?
Marco Madueño Mejía 2014

그렇게 쉽지 않을 거라고 생각 했어요. 대답으로 표시하겠습니다.하지만 마지막으로 의심이 있습니다. 전역 적으로 액세스 가능하게 만드는 데 필요한 변수 중 하나에는 데이터베이스에서 가져온 범주 집합이 있습니다. 내비게이션 메뉴에 사용되므로 모든보기에 필요하지만 일부 컨트롤러 및 라우팅에도 필요합니다. 이러한 유형의 데이터를 Config 변수로 저장하는 것이 올바른가요 (의미 적으로 말하면)? 아니면 다른 방법으로 보관해야합니까?
Marco Madueño Mejía

2
@Corner 5.0부터 config 디렉토리는 프로젝트 디렉토리의 루트에 직접 위치합니다.
lukasgeiter 2015

4
Laravel 5 이상을 사용하는 사람들은 'use Config'를 추가해야합니다. 컨트롤러에서 또는 다음과 같이 Config의 글꼴에 슬래시를 넣으십시오. \ Config :: get ( 'constants.langs');
rotaercz

2
지금 사용하는 config()대신 도우미 를 사용할 수 있습니다 Config::get().
Leith

23

상 수용

config 디렉토리에 constants.php 파일을 만듭니다.

define('YOUR_DEFINED_CONST', 'Your defined constant value!');

return [

'your-returned-const' => 'Your returned constant value!'

];

다음과 같이 사용할 수 있습니다.

echo YOUR_DEFINED_CONST . '<br>';

echo config('constants.your-returned-const');

정적 배열의 경우

config 디렉토리에 static_arrays.php 파일을 만듭니다.

class StaticArray
{

    public static $langs = [
        'es' => 'www.domain.es',
        'en' => 'www.domain.us',
        'uk' => 'www.domain.uk',
        'br' => 'www.domain.br',
        'it' => 'www.domain.it',
        'de' => 'www.domain.de',
        'fr' => 'www.domain.fr'
    ];

}

다음과 같이 사용할 수 있습니다.

echo StaticArray::$langs['en'];

참고 : Laravel은 모든 설정 파일을 자동으로 포함하므로 수동으로 포함 할 필요가 없습니다. :)


다음과 같은 일부 콘솔 명령에서는 사용할 수 없습니다 route:cache.Use of undefined constant ID - assumed 'ID'
AliN11

13

Laravel에서 공통 상수 파일 만들기

app / constants.php

    define('YOUR_CONSTANT_VAR', 'VALUE');

    //EX
    define('COLOR_TWO', 'red');

composer.json composer.json의 자동로드시 파일 위치 추가

"autoload": {
    "files": [
        "app/constants.php"
    ]
}

이 변경 사항을 적용하기 전에 터미널에서 다음 명령을 실행하여 Laravel의 자동로드 파일을 다시 생성해야합니다.

composer dump-autoload

1
공유해 주셔서 감사합니다. 나는 자동 로딩에 대해 잊었다 : D
Channaveer Hakari

내 즐거움 @ChannaveerHakari입니다
Parth kharecha

8

Laravel 5의 전역 상수의 경우 Config를 호출하는 것을 좋아하지 않습니다. 다음과 같이 Route 그룹에서 정의합니다.

// global contants for all requests
Route::group(['prefix' => ''], function() {
    define('USER_ROLE_ADMIN','1');
    define('USER_ROLE_ACCOUNT','2');
});

상수가 많은 경우이를 다른 파일에 저장 한 다음 경로의 함수에 포함하는 방법이 있습니까? 또한 [ 'prefix'=> ''] 행은 무엇을하고 있습니까? 연관 배열이라는 것을 알고 있지만 모든 경로에서 상수를 사용할 수 있습니까? 감사.
user3089840 nov.

1
아하 잘 나는 접두사 부분을 생각은 : laravel.com/docs/5.1/routing#route-group-prefixes
user3089840

또 다른 참고 사항은 내가 무엇을하든 PHPUnit이 좋아하지 않는 것 같습니다. 내가 당신의 방식으로 시도하면 모든 것이 브라우저에서 잘 작동하지만 PHPUnit은 내 상수가 이미 정의되어 있다고 알려주며 이는 사실이 아닙니다.
user3089840 nov.

구성을 캐싱하는 경우 상수를 정의하면 작동하지 않습니다.
0과 1

접두사를 사용하는 좋은 아이디어
Arun Yokesh

4

가장 좋은 방법은 현지화를 사용하는 것입니다.

새 파일 만들기 messages.php에을 resources/lang/en( en즉 내에서 설정 한 값이기 때문에 config/app 'locale'=>'en') 모든 값의 배열을 반환

return [
    'welcome' => 'Welcome to our application'
];

laravel 5.3 이하를 검색하려면

echo trans('messages.welcome');

또는

echo Lang::get('messages.welcome');

5.4 용

echo __('messages.welcome') 

laravel 5.0 현지화

또는

laravel 5.4 현지화


맞습니다. 초보자의 하위 쿼리는 해당 message.php 파일을 읽고 키 값을 배열로 얻는 방법입니다. 나는 그것을 배열로 읽고 내 클라이언트 측 라이브러리, 즉 Angular JS에 대한 json 응답으로 보내 특정 문자열을 처리하고 싶습니다.
Gopinath

2

위의 답변에 추가하려면 Laravel 5.3에서 사용하기 전에 config 클래스를 포함해야합니다.

use Illuminate\Support\Facades\Config;

또는 config () 함수를 사용하십시오.
ademers

2

Laravel 5.4에서는 생성자에서 생성 할 수 있습니다.

public function __construct()
{
  \Config::set('privileged', array('user1','user2');
  \Config::set('SomeOtherConstant', 'my constant');     
}     

그런 다음 메서드에서 이와 같이 호출 할 수 있습니다.

\Config::get('privileged');

모델 등의 정적 메서드에 특히 유용합니다.

Laracasts.com 참조 https://laracasts.com/discuss/channels/general-discussion/class-apphttpcontrollersconfig-not-found


0

constants.php 파일을 config 디렉토리에 넣고 해당 파일에 상수를 정의하면 해당 파일이 자동으로로드되며 Laravel 6+에서 테스트됩니다.

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