Laravel 4에서 전역 함수를 배치하는 가장 좋은 장소를 이해하려고합니다. 예를 들어 날짜 형식. 나는 정면이 너무 모듈식이 기 때문에 정면을 만드는 것이 가치가 있다고 생각하지 않습니다. 라이브러리 폴더를 만들고 클래스를 저장하는 방법에 대한 기사를 읽었지만 간단한 기능에는 많은 것 같습니다. 블레이드 템플릿에서 이와 같은 ‘도구’를 사용할 수 없어야합니까?
이와 같은 모범 사례는 무엇이며 블레이드 템플릿에서 어떻게 사용할 수 있습니까?
답변
추악하고 게으르고 끔찍한 방법 :의 끝에 새 기능을 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 ) 성능을 향상시킬 수있는 두 옵션을 결합 할 수 있습니다.
답변
이 작업을 수행하는 방법은 /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'
답변
Laravel의 helpers.php 메소드는 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 ) 이므로 날짜 형식을 지정하는 데 도우미가 필요하지 않을 수도 있습니다. 날짜 및 시간을 형식화하는 많은 메소드가 있습니다.
답변
View::share()
클로저와 함께 사용 하여이를 달성 할 수도 있습니다 . http://www.develophp.org/2014/07/laravel-4-blade-helper-functions/
추가 이점 : 추가 클래스를 만들 필요없이 전역 네임 스페이스를 깨끗하게 유지할 필요가 있습니다.