Laravel: Nơi lưu trữ dữ liệu và hằng số mảng toàn cục?


82

Tôi mới bắt đầu làm việc với Laravel. Tôi cần viết lại toàn bộ hệ thống mà tôi đã tạo vài năm trước, sử dụng Laravel 4 làm khung cơ sở. Trong hệ thống cũ của mình, tôi đã từng có một constant.phptệp với một số hằng số được khai báo và một globals.phptệp chứa rất nhiều tập hợp mảng (ví dụ: trạng thái danh mục, loại sự kiện, lang, v.v.). Bằng cách đó, tôi có thể sử dụng một số thứ như

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

bất kỳ đâu trong ứng dụng của tôi.

Câu hỏi của tôi là, làm thế nào tôi có thể lưu trữ thông tin đó trong cái gọi là "cách laravel". Tôi đã thử sử dụng một số loại đối tượng để lưu trữ thông tin này, đặt đây là một dịch vụ và tạo cho nó một mặt tiền:

app / Library / 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 / Library / 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 / Library / Project / ConstantsFacade.php

namespace PJ;

use Illuminate\Support\Facades\Facade;

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

nhà soạn nhạc.json

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

và vì vậy tôi truy cập thuộc tính đó với tư cách PJ\Constants::$langs.

Điều này hoạt động, nhưng tôi nghi ngờ nó là cách hiệu quả nhất hoặc đúng để làm điều đó. Ý tôi là, đó có phải là cách phù hợp để "truyền bá" một biến bằng cách tạo toàn bộ Nhà cung cấp dịch vụ và các mặt tiền và tất cả những thứ như vậy không? Hoặc tôi nên đặt dữ liệu này ở đâu?

Cảm ơn vì bất kỳ lời khuyên.

CHỈNH SỬA # 01

Dữ liệu tôi muốn chuyển cho tất cả bộ điều khiển và chế độ xem có thể được đặt trực tiếp trong tập lệnh, như trong ví dụ ở đầu bài đăng của tôi, nhưng nó cũng có thể được tạo động, từ cơ sở dữ liệu chẳng hạn. Dữ liệu này có thể là một danh sách các danh mục. Tôi cần chúng trong tất cả các chế độ xem để tạo thanh điều hướng, nhưng tôi cũng cần chúng để xác định một số mẫu định tuyến (như /category/subcategory/product) và cũng để phân tích cú pháp một số thông tin trong một số bộ điều khiển (Như lấy thông tin từ danh mục chứa sản phẩm X).

Mảng của tôi giống như sau:

$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...']
]

Chỉ là một ví dụ. Chỉ mục là id của danh mục và Giá trị là thông tin được liên kết với danh mục.

Tôi cũng cần mảng này, có sẵn trong tất cả Bộ điều khiển và Chế độ xem.

Vì vậy, tôi có nên lưu nó dưới dạng biến Cấu hình không? Tôi có thể lưu trữ những dữ liệu này bằng cách nào khác; cách tốt nhất và đúng ngữ nghĩa là gì?

Câu trả lời:


117

Đối với hầu hết các hằng số được sử dụng trên toàn ứng dụng, lưu trữ chúng trong các tệp cấu hình là đủ. Nó cũng khá đơn giản

Tạo một tệp mới trong app/configthư mục. Hãy gọi nóconstants.php

Trong đó bạn phải trả về một mảng các giá trị cấu hình.

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

Và bạn có thể truy cập chúng như sau

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

Và bạn cũng có thể đặt chúng

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

Lưu ý rằng các giá trị bạn đặt sẽ không tồn tại. Chúng chỉ có sẵn cho yêu cầu hiện tại.

Cập nhật

Cấu hình có lẽ không phải là nơi thích hợp để lưu trữ thông tin được tạo từ cơ sở dữ liệu. Bạn chỉ có thể sử dụng Mô hình Hùng biện như:

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

Và truy vấn tất cả các danh mục

Category::all();

Nếu toàn bộ Mô hình vì một lý do nào đó không hoạt động, bạn có thể bắt đầu nghĩ đến việc tạo ra lớp và mặt tiền của riêng bạn. Hoặc bạn có thể chỉ cần tạo một lớp với tất cả các biến và phương thức tĩnh và sau đó sử dụng nó mà không cần công cụ mặt tiền.


Cách dễ dàng! Làm như vậy là tốt cho "mảng hằng số" đã được thiết lập trong mã dự án. Nhưng những gì về các biến hoặc mảng được tạo trong thời gian chạy mà tôi muốn truy cập toàn cục từ mọi nơi khác. Tôi có một số mã bắt đầu cơ bản tại global.php và một số biến được tạo ở đó mà tôi sẽ cần sau trong một số bộ điều khiển hoặc chế độ xem. Có cách nào để đặt giá trị của các biến Cấu hình đó hoặc thậm chí tạo các biến mới trong thời gian chạy không?
Marco Madueño Mejía

Tôi không nghĩ rằng nó có thể dễ dàng như vậy. Tôi sẽ đánh dấu nó là câu trả lời, nhưng tôi có một nghi ngờ cuối cùng về nó. Một trong những biến mà tôi cần để có thể truy cập toàn cầu chứa một tập hợp các danh mục lấy từ cơ sở dữ liệu. Nó được yêu cầu cho tất cả các chế độ xem vì nó sẽ được sử dụng cho menu điều hướng, nhưng nó cũng được yêu cầu trong một số bộ điều khiển và thậm chí để định tuyến. Có chính xác (nói về mặt ngữ nghĩa) để lưu loại dữ liệu này dưới dạng biến Cấu hình không? Hay tôi nên lưu trữ nó bằng một số cách khác?
Marco Madueño Mejía

