web-dev-qa-db-ja.com

Laravel 4ヘルパーと基本機能のベストプラクティス

Laravel 4にグローバル関数を配置するのに最適な場所を理解しようとしています。たとえば、日付の書式設定です。ファサードはモジュラーすぎるため、ファサードを作ることは価値があるとは思いません。ライブラリフォルダーの作成とそこへのクラスの保存に関する記事を読んだことがありますが、それは単純な機能にとっても多くのことのようです。このような「ツール」は、Bladeテンプレートで使用できませんか?

このようなもののベストプラクティスは何ですか?また、Bladeテンプレートで使用できるようにするにはどうすればよいですか?

146
Jason Spick

Ugい、怠zyでひどい方法:bootstrap/start.phpの最後にinclude('tools.php')を追加し、その新しいファイルに関数を配置します。

クリーンな方法:ライブラリを作成します。そうすれば、実際に使用するときにのみ自動ロードされます。

  • librariesフォルダー内にappフォルダーを作成します
  • ライブラリファイルを作成し、その中にクラスを作成し、静的関数を追加します
  • オプション1start/global.phpを編集して、ClassLoader::addDirectories(配列にapp_path().'/libraries'を追加します。
  • オプション2composer.jsonを編集して、"app/libraries"autoload配列に追加します。 composer dump-autoloadを実行します
  • ビューからクラスと静的関数を呼び出します。

オプションについて、global.phpファイルから引用

Composerの使用に加えて、Laravelクラスローダーを使用してコントローラーとモデルをロードできます。これは、Composerの更新を行わずに、すべてのクラスを「グローバル」ネームスペースに保持するのに役立ちます。

両方のオプションを組み合わせることができます。Laravelクラスローダーは登録されたディレクトリ内のクラスを自動的に検索し(オプション1、簡単)、Composerは記録を保持しますすべてのクラスのうち、更新した後にのみ(オプション2、パフォーマンスが向上する可能性があります)。

233

これを行う私の方法は、Laravel 4プロジェクトのルートにある/appディレクトリに新しいフォルダーを作成することです。次に、このフォルダーを/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は、このフォルダー内のすべてのクラス/ファイルを自動ロードします。この方法では、composerファイルを調べたり、composerコマンドを実行したりする必要はありません。

これがベストプラクティスであるかどうかはわかりませんが、確かに機能します。

次のような/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'
82
JasonMortonNZ

Laravelのhelpers.phpメソッドは、composer.jsonの「ファイル」に追加することです( https://github.com/laravel/framework/blob/master/composer.json ):

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

私がしていることは、小さなクラスを作成することです(クラスごとにいくつかのメソッド、メソッドごとに1行、何かとDRYから拡張されたすべて、それが私の目標です)。

class ExtendedCarbon extends Carbon\Carbon {

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

}

それらをapp/librariesに保存し、composer.jsonに追加します。

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

Execute

composer dump

そして、必要な場所でそれらを使用します

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

リファクタリングに関する次のビデオをご覧ください。 http://www.youtube.com/watch?v=DC-pQPq0acs

ちなみに、これはほんの一例に過ぎませんが、Laravelのすべての日付はCarbonのインスタンスであるため、日付のフォーマットにヘルパーは必要ないかもしれません( https:/ /github.com/briannesbitt/Carbon )そして、日付と時刻をフォーマットするメソッドがたくさんあります。

また、View::share()をクロージャと一緒に使用してこれを実現することもできます-これについて投稿したばかりです: http://www.develophp.org/2014/07/laravel-4-blade-helper-functions/

追加の利点:追加のクラスを作成する必要がなく、グローバル名前空間をクリーンに保つ必要もありません。

7
Franz