Кращі практики для помічників Laravel 4 та основні функції?


152

Я намагаюся зрозуміти найкраще місце, щоб поставити глобальну функцію в Laravel 4. Наприклад, форматування дати. Я не думаю, що робити фасад не варто, оскільки фасади занадто модульні. Я читав статті про створення папки бібліотеки та зберігання там класів, але це також здається чималим для простої функції. Чи не повинен подібний інструмент бути доступним у шаблонах Blade?

Які найкращі практики для такого подібного і як зробити його доступним для шаблонів Blade?

Відповіді:


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 для завантаження контролерів та моделей. Це корисно для збереження всіх ваших класів у «глобальному» просторі імен без оновлення композитора.

Ви можете комбінувати обидва варіанти, коли завантажувач класів Laravel автоматично здійснює пошук класів у зареєстрованих каталогах ( Варіант 1 , простіше), а Composer буде вести облік усіх класів, але лише після оновлення ( Варіант 2 , може покращити продуктивність).


3
Я думаю, ви також повинні розмістити його app_path().'/library'в start / global.php.
Олександр Бутинський

2
@AlexandreButynski Добрий момент. Це дозволить додавати бібліотеки без необхідності оновлювати композитора щоразу. Я відредагував своє повідомлення, щоб додати це.
Олександр Дано

Отже, я створюю клас під назвою IDK ... SiteHelpers, а потім визначаю метод formatDate. а потім у шаблоні я повинен мати можливість робити SiteHelpers :: formatDate ($ date)?
Джейсон Спік

@JasonSpick Так, і переконайтесь, що ви назвали свій файлsitehelpers.php
Alexandre Danault

3
Чому потрібно додати його до автозавантаження композитора, а також у файл global.php?
CashIsClay

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 автоматично завантажить усі класи / файли в цій папці. Таким чином, не потрібно копатись до будь-яких композиторських файлів або виконувати команду композитора.

Не впевнений, чи це найкраща практика, але це, безумовно, працює.

Якщо ви створили простий файл, який називається /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
Гадома

3
Якщо ви хочете додати свій клас помічників у файл app.php, тепер ви можете отримати доступ до класу безпосередньо так: Helper :: hellowWorld ();
Гельмут Гранда

чи повинен помічник бути класом? чи можу я тут визначити просту функцію?
Вебінан

2
Це не працює, якщо ви не редагуєте composer.json і не запускаєте композицію dumpautoload
Rommy

1
Прекрасне рішення. Як каже Роммі, не забувайте бігати composer dump-autoload- я так і провів 20 хвилин, чухаючи голову.
al_manchester

25

Метод helpers.php Laravel полягає в тому, щоб додати його до своїх "файлів" в composer.json ( https://github.com/laravel/framework/blob/master/composer.json ):

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

Що я роблю, це створювати невеликі класи (кілька методів на клас, один рядок за методом, все поширюється від чогось, і DRY, це моя мета),

class ExtendedCarbon extends Carbon\Carbon {

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

}

збережіть їх у програмі / бібліотеках та додайте до 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.
Xedin Невідомий

7

Ви також можете використовувати View::share()разом із закриттями, щоб досягти цього - я щойно опублікував про це: http://www.develophp.org/2014/07/laravel-4-blade-helper-functions/

Додаткова вигода: Вам не потрібно створювати зайвий клас, а також підтримувати чисту глобальну область імен.


Мені подобається такий підхід. Більше залізничних іш. Чи можемо ми дещо додати всі методи, які допомагають перегляду, всередині ознаки та мати їх у вікні леза?
bibstha

Я не думаю, що це можливо з PHP, якщо чесно.
Франц
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.