2
@Corner kể từ 5.0, thư mục cấu hình được đặt trực tiếp trong thư mục gốc của thư mục dự án của bạn.
lukasgeiter

4
Đối với những người sử dụng Laravel 5 trở lên, bạn phải thêm 'use Config;' trong Bộ điều khiển của bạn hoặc đặt một dấu gạch chéo trong phông chữ của Cấu hình như sau: \ Config :: get ('constants.langs');
rotaercz

2
Bạn có thể sử dụng trình config()trợ giúp thay vì sử dụng Config::get()ngay bây giờ.
Leith

23

Đối với Hằng số

Tạo tệp constants.php trong thư mục cấu hình: -

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

return [

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

];

Bạn có thể sử dụng chúng như: -

echo YOUR_DEFINED_CONST . '<br>';

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

Đối với mảng tĩnh

Tạo tệp static_arrays.php trong thư mục cấu hình: -

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'
    ];

}

Bạn có thể sử dụng nó như: -

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

Lưu ý: Laravel bao gồm tất cả các tệp cấu hình tự động, vì vậy không cần bao gồm thủ công :)


Không khả dụng trong một số lệnh của bảng điều khiển như route:cache:Use of undefined constant ID - assumed 'ID'
AliN11

13

Tạo tệp hằng số chung trong Laravel

app / constants.php

    define('YOUR_CONSTANT_VAR', 'VALUE');

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

composer.json thêm vị trí tệp khi tự động tải trong composer.json

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

Trước khi thay đổi này có hiệu lực, bạn phải chạy lệnh sau trong Terminal để tạo lại các tệp tự động tải của Laravel:

composer dump-autoload

1
Cám ơn vì đã chia sẻ. Tôi đã quên về việc tự động tải: D
Channaveer Hakari

đó là niềm vui của tôi @ChannaveerHakari
Parth kharecha

8

Đối với các hằng số toàn cục trong Laravel 5, tôi không thích gọi Config cho chúng. Tôi định nghĩa chúng trong nhóm Tuyến như thế này:

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

Nếu tôi có một số lượng lớn các hằng số, có cách nào để lưu trữ chúng trong (các) tệp khác và sau đó đưa chúng vào hàm của tuyến đường không? Ngoài ra, dòng ['prefix' => ''] đang làm gì? Tôi biết đó là một mảng kết hợp, nhưng điều này có làm cho các hằng số khả dụng cho tất cả các tuyến không? Cảm ơn.
user3089840

1
Aha cũng tôi đã tìm ra một phần tiền tố: laravel.com/docs/5.1/routing#route-group-prefixes
user3089840

Một lưu ý nhỏ khác, bất kể tôi làm gì, có vẻ như PHPUnit không thích nó. Khi tôi thử theo cách của bạn, mọi thứ hoạt động tốt trên trình duyệt, nhưng PHPUnit cho tôi biết các hằng số của tôi đã được xác định và điều đó đơn giản là không đúng.
user3089840

Nếu bạn đang lưu vào bộ nhớ đệm các cấu hình của mình thì việc xác định các hằng số trong chúng sẽ không hoạt động.
số không-và-cái.

Ý tưởng tuyệt vời để sử dụng tiền tố
Arun Yokesh

4

Tôi nghĩ cách tốt nhất là sử dụng bản địa hóa.

Tạo một tệp mới messages.phptrong resources/lang/en( envì đó là những gì được đặt trong của tôi config/app 'locale'=>'en') trả về một mảng tất cả các giá trị của bạn

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

để truy xuất cho laravel 5.3 trở xuống

echo trans('messages.welcome');

hoặc là

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

cho 5,4 sử dụng

echo __('messages.welcome') 

bản địa hóa laravel 5.0

hoặc là

bản địa hóa laravel 5.4


Đúng rồi. Truy vấn phụ từ một thành viên mới là làm thế nào để đọc tệp tin.php đó và nhận giá trị khóa dưới dạng mảng? Tôi muốn đọc nó dưới dạng mảng & gửi dưới dạng phản hồi json cho thư viện phía máy khách của tôi tức là Angular JS để xử lý các chuỗi nhất định.
Gopinath

2

Chỉ để thêm vào câu trả lời trên, bạn sẽ phải bao gồm lớp cấu hình trước khi bạn có thể bắt đầu sử dụng nó trong Laravel 5.3

use Illuminate\Support\Facades\Config;

Hoặc đơn giản sử dụng hàm config ().
ademers

2

Ít nhất trong Laravel 5.4, trong hàm tạo của bạn, bạn có thể tạo chúng;

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

Sau đó, bạn có thể gọi chúng như thế này trong các phương thức của bạn;

\Config::get('privileged');

Đặc biệt hữu ích cho các phương thức tĩnh trong Model, v.v.

Tham khảo trên Laracasts.com https://laracasts.com/discuss/channels/general-discussion/class-apphttpcontrollersconfig-not-found


0

Chỉ cần đặt một tệp constants.php tệp vào thư mục cấu hình và xác định hằng số của bạn trong tệp đó, tệp đó sẽ được tự động tải, Đã kiểm tra trong Laravel 6+

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.