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 2013年

2
@AlexandreButynski良い点。これにより、毎回composerを更新する必要なくライブラリを追加できます。これを追加するために投稿を編集しました。
Alexandre Danault 2013年

そこで、IDK ... SiteHelpersというクラスを作成して、formatDateメソッドを定義します。そして、テンプレートでSiteHelpers :: formatDate($ date)を実行できるはずですか?
Jason Spick 2013年

@JasonSpickはい、そして必ずファイルに名前を付けてくださいsitehelpers.php
Alexandre Danault 2013年

3
それをcomposerのautoloadとglobal.phpファイルに追加する必要があるのはなぜですか?
CashIsClay 2013

82

これを行う私の方法は/app、Laravel 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は、このフォルダー内のすべてのクラス/ファイルを自動ロードします。この方法では、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'

4
あなたが作曲家っぽい、クリーンで上品なソリューションと混ざる必要がないので、私はこの方法が好きです。+1
ガドーマ2013

3
ヘルパークラスをapp.phpファイルに追加する場合は、次のようにクラスに直接アクセスできます。Helper :: hellowWorld();
Helmut Granda 2013

ヘルパーはクラスである必要がありますか?ここで簡単な関数を定義できますか?
Webinan 2013年

2
composer.jsonを編集せず、composer dumpautoloadを実行しないと、これは機能しません
Rommy

1
素晴らしいソリューション。Rommyが言うように、走ることを忘れないでくださいcomposer dump-autoload。私は20分間かけて頭を掻きました。
al_manchester 2014

25

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",
        ...
    ],
},

実行する

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 2016年

7

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

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


私はこのアプローチが好きです。もっとレールっぽい。トレイト内にすべてのビューヘルパーメソッドを追加して、ブレードビューで使用できるようにする方法はありますか?
bibstha '15

正直なところ、それはPHPでは不可能だと思います。
Franz
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.