ฉันต้องการสร้างฟังก์ชันตัวช่วยเพื่อหลีกเลี่ยงการทำซ้ำรหัสระหว่างมุมมองใน Laravel 5:
view.blade.php
<p>Foo Formated text: {{ fooFormatText($text) }}</p>
ฟังก์ชั่นการจัดรูปแบบข้อความเป็นพื้น ฉันจะสร้างไฟล์ด้วยฟังก์ชั่นเหล่านี้ได้ที่ไหนและอย่างไร
ฉันต้องการสร้างฟังก์ชันตัวช่วยเพื่อหลีกเลี่ยงการทำซ้ำรหัสระหว่างมุมมองใน Laravel 5:
view.blade.php
<p>Foo Formated text: {{ fooFormatText($text) }}</p>
ฟังก์ชั่นการจัดรูปแบบข้อความเป็นพื้น ฉันจะสร้างไฟล์ด้วยฟังก์ชั่นเหล่านี้ได้ที่ไหนและอย่างไร
คำตอบ:
สร้างhelpers.php
ไฟล์ในโฟลเดอร์แอพของคุณและโหลดมันด้วยผู้แต่ง:
"autoload": {
"classmap": [
...
],
"psr-4": {
"App\\": "app/"
},
"files": [
"app/helpers.php" // <---- ADD THIS
]
},
หลังจากเพิ่มลงในcomposer.json
ไฟล์ของคุณแล้วให้รันคำสั่งต่อไปนี้:
composer dump-autoload
ถ้าคุณไม่ชอบการรักษาของคุณhelpers.php
ไฟล์ของคุณในapp
ไดเรกทอรี (เพราะมันไม่ได้เป็น PSR-4 namespaced ไฟล์ class) คุณสามารถทำสิ่งที่เป็นlaravel.com
เว็บไซต์ไม่: เก็บในไดเรกทอรีบูตhelpers.php
อย่าลืมตั้งไว้ในcomposer.json
ไฟล์ของคุณ:
"files": [
"bootstrap/helpers.php"
]
คำตอบนี้ใช้ได้กับคลาสที่กำหนดเองทั่วไปภายใน Laravel สำหรับคำตอบมากขึ้น Blade เฉพาะให้ดูที่กำหนดเอง Blade Directives ใน Laravel 5
ขั้นตอนที่ 1:สร้างไฟล์ Helpers ของคุณ (หรือคลาสที่กำหนดเองอื่น ๆ ) และกำหนดเนมสเปซที่ตรงกัน เขียนชั้นเรียนและวิธีการของคุณ:
<?php // Code within app\Helpers\Helper.php
namespace App\Helpers;
class Helper
{
public static function shout(string $string)
{
return strtoupper($string);
}
}
ขั้นตอนที่ 2:สร้างนามแฝง:
<?php // Code within config/app.php
'aliases' => [
...
'Helper' => App\Helpers\Helper::class,
...
ขั้นตอนที่ 3:รันcomposer dump-autoload
ในรูทโปรเจ็กต์
ขั้นตอนที่ 4:ใช้ในเทมเพลต Blade ของคุณ:
<!-- Code within resources/views/template.blade.php -->
{!! Helper::shout('this is how to use autoloading correctly!!') !!}
เครดิตพิเศษ:ใช้คลาสนี้ได้ทุกที่ในแอป Laravel ของคุณ:
<?php // Code within app/Http/Controllers/SomeController.php
namespace App\Http\Controllers;
use Helper;
class SomeController extends Controller
{
public function __construct()
{
Helper::shout('now i\'m using my helper class in a controller!!');
}
...
ที่มา: http://www.php-fig.org/psr/psr-4/
ทำไมจึงใช้งานได้: https://github.com/laravel/framework/blob/master/src/Illuminate/Support/ClassLoader.php
ตำแหน่งที่การโหลดอัตโนมัติมาจาก: http://php.net/manual/en/language.oop5.autoload.php
aliases
อาร์เรย์ในapp/config.php
: 'Helper' => App\Helpers\Helper::class,
จากนั้นคุณจะสามารถเรียกใช้Helper::prettyJson();
เบลดได้ดี
ความคิดเริ่มต้นของฉันคือนักแต่งเพลงอัตโนมัติเช่นกัน แต่มันก็ไม่ได้รู้สึก Laravel 5ish สำหรับฉัน L5 ใช้บริการของผู้ให้บริการอย่างหนัก แต่เป็นสิ่งที่บูตแอปพลิเคชันของคุณ
เพื่อเริ่มต้นผมสร้างโฟลเดอร์ของฉันไดเรกทอรีที่เรียกว่าapp
Helpers
จากนั้นภายในHelpers
โฟลเดอร์ฉันเพิ่มไฟล์สำหรับฟังก์ชั่นที่ฉันต้องการเพิ่ม การมีโฟลเดอร์ที่มีหลายไฟล์ทำให้เราสามารถหลีกเลี่ยงไฟล์ใหญ่ ๆ ที่ยาวเกินไปและไม่สามารถจัดการได้
ต่อไปฉันสร้าง a HelperServiceProvider.php
โดยรันคำสั่ง artisan:
artisan make:provider HelperServiceProvider
ภายในregister
วิธีที่ฉันเพิ่มตัวอย่างนี้
public function register()
{
foreach (glob(app_path().'/Helpers/*.php') as $filename){
require_once($filename);
}
}
สุดท้ายลงทะเบียนผู้ให้บริการในของคุณconfig/app.php
ในอาร์เรย์ผู้ให้บริการ
'providers' => [
'App\Providers\HelperServiceProvider',
]
ตอนนี้ไฟล์ใด ๆ ในHelpers
ไดเรกทอรีของคุณจะถูกโหลดและพร้อมใช้งาน
อัพเดท 2016-02-22
มีตัวเลือกที่ดีมากมายที่นี่ แต่ถ้าคำตอบของฉันเหมาะกับคุณฉันไปข้างหน้าและทำแพ็คเกจสำหรับการรวมผู้ช่วยด้วยวิธีนี้ คุณสามารถใช้แพ็คเกจเพื่อเป็นแรงบันดาลใจหรือดาวน์โหลดได้ฟรีด้วย Composer เช่นกัน มันมีตัวช่วยในตัวที่ฉันใช้บ่อย ๆ (แต่ไม่ได้ใช้งานเป็นค่าเริ่มต้น) และช่วยให้คุณสร้างตัวช่วยของคุณเองด้วยเครื่องกำเนิด Artisan แบบง่าย ๆ นอกจากนี้ยังระบุถึงข้อเสนอแนะที่ผู้ตอบกลับใช้ในการใช้ mapper และอนุญาตให้คุณกำหนดผู้ช่วยที่กำหนดเองเพื่อโหลดหรือโดยค่าเริ่มต้นโหลดไฟล์ PHP ทั้งหมดในไดเรกทอรีผู้ช่วยของคุณโดยอัตโนมัติ ข้อเสนอแนะและการประชาสัมพันธ์มีความนิยมมาก!
composer require browner12/helpers
Github: browner12 / ผู้ช่วยเหลือ
start.php
(ซึ่งไม่ดี แต่ให้บริการตามวัตถุประสงค์ในขณะนั้น) คุณมีคำแนะนำอื่นสำหรับการโหลดหลายไฟล์หรือไม่?
นี่คือสิ่งที่แนะนำโดยJeffreyWay
ในการสนทนา Laracastsนี้
app/Http
ไดเรกทอรีของคุณสร้างhelpers.php
ไฟล์และเพิ่มฟังก์ชั่นของคุณcomposer.json
ในบล็อกเพิ่มautoload
"files": ["app/Http/helpers.php"]
composer dump-autoload
วิ่งapp/helpers.php
หรือapp/Helpers/
ดูเหมือนจะเป็นสถานที่ที่ดีกว่า
composer dump-autoload
?
composer dump-autoload
คุณอาจทำตามนี้: developed.be/2014/08/29/composer-dump-autoload-laravel
หลังจากได้รับคำตอบที่หลากหลายใน SO และ Google แล้วฉันยังหาวิธีที่เหมาะสมไม่ได้ คำตอบส่วนใหญ่แนะนำให้เราออกจากแอปพลิเคชันและพึ่งพาเครื่องมือของบุคคลที่สามนักแต่งเพลงในการทำงาน แต่ฉันไม่เชื่อว่าการเชื่อมต่อกับเครื่องมือเพียงเพื่อรวมไฟล์นั้นเป็นเรื่องที่ฉลาด
คำตอบของ Andrew Brownนั้นใกล้เคียงที่สุดกับที่ฉันคิดว่าควรจะเข้าหา แต่ (อย่างน้อยใน 5.1) ขั้นตอนการให้บริการไม่จำเป็น คำตอบของ Heisianเน้นการใช้งานPSR-4
ซึ่งทำให้เราใกล้ขึ้นหนึ่งก้าว นี่คือการใช้งานครั้งสุดท้ายของฉันสำหรับผู้ช่วยในมุมมอง:
ขั้นแรกสร้างไฟล์ตัวช่วยได้ทุกที่ในไดเรกทอรีแอพของคุณด้วยเนมสเปซ:
namespace App\Helpers;
class BobFinder
{
static function bob()
{
return '<strong>Bob?! Is that you?!</strong>';
}
}
ถัดไปนามแฝงคลาสของคุณconfig\app.php
ในaliases
อาร์เรย์:
'aliases' => [
// Other aliases
'BobFinder' => App\Helpers\BobFinder::class
]
และนั่นคือทั้งหมดที่คุณต้องทำ PSR-4
และนามแฝงควรแสดงตัวช่วยให้กับมุมมองของคุณดังนั้นในมุมมองของคุณหากคุณพิมพ์:
{!! BobFinder::bob() !!}
มันควรจะออก:
<strong>Bob?! Is that you?!</strong>
{!! bob() !!}
คือความสามารถในการเขียนเพียง จะทำการค้นหาเพิ่มเติมและดูว่าเป็นไปได้ไหม
bob()
โลกอย่างแท้จริงนั้นไม่ใช่สิ่งที่ควรทำ Namespaces มีไว้สำหรับเหตุผลและเราไม่ควรเรียกใช้bob()
ควบคู่ไปกับฟังก์ชั่น PHP พื้นฐาน ฉันจะเพิ่มชื่อแทนของคุณในรหัสของฉัน - ขอบคุณ!
extends Helper
? ดูเหมือนไม่จำเป็นสำหรับฉัน
extends Helper
เป็นจริงไม่จำเป็น ขอบคุณสำหรับหัวขึ้น.
ใช่มีวิธีอื่นในการทำเช่นนี้!
ขั้นตอนที่ 1:ลงทะเบียนคำสั่ง Blade ที่กำหนดเอง:
<?php // code in app/Providers/AppServiceProvider.php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Blade; // <-- This is important! Without it you'll get an exception.
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
// Make a custom blade directive:
Blade::directive('shout', function ($string) {
return trim(strtoupper($string), '(\'\')');
});
// And another one for good measure:
Blade::directive('customLink', function () {
return '<a href="#">Custom Link</a>';
});
}
...
ขั้นตอนที่ 2:ใช้คำสั่ง Blade ที่กำหนดเองของคุณ:
<!-- // code in resources/views/view.blade.php -->
@shout('this is my custom blade directive!!')
<br />
@customLink
ขาออก:
นี่คือใบขับขี่ของฉันเอง !!
ลิงก์ที่กำหนดเอง
ที่มา: https://laravel.com/docs/5.1/blade#extending-blade
อ่านเพิ่มเติม: https://mattstauffer.co/blog/custom-conditionals-with-laravels-blade-directives
หากคุณต้องการเรียนรู้วิธีสร้างคลาสที่กำหนดเองที่ดีที่สุดที่คุณสามารถใช้ได้ทุกที่ให้ดูที่คลาสที่กำหนดเองใน Laravel 5 วิธีที่ง่าย
นี่คือไฟล์ HelpersProvider.php ของฉัน:
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class HelperServiceProvider extends ServiceProvider
{
protected $helpers = [
// Add your helpers in here
];
/**
* Bootstrap the application services.
*/
public function boot()
{
//
}
/**
* Register the application services.
*/
public function register()
{
foreach ($this->helpers as $helper) {
$helper_path = app_path().'/Helpers/'.$helper.'.php';
if (\File::isFile($helper_path)) {
require_once $helper_path;
}
}
}
}
คุณควรสร้างโฟลเดอร์ที่เรียกว่าHelpers
ภายใต้app
โฟลเดอร์จากนั้นสร้างไฟล์ที่เรียกว่าwhatever.php
ข้างในและเพิ่มสตริงwhatever
ภายใน $ helpers array
ทำ!
ฉันไม่ได้ใช้ตัวเลือกนี้อีกต่อไปฉันกำลังใช้ผู้แต่งเพื่อโหลดไฟล์สแตติกเช่นผู้ช่วย
คุณสามารถเพิ่มผู้ช่วยเหลือได้โดยตรงที่:
...
"autoload": {
"files": [
"app/helpers/my_helper.php",
...
]
},
...
glob()
อย่างที่ Andrew Brown เขียนไว้หรือไม่ หากคุณต้องการระบุไฟล์ที่คุณต้องการรวมทำไมไม่ระบุไฟล์ในไฟล์composer.json
เพื่อโหลดโดยอัตโนมัติตามที่โจเซฟซิลเบอร์เขียน ทำไมคุณถึงชอบวิธีนี้ ฉันไม่ได้บอกว่านี่เป็นทางออกที่ไม่ดีฉันแค่อยากรู้อยากเห็น
composer.json
ยกเว้นสองจุด - อันดับแรกมันจะเก็บแผนที่ภายในแอปพลิเคชันนั้นเองแทนที่จะเป็นไฟล์ข้อมูลเมตา สองไม่จำเป็นต้องให้คุณเรียกใช้ซ้ำcomposer dump-autoload
ทุกครั้งที่คุณเปลี่ยนรายการไฟล์ที่จะโหลด
สำหรับ Custom Helper Libraries ในโครงการ Laravel ของฉันฉันได้สร้างโฟลเดอร์ที่มีชื่อLibraries
ในLaravel/App
Directory ของฉันและในDirectory Libraries ฉันได้สร้างไฟล์ต่าง ๆ สำหรับห้องสมุดผู้ช่วยเหลือที่แตกต่างกัน
หลังจากสร้างไฟล์ผู้ช่วยเหลือของฉันฉันก็รวมไฟล์เหล่านั้นทั้งหมดในไฟล์ผู้แต่งของฉันเช่นนี้
...
"autoload": {
"classmap": [
"database"
],
"files": [
"app/Libraries/commonFunctions.php"
],
"psr-4": {
"App\\": "app/"
}
},
...
และดำเนินการ
composer dump-autoload
composer dump-autoload
และcomposer dumpautoload
ยังทำงาน Infact composer du
จะทำงาน ...
เนื่องจาก OP ขอแนวทางปฏิบัติที่ดีที่สุดฉันคิดว่าเรายังขาดคำแนะนำดีๆอยู่ที่นี่
ไฟล์helpers.phpเดียวอยู่ไกลจากแนวปฏิบัติที่ดี ประการแรกเนื่องจากคุณผสมผสานฟังก์ชั่นที่แตกต่างกันมากมายดังนั้นคุณจึงไม่เห็นด้วยกับหลักการเข้ารหัสที่ดี นอกจากนี้อาจจะทำร้ายไม่ได้เป็นเพียงเอกสารรหัส แต่ยังชี้วัดรหัสเช่นCyclomatic ซับซ้อน , ดัชนีการบำรุงรักษาและสคีดไดรฟ์ ยิ่งคุณมีฟังก์ชั่นมากก็ยิ่งแย่
รหัสเอกสารจะตกลงใช้เครื่องมือเช่นphpDocumentorแต่ใช้Samiมันจะไม่ทำให้ไฟล์ขั้นตอน Laravel API เป็นกรณีดังกล่าว - ไม่มีเอกสารประกอบการทำงานของผู้ช่วยเหลือ: https://laravel.com/api/5.4
ตัวชี้วัดรหัสสามารถวิเคราะห์ด้วยเครื่องมือเช่นPhpMetrics ใช้ PhpMetrics รุ่น 1.x การวิเคราะห์ Laravel รหัส 5.4 กรอบจะทำให้คุณ CC / ตัวชี้วัด MI / HV ที่เลวร้ายมากสำหรับทั้งsrc / สว่าง / มูลนิธิ / helpers.phpและsrc / สว่าง / Support / helpers.phpไฟล์
ไฟล์ตัวช่วยบริบทหลายไฟล์ (เช่นstring_helpers.php , array_helpers.phpฯลฯ ) จะช่วยปรับปรุงการวัดที่ไม่ดีเหล่านั้นอย่างแน่นอนทำให้โค้ดง่ายขึ้น ขึ้นอยู่กับตัวสร้างเอกสารรหัสที่ใช้สิ่งนี้จะดีพอ
มันสามารถปรับปรุงเพิ่มเติมโดยใช้คลาสตัวช่วยด้วยวิธีการคงที่เพื่อให้พวกเขาสามารถบริบทโดยใช้เนมสเปซ เช่นเดียวกับวิธี Laravel แล้วจะมีIlluminate\Support\Str
และIlluminate\Support\Arr
ชั้นเรียน สิ่งนี้ช่วยปรับปรุงทั้งการวัดรหัส / องค์กรและเอกสาร นามแฝงของคลาสสามารถใช้เพื่อทำให้ง่ายต่อการใช้
การสร้างโครงสร้างด้วยคลาสทำให้การจัดระเบียบโค้ดและเอกสารดีขึ้น แต่ในทางกลับกันเราสิ้นสุดการทำหน้าที่ส่วนกลางที่สั้นและง่ายต่อการจดจำ เราสามารถปรับปรุงวิธีการต่อไปได้โดยการสร้างฟังก์ชันนามแฝงกับวิธีการเรียนคงที่เหล่านั้น ซึ่งสามารถทำได้ด้วยตนเองหรือแบบไดนามิก
Laravel ใช้วิธีแรกภายในโดยการประกาศฟังก์ชั่นในไฟล์ตัวช่วยขั้นตอนที่แมปไปยังวิธีการเรียนแบบคงที่ สิ่งนี้อาจไม่ใช่สิ่งที่สมบูรณ์แบบในขณะที่คุณต้องการประกาศเนื้อหาทั้งหมดอีกครั้ง (docblocks / อาร์กิวเมนต์)
ฉันเองใช้วิธีการแบบไดนามิกกับHelperServiceProvider
คลาสที่สร้างฟังก์ชั่นเหล่านั้นในเวลาดำเนินการ:
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class HelperServiceProvider extends ServiceProvider
{
/**
* The helper mappings for the application.
*
* @var array
*/
protected $helpers = [
'uppercase' => 'App\Support\Helpers\StringHelper::uppercase',
'lowercase' => 'App\Support\Helpers\StringHelper::lowercase',
];
/**
* Bootstrap the application helpers.
*
* @return void
*/
public function boot()
{
foreach ($this->helpers as $alias => $method) {
if (!function_exists($alias)) {
eval("function {$alias}(...\$args) { return {$method}(...\$args); }");
}
}
}
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
//
}
}
หนึ่งสามารถพูดได้ว่านี่เป็นงานวิศวกรรม แต่ฉันไม่คิดอย่างนั้น มันใช้งานได้ดีและตรงกันข้ามกับสิ่งที่คาดหวังว่าจะไม่เสียเวลาในการดำเนินการที่เกี่ยวข้องอย่างน้อยเมื่อใช้ PHP 7.x
นี่เป็นสคริปเชลล์ bash ที่ฉันสร้างขึ้นเพื่อทำให้ Laravel 5 facades อย่างรวดเร็ว
รันสิ่งนี้ในไดเร็กทอรีการติดตั้ง Laravel 5 ของคุณ
make_facade.sh -f <facade_name> -n '<namespace_prefix>'
ตัวอย่าง:
make_facade.sh -f helper -n 'App\MyApp'
หากคุณเรียกใช้ตัวอย่างนั้นมันจะสร้างไดเรกทอรีFacades
และProviders
ภายใต้ 'your_laravel_installation_dir / app / MyApp'
./app/MyApp/Facades/Helper.php
./app/MyApp/Facades/HelperFacade.php
./app/MyApp/Providers/HelperServiceProvider.php
หลังจากเสร็จสิ้นมันจะแสดงข้อความที่คล้ายกับข้อความต่อไปนี้:
===========================
Finished
===========================
Add these lines to config/app.php:
----------------------------------
Providers: App\MyApp\Providers\HelperServiceProvider,
Alias: 'Helper' => 'App\MyApp\Facades\HelperFacade',
ดังนั้นอัปเดตรายการผู้ให้บริการและชื่อแทนใน 'config / app.php'
วิ่ง composer -o dumpautoload
"./app/MyApp/Facades/Helper.php" จะมีลักษณะดังนี้:
<?php
namespace App\MyApp\Facades;
class Helper
{
//
}
ตอนนี้เพียงเพิ่มวิธีการของคุณใน "./app/MyApp/Facades/Helper.php"
นี่คือสิ่งที่ "./app/MyApp/Facades/Helper.php" ดูเหมือนหลังจากที่ฉันเพิ่มฟังก์ชัน Helper
<?php
namespace App\MyApp\Facades;
use Request;
class Helper
{
public function isActive($pattern = null, $include_class = false)
{
return ((Request::is($pattern)) ? (($include_class) ? 'class="active"' : 'active' ) : '');
}
}
This is how it would be called:
===============================
{!! Helper::isActive('help', true) !!}
ฟังก์ชั่นนี้คาดหวังรูปแบบและสามารถยอมรับอาร์กิวเมนต์บูลีนที่สองหรือไม่ก็ได้
หาก URL ปัจจุบันตรงกับรูปแบบที่ส่งไปจะมีการส่งออก 'active' (หรือ 'class = "active"' ถ้าคุณเพิ่ม 'true' เป็นอาร์กิวเมนต์ที่สองในการเรียกใช้ฟังก์ชัน)
ฉันใช้เพื่อเน้นเมนูที่ใช้งานอยู่
#!/bin/bash
display_syntax(){
echo ""
echo " The Syntax is like this:"
echo " ========================"
echo " "$(basename $0)" -f <facade_name> -n '<namespace_prefix>'"
echo ""
echo " Example:"
echo " ========"
echo " "$(basename $0) -f test -n "'App\MyAppDirectory'"
echo ""
}
if [ $# -ne 4 ]
then
echo ""
display_syntax
exit
else
# Use > 0 to consume one or more arguments per pass in the loop (e.g.
# some arguments don't have a corresponding value to go with it such
# as in the --default example).
while [[ $# > 0 ]]
do
key="$1"
case $key in
-n|--namespace_prefix)
namespace_prefix_in="$2"
echo ""
shift # past argument
;;
-f|--facade)
facade_name_in="$2"
shift # past argument
;;
*)
# unknown option
;;
esac
shift # past argument or value
done
fi
echo Facade Name = ${facade_name_in}
echo Namespace Prefix = $(echo ${namespace_prefix_in} | sed -e 's#\\#\\\\#')
echo ""
}
function display_start_banner(){
echo '**********************************************************'
echo '* STARTING LARAVEL MAKE FACADE SCRIPT'
echo '**********************************************************'
}
# Init the Vars that I can in the beginning
function init_and_export_vars(){
echo
echo "INIT and EXPORT VARS"
echo "===================="
# Substitution Tokens:
#
# Tokens:
# {namespace_prefix}
# {namespace_prefix_lowerfirstchar}
# {facade_name_upcase}
# {facade_name_lowercase}
#
namespace_prefix=$(echo ${namespace_prefix_in} | sed -e 's#\\#\\\\#')
namespace_prefix_lowerfirstchar=$(echo ${namespace_prefix_in} | sed -e 's#\\#/#g' -e 's/^\(.\)/\l\1/g')
facade_name_upcase=$(echo ${facade_name_in} | sed -e 's/\b\(.\)/\u\1/')
facade_name_lowercase=$(echo ${facade_name_in} | awk '{print tolower($0)}')
# Filename: {facade_name_upcase}.php - SOURCE TEMPLATE
source_template='<?php
namespace {namespace_prefix}\Facades;
class {facade_name_upcase}
{
//
}
'
# Filename: {facade_name_upcase}ServiceProvider.php - SERVICE PROVIDER TEMPLATE
serviceProvider_template='<?php
namespace {namespace_prefix}\Providers;
use Illuminate\Support\ServiceProvider;
use App;
class {facade_name_upcase}ServiceProvider extends ServiceProvider {
public function boot()
{
//
}
public function register()
{
App::bind("{facade_name_lowercase}", function()
{
return new \{namespace_prefix}\Facades\{facade_name_upcase};
});
}
}
'
# {facade_name_upcase}Facade.php - FACADE TEMPLATE
facade_template='<?php
namespace {namespace_prefix}\Facades;
use Illuminate\Support\Facades\Facade;
class {facade_name_upcase}Facade extends Facade {
protected static function getFacadeAccessor() { return "{facade_name_lowercase}"; }
}
'
}
function checkDirectoryExists(){
if [ ! -d ${namespace_prefix_lowerfirstchar} ]
then
echo ""
echo "Can't find the namespace: "${namespace_prefix_in}
echo ""
echo "*** NOTE:"
echo " Make sure the namspace directory exists and"
echo " you use quotes around the namespace_prefix."
echo ""
display_syntax
exit
fi
}
function makeDirectories(){
echo "Make Directories"
echo "================"
mkdir -p ${namespace_prefix_lowerfirstchar}/Facades
mkdir -p ${namespace_prefix_lowerfirstchar}/Providers
mkdir -p ${namespace_prefix_lowerfirstchar}/Facades
}
function createSourceTemplate(){
source_template=$(echo "${source_template}" | sed -e 's/{namespace_prefix}/'${namespace_prefix}'/g' -e 's/{facade_name_upcase}/'${facade_name_upcase}'/g' -e 's/{facade_name_lowercase}/'${facade_name_lowercase}'/g')
echo "Create Source Template:"
echo "======================="
echo "${source_template}"
echo ""
echo "${source_template}" > ./${namespace_prefix_lowerfirstchar}/Facades/${facade_name_upcase}.php
}
function createServiceProviderTemplate(){
serviceProvider_template=$(echo "${serviceProvider_template}" | sed -e 's/{namespace_prefix}/'${namespace_prefix}'/g' -e 's/{facade_name_upcase}/'${facade_name_upcase}'/g' -e 's/{facade_name_lowercase}/'${facade_name_lowercase}'/g')
echo "Create ServiceProvider Template:"
echo "================================"
echo "${serviceProvider_template}"
echo ""
echo "${serviceProvider_template}" > ./${namespace_prefix_lowerfirstchar}/Providers/${facade_name_upcase}ServiceProvider.php
}
function createFacadeTemplate(){
facade_template=$(echo "${facade_template}" | sed -e 's/{namespace_prefix}/'${namespace_prefix}'/g' -e 's/{facade_name_upcase}/'${facade_name_upcase}'/g' -e 's/{facade_name_lowercase}/'${facade_name_lowercase}'/g')
echo "Create Facade Template:"
echo "======================="
echo "${facade_template}"
echo ""
echo "${facade_template}" > ./${namespace_prefix_lowerfirstchar}/Facades/${facade_name_upcase}Facade.php
}
function serviceProviderPrompt(){
echo "Providers: ${namespace_prefix_in}\Providers\\${facade_name_upcase}ServiceProvider,"
}
function aliasPrompt(){
echo "Alias: '"${facade_name_upcase}"' => '"${namespace_prefix_in}"\Facades\\${facade_name_upcase}Facade',"
}
#
# END FUNCTION DECLARATIONS
#
###########################
## START RUNNING SCRIPT ##
###########################
display_start_banner
init_and_export_vars
makeDirectories
checkDirectoryExists
echo ""
createSourceTemplate
createServiceProviderTemplate
createFacadeTemplate
echo ""
echo "==========================="
echo " Finished TEST"
echo "==========================="
echo ""
echo "Add these lines to config/app.php:"
echo "----------------------------------"
serviceProviderPrompt
aliasPrompt
echo ""
แทนที่จะรวมคลาสตัวช่วยที่กำหนดเองของคุณคุณสามารถเพิ่มลงในconfig/app.php
ไฟล์ภายใต้ชื่อแทนได้
ควรมีลักษณะเช่นนี้
'aliases' => [
...
...
'Helper' => App\Http\Services\Helper::class,
]
จากนั้นไปที่ Controller ของคุณให้รวม Helper โดยใช้เมธอด 'use Helper' เพื่อให้คุณสามารถเรียกวิธีการบางอย่างในคลาส Helper ของคุณ
eg. Helper::some_function();
หรือในมุมมองทรัพยากรคุณสามารถเรียกคลาส Helper ได้โดยตรง
eg. {{Helper::foo()}}
แต่นี่ยังคงเป็นวิธีการเขียนโปรแกรมสไตล์นักพัฒนาที่จะปฏิบัติตาม เราอาจมีวิธีที่แตกต่างกันในการแก้ปัญหาและฉันต้องการแบ่งปันสิ่งที่ฉันมีสำหรับผู้เริ่มต้นด้วย
สร้างไดเรกทอรีของผู้ช่วยเหลือที่กำหนดเอง: ขั้นแรกให้สร้างไดเรกทอรีผู้ช่วยเหลือในไดเรกทอรีแอป สร้างคำจำกัดความของคลาส hlper: ตอนนี้เรามาสร้างฟังก์ชั่นตัวช่วยง่ายๆที่จะต่อกันสองสาย สร้างไฟล์ใหม่ MyFuncs.php ใน /app/Helpers/MyFuncs.php เพิ่มรหัสต่อไปนี้
<?php
namespace App\Helpers;
class MyFuncs {
public static function full_name($first_name,$last_name) {
return $first_name . ', '. $last_name;
}
}
แอปเนมสเปซ \ ผู้ช่วยเหลือ กำหนด Helpers namespace ภายใต้ App namespace คลาส MyFuncs {…} กำหนดคลาสผู้ช่วย MyFuncs ฟังก์ชั่นคงที่สาธารณะ full_name ($ first_name, $ last_name) {…} กำหนดฟังก์ชั่นคงที่ยอมรับสองพารามิเตอร์สตริงและส่งกลับสตริงที่ตัดแบ่ง
บริการผู้ช่วยจัดเตรียมคลาส
ผู้ให้บริการจะใช้ในการโหลดคลาสอัตโนมัติ เราจะต้องกำหนดผู้ให้บริการที่จะโหลดคลาสตัวช่วยทั้งหมดของเราในไดเรกทอรี / app / Helpers
เรียกใช้คำสั่งช่างต่อไปนี้:
ช่าง PHP ทำ: ผู้ให้บริการ HelperServiceProvider
ไฟล์จะถูกสร้างขึ้นใน /app/Providers/HelperServiceProvider.php
Open /app/Providers/HelperServiceProvider.php
เพิ่มรหัสต่อไปนี้:
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class HelperServiceProvider extends ServiceProvider {
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
//
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
foreach (glob(app_path().'/Helpers/*.php') as $filename){
require_once($filename);
}
}
}
ที่นี่
namespace App\Providers; defines the namespace provider
use Illuminate\Support\ServiceProvider; imports the ServiceProvider class namespace
class HelperServiceProvider extends ServiceProvider {…} defines a class HelperServiceProvider that extends the ServiceProvider class
public function boot(){…} bootstraps the application service
public function register(){…} is the function that loads the helpers
foreach (glob(app_path().'/Helpers/*.php') as $filename){…} loops through all the files in /app/Helpers directory and loads them.
ตอนนี้เราต้องลงทะเบียน HelperServiceProvider และสร้างนามแฝงสำหรับผู้ช่วยเหลือของเรา
เปิด/config/app.php
ไฟล์
ค้นหาตัวแปรอาร์เรย์ผู้ให้บริการ
เพิ่มบรรทัดต่อไปนี้
App\Providers\HelperServiceProvider::class,
ค้นหาตัวแปรอาร์เรย์ aliases
เพิ่มบรรทัดต่อไปนี้
'MyFuncs' => App\Helpers\MyFuncs::class,
บันทึกการเปลี่ยนแปลงโดยใช้ผู้ช่วยที่กำหนดเองของเรา
เราจะสร้างเส้นทางที่จะเรียกฟังก์ชั่นตัวช่วยที่กำหนดเองของเราเปิด /app/routes.php
เพิ่มคำจำกัดความของเส้นทางต่อไปนี้
Route::get('/func', function () {
return MyFuncs::full_name("John","Doe");
});
ที่นี่
return MyFuncs::full_name("John","Doe"); calls the static function full_name in MyFuncs class
ขั้นแรกให้สร้าง helpers.php ภายในไดเรกทอรี App \ Http จากนั้นเพิ่มรหัสต่อไปนี้ภายใน composer.json
"autoload": {
"classmap": [
"database"
],
"files": [
"app/Http/helpers.php"
],
"psr-4": {
"App\\": "app/"
}
},
ถัดไปเรียกใช้คำสั่งต่อไปนี้
composer dump-autoload
ตอนนี้คุณสามารถกำหนดฟังก์ชั่นที่คุณกำหนดเองได้ในไฟล์ helpers.php
อีกวิธีที่ฉันใช้คือ: 1) สร้างไฟล์ใน app \ FolderName \ fileName.php และมีรหัสนี้อยู่ข้างในนั่นคือ
<?php
namespace App\library
{
class hrapplication{
public static function libData(){
return "Data";
}
}
}
?>
2) หลังจากนั้นในใบมีดของเรา
$FmyFunctions = new \App\FolderName\classsName;
echo $is_ok = ($FmyFunctions->libData());
แค่นั้นแหละ. และมันใช้งานได้
วิธีปฏิบัติที่ดีที่สุดในการเขียนผู้ช่วยที่กำหนดเองคือ
1) ภายในapp
ไดเรกทอรีของรูทโปรเจคให้สร้างโฟลเดอร์ชื่อ Helpers (เพื่อแยกและจัดโครงสร้างโค้ด)
2) ข้างในโฟลเดอร์เขียนไฟล์ psr-4 หรือไฟล์ php ปกติ
หากไฟล์ PHP อยู่ในรูปแบบของ psr-4 มันจะถูกโหลดโดยอัตโนมัติมิฉะนั้นให้เพิ่มบรรทัดต่อไปนี้ใน composer.json ซึ่งอยู่ในไดเรกทอรีรากโครงการ
ภายในautoload
คีย์สร้างคีย์ใหม่ที่ชื่อfiles
เพื่อโหลดไฟล์ในเวลาที่โหลดอัตโนมัติภายในfiles
วัตถุเพิ่มเส้นทางที่เริ่มต้นจากไดเรกทอรีแอปนี่คือตัวอย่าง
"autoload": {
"classmap": [
"database"
],
"psr-4": {
"App\\": "app/"
},
"files": [
"app/Helpers/customHelpers.php"
]
},
"autoload-dev": {
"classmap": [
"tests/TestCase.php"
]
},
PS: ลองใช้งานcomposer dump-autoload
ถ้าไฟล์ไม่ได้ถูกโหลดไว้
สร้าง Helpers.php ในแอพ / Helper / Helpers.php
namespace App\Helper
class Helpers
{
}
เพิ่มในการปรับปรุงผู้แต่งและผู้แต่ง
"autoload": {
"classmap": [
"database/seeds",
"database/factories",
"database","app/Helper/Helpers.php"
],
"psr-4": {
"App\\": "app/"
},
"files": ["app/Helper/Helpers.php"]
},
ใช้ในการควบคุม
ใช้ App \ Helper \ Helpers
ใช้ในมุมมอง การเปลี่ยนแปลงในไฟล์ config-> app.php
'aliases' => [
...
'Helpers' => 'App\Helper\Helpers'
],
โทรในมุมมอง
<?php echo Helpers::function_name(); ?>
composer.json
นั้นไม่มีประโยชน์เนื่องจาก psr-4 autoload จะทำงานดังกล่าว
ใน dir bootstrap \ autoload.php
require __DIR__.'/../vendor/autoload.php';
require __DIR__.'/../app/Helpers/function.php'; //add
เพิ่มไฟล์นี้
app\Helpers\function.php
**
** สร้างผู้ช่วยใหม่
<?php
namespace App\Helpers;
use Illuminate\Database\Eloquent\Collection;
class StatusHelper
{
protected static $_status = [
1=> [
'value' => 1,
'displayName' => 'Active',
],
2 => [
'value' => 2,
'displayName' => 'Inactive',
],
3 => [
'value' => 3,
'displayName' => 'Delete',
],
];
public static function getStatusesList()
{
$status = (new Collection(self::$_status))->pluck('displayName', 'value')->toArray();
return $status;
}
}
ใช้สำหรับตัวควบคุมและไฟล์มุมมองใด ๆ
use App\Helpers\StatusHelper;
class ExampleController extends Controller
{
public function index()
{
$statusList = StatusHelper::getStatusesList();
return view('example.index', compact('statusList'));
}
}
ใน laravel 5.3 ขึ้นไปทีม laravel ย้ายไฟล์ขั้นตอนทั้งหมด ( routes.php
) ออกจากapp/
ไดเรกทอรีและapp/
โฟลเดอร์ทั้งหมดจะถูกpsr-4
โหลดอัตโนมัติ คำตอบที่ยอมรับจะใช้งานได้ในกรณีนี้ แต่มันก็ไม่เหมาะสม
ดังนั้นสิ่งที่ฉันทำคือฉันสร้างhelpers/
ไดเรกทอรีที่รูทของโปรเจคและวางไฟล์ผู้ช่วยเหลือไว้ในนั้นและในcomposer.json
ไฟล์ของฉันฉันทำสิ่งนี้:
...
"autoload": {
"classmap": [
"database"
],
"psr-4": {
"App\\": "app/"
},
"files": [
"helpers/ui_helpers.php"
]
},
...
ด้วยวิธีนี้ของฉัน app/
ไดเรกทอรียังคงเป็น psr-4 ที่โหลดอัตโนมัติและผู้ช่วยเหลือจะได้รับการจัดระเบียบที่ดีขึ้นเล็กน้อย
หวังว่านี่จะช่วยใครซักคน
มีคำตอบที่ดีที่นี่ แต่ฉันคิดว่านี่เป็นวิธีที่ง่ายที่สุด ใน Laravel 5.4 (และรุ่นก่อนหน้าโพรบด้วย) คุณสามารถสร้างคลาสที่สะดวกสำหรับคุณเช่น App / Libraries / Helper.php
class Helper() {
public function uppercasePara($str) {
return '<p>' .strtoupper($str). '<p>;
}
}
จากนั้นคุณสามารถเรียกมันได้ในเทมเพลต Blade ของคุณดังนี้:
@inject('helper', \App\Libraries\Helper)
{{ $helper->drawTimeSelector() }}
หากคุณไม่ต้องการใช้ @inject ให้ใช้ฟังก์ชัน 'uppercasePara' เป็นแบบสแตติกและฝังการโทรในเทมเพลต Blade ของคุณดังนี้:
{{ \App\Libraries\Helper::drawTimeSelector() }}
ไม่จำเป็นต้องใช้ชื่อแทน Laravel แก้ไขคลาสคอนกรีตโดยอัตโนมัติ