Thực tiễn tốt nhất cho người trợ giúp và chức năng cơ bản của Laravel 4?


152

Tôi đang cố gắng hiểu vị trí tốt nhất để đặt một hàm toàn cầu trong Laravel 4. Ví dụ: định dạng ngày. Tôi không nghĩ làm mặt tiền là xứng đáng vì mặt tiền quá mô-đun. Tôi đã đọc các bài viết về việc tạo một thư mục thư viện và lưu trữ các lớp ở đó nhưng dường như rất nhiều cho một chức năng đơn giản. Không nên có một 'công cụ' như thế này trong các mẫu Blade?

Các thực tiễn tốt nhất cho những thứ như thế này là gì và làm cách nào để cung cấp nó cho các mẫu Blade?

Câu trả lời:


233

Cách xấu xí, lười biếng và khủng khiếp: Cuối cùng bootstrap/start.php, hãy thêm include('tools.php')và đặt chức năng của bạn vào tệp mới đó.

Cách sạch sẽ: Tạo một thư viện. Bằng cách đó, nó sẽ được tự động tải CHỈ khi bạn thực sự sử dụng nó.

  • Tạo một librariesthư mục trong appthư mục của bạn
  • Tạo tệp thư viện của bạn, tạo một lớp trong đó và thêm các hàm tĩnh cho nó
  • Tùy chọn 1 : Chỉnh sửa start/global.phpđể thêm app_path().'/libraries'vào ClassLoader::addDirectories( mảng.
  • Tùy chọn 2 : Chỉnh sửa composer.jsonđể thêm "app/libraries"vào autoloadmảng. Chạycomposer dump-autoload
  • Gọi lớp của bạn và các chức năng tĩnh từ quan điểm của bạn.

Về lựa chọn của bạn, trích dẫn từ global.phptập tin

Ngoài việc sử dụng Trình soạn thảo, bạn có thể sử dụng trình tải lớp Laravel để tải các bộ điều khiển và mô hình của mình. Điều này hữu ích để giữ tất cả các lớp của bạn trong không gian tên "toàn cầu" mà không cần cập nhật Trình soạn thảo.

Bạn có thể kết hợp cả hai tùy chọn, trong đó trình tải lớp Laravel sẽ tự động tìm kiếm các lớp trong các thư mục đã đăng ký ( Tùy chọn 1 , dễ dàng hơn) và Trình soạn thảo sẽ giữ bản ghi của tất cả các lớp nhưng chỉ sau khi bạn cập nhật nó ( Tùy chọn 2 , có thể cải thiện hiệu suất).


3
Tôi nghĩ bạn cũng phải đặt app_path().'/library', trong start / global.php.
Alexandre Butynski

2
@AlexandreButynski Điểm tốt. Điều này sẽ cho phép thêm libaries mà không phải cập nhật trình soạn nhạc mọi lúc. Tôi đã chỉnh sửa bài viết của mình để thêm điều này.
Alexandre Danault

Vì vậy, tôi tạo một lớp có tên IDK ... SiteHelpers và sau đó định nghĩa một định dạng phương thức. và sau đó trong mẫu tôi có thể thực hiện SiteHelpers :: formatDate ($ date) không?
Jason Spick

@JasonSpick Có, và đảm bảo bạn đặt tên cho tệp của mìnhsitehelpers.php
Alexandre Danault

3
Tại sao bạn cần thêm nó vào tự động tải của nhà soạn nhạc cũng như tệp global.php?
CashIsClay

82

Cách của tôi để làm điều này là tạo một thư mục mới trong thư mục trong thư mục /appgốc của dự án Laravel 4 của bạn. Sau đó thêm thư mục này vào mảng đầu tiên của /app/start/global.phptệp như sau:

<?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.

));

