Laravel 4にグローバル関数を配置するのに最適な場所を理解しようとしています。たとえば、日付の書式設定です。ファサードはモジュラーすぎるため、ファサードを作ることは価値があるとは思いません。ライブラリフォルダーの作成とそこへのクラスの保存に関する記事を読んだことがありますが、それは単純な機能にとっても多くのことのようです。このような「ツール」は、Bladeテンプレートで使用できませんか?
このようなもののベストプラクティスは何ですか?また、Bladeテンプレートで使用できるようにするにはどうすればよいですか?
Ugい、怠zyでひどい方法:bootstrap/start.php
の最後にinclude('tools.php')
を追加し、その新しいファイルに関数を配置します。
クリーンな方法:ライブラリを作成します。そうすれば、実際に使用するときにのみ自動ロードされます。
libraries
フォルダー内にapp
フォルダーを作成しますstart/global.php
を編集して、ClassLoader::addDirectories(
配列にapp_path().'/libraries'
を追加します。composer.json
を編集して、"app/libraries"
をautoload
配列に追加します。 composer dump-autoload
を実行しますオプションについて、global.php
ファイルから引用
Composerの使用に加えて、Laravelクラスローダーを使用してコントローラーとモデルをロードできます。これは、Composerの更新を行わずに、すべてのクラスを「グローバル」ネームスペースに保持するのに役立ちます。
両方のオプションを組み合わせることができます。Laravelクラスローダーは登録されたディレクトリ内のクラスを自動的に検索し(オプション1、簡単)、Composerは記録を保持しますすべてのクラスのうち、更新した後にのみ(オプション2、パフォーマンスが向上する可能性があります)。
これを行う私の方法は、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'
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/
追加の利点:追加のクラスを作成する必要がなく、グローバル名前空間をクリーンに保つ必要もありません。