Miễn là cấu trúc thư mục trong /app/classesthư mục mới tuân theo quy ước không gian tên của bạn. Laravel 4 sẽ tự động tải tất cả các lớp / tệp trong thư mục này. Bằng cách này, không cần phải đào sâu vào bất kỳ tệp soạn thảo nào hoặc chạy lệnh soạn nhạc.

Không chắc chắn nếu điều này là thực hành tốt nhất nhưng nó chắc chắn hoạt động.

Nếu bạn đã tạo một tệp đơn giản gọi là /app/classes/Helpers/Helper.phpnhư thế này:

<?php namespace Helpers;

class Helper {

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

Tất cả những gì bạn cần làm là gọi Helpers\Helper::helloWorld();

Bạn cũng có thể bí danh lớp người trợ giúp này trong /app/config/app.phptệp của bạn . Chỉ cần thêm một cái gì đó như thế này vào cuối aliasesmảng:

'Helper'          => 'Helpers\Helper'

4
Tôi thích cách này vì bạn không phải hòa nhập với bất cứ thứ gì của nhà soạn nhạc-ish, một giải pháp sạch sẽ và đẳng cấp. +1
Gadoma

3
Nếu bạn đã thêm lớp người trợ giúp vào tệp app.php, bây giờ bạn có thể truy cập lớp trực tiếp như thế này: Helper :: hellowWorld ();
Helmut Granda

người trợ giúp có nên là một lớp học? Tôi có thể định nghĩa một chức năng đơn giản ở đây không?
Webinan

2
Điều này không hoạt động nếu bạn không chỉnh sửa composer.json và không chạy trình soạn thảo dumpautoload
Rommy

1
Giải pháp tuyệt vời. Như Rommy nói, đừng quên chạy composer dump-autoload- Tôi đã làm và dành 20 phút gãi đầu.
al_manchester

25

Phương thức helpers.php của Laravel là thêm nó vào "tệp" của bạn trong composer.json ( https://github.com/laravel/framework/blob/master/composer.json ):

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

Những gì tôi làm là tạo ra các lớp nhỏ (một vài phương thức cho mỗi lớp, một dòng trên mỗi phương thức, mọi thứ được mở rộng từ thứ gì đó và DRY, đó là mục tiêu của tôi),

class ExtendedCarbon extends Carbon\Carbon {

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

}

lưu chúng vào ứng dụng / thư viện và thêm vào composer.json:

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

Hành hình

composer dump

Và sau đó chỉ cần sử dụng chúng bất cứ nơi nào bạn cần

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

Xem video này về tái cấu trúc: http://www.youtube.com/watch?v=DC-pQPq0acs

Nhân tiện, tôi chắc chắn đó chỉ là một ví dụ, nhưng bạn có thể không cần người trợ giúp để định dạng ngày, vì tất cả các ngày trong Laravel đều là các trường hợp của Carbon ( https://github.com/briannesbitt/Carbon ) và nó có vô số phương thức để định dạng ngày và giờ.


Bản thân tôi không phải là một fan hâm mộ lớn của các phương thức tĩnh và cố gắng sử dụng các phương thức cá thể khi cần thiết. Bug Tôi khá chắc chắn rằng trong trường hợp sử dụng như vậy, bạn sẽ tốt hơn vì có formatDDMMAAAA()như static.
XedinUnknown

7

Bạn cũng có thể sử dụng View::share()cùng với các bao đóng để đạt được điều này - Tôi vừa đăng về điều này: http://www.develophp.org/2014/07/laravel-4-blade-helper-fifts/

Thêm lợi ích: Bạn không cần tạo thêm một lớp và cũng giữ sạch không gian tên toàn cầu.


Tôi thích cách tiếp cận này. Thêm đường sắt-ish. Chúng ta có thể một số cách thêm tất cả các phương thức trợ giúp chế độ xem bên trong một đặc điểm và có sẵn chúng trong chế độ xem lưỡi không?
bibstha

Tôi không nghĩ rằng điều đó là có thể với PHP, thành thật mà nói.
Franz
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.