Help us understand the problem. What is going on with this article?

FuelPHPで最初にやることあれこれ

More than 5 years have passed since last update.

いろいろ、こうやっておいた方がいいかなっていうまとめ

ソース管理

  • 無視ファイル
/.gitignoire
/composer.lock
/composer.phar
*~
*.bak
Thumbs.db
desktop.ini
.DS_Store
.buildpath
.project
.settings
*.tmproj
build
.idea
/docs
/fuel/vendor
/fuel/packages
/fuel/core
/fuel/app/logs/*/*/*
/fuel/app/cache/*/*
/fuel/app/tmp/*
/fuel/app/config/development/*
/fuel/app/config/production/*
/fuel/app/config/stage/*
/fuel/app/config/test/*
/fuel/app/config/crypt.php
nbproject/
  • オレオレスクリプトはGit管理しないようにする
vi .git/info/exclude
  • .htaccessで環境設定を行った場合、デプロイ後にGit管理から除外する (と戻す)
git update-index --skip-worktree public/.htaccess
#git update-index --no-skip-worktree public/.htaccess

パッケージ管理

mkdir PROJECT
cd PROJECT
wget https://raw.githubusercontent.com/goosys/Fuel-Installer/master/composer.json -O composer.json  --no-check-certificate
wget https://raw.githubusercontent.com/fuel/fuel/1.7/master/oil -O oil --no-check-certificate
curl -s http://getcomposer.org/installer | php
php composer.phar install

ディレクトリ構造

fuel/app/assetsの作成

  • jsもcssもアプリケーションの一部じゃないかと思うので、ちゃんとapp内に作成
  • publicからはシンボリックリンクする
  • アプリケーションではないjsはそのままpublicで使う(jQueryなど)
  • シンボリックリンク状態でもちゃんとGit管理できるのですごい
mkdir fuel/app/assets/common/{css,js} -p
pushd public/assets
ln -s ../../fuel/app/assets/common common
popd

LESSにしてみる

app/classes内の構成

  • ざっくりとはこんな感じ
  • 場合によっては、コントローラーの中をadminとpublicに分けたりもする
fuel/app/
├── controller
├── helper
├── model
├── observer
└── validation

コンフィグ

全環境共通設定

fuel/app/config/config.php
    'language'           => 'ja',
    'language_fallback'  => 'en',
    'locale'             => 'ja_JP',
    'encoding'  => 'UTF-8',
    'default_timezone'   => 'Asia/Tokyo',

    // 'log_threshold'    => Fuel::L_WARNING, //各環境で再設定(後述)
    'log_path'         => APPPATH.'logs/'.Fuel::$env.'/', //各環境用のディレクトリに格納
    // 'log_date_format'  => 'Y-m-d H:i:s',

  • aliasしておくと便利
~/.bash_profile
alias devlog='tail -n 30 -f fuel/app/logs/development/`date +\%Y/\%m/\%d`.php'

開発環境用設定

fuel/app/config/development/config.php
    'log_threshold'    => array(
        Fuel::L_ERROR,
        Fuel::L_WARNING,
        Fuel::L_DEBUG,
        //Fuel::L_INFO,
    ),

コントローラー

echo $person->age // "12"
echo $person->formatted_age //"12歳"

解説ページはこちら ⇒ FuelPHPのORMをフォーマット出力するパッケージが便利すぎるよ

ヘルパー

  • ちょっとした計算とかをさせる
  • こんなの ⇒ \Helper_Calc::tax( $price )

バリデーション

wget https://gist.githubusercontent.com/goosys/644e48e00af211b9220d/raw/error.php --no-check-certificate -O fuel/app/classes/validation/error.php
wget https://gist.githubusercontent.com/goosys/cf3882685df3869ce2ed/raw/validation.php --no-check-certificate -O fuel/app/classes/validation.php
wget https://gist.githubusercontent.com/goosys/88165c3ca0d2538c293f/raw/asset.php --no-check-certificate -O fuel/app/classes/validation/asset.php
wget https://gist.githubusercontent.com/goosys/11b72462edbf18086783/raw/uploads.php  --no-check-certificate -O fuel/app/config/uploads.php
wget https://gist.githubusercontent.com/goosys/e6a1d39adad473d871b7/raw/upload.php  --no-check-certificate -O fuel/app/config/upload.php
wget https://gist.githubusercontent.com/goosys/d7cb9a3af3381c4866ca/raw/japanese.php --no-check-certificate -O fuel/app/classes/validation/japanese.php

ビューテンプレート

コントローラーで$this->template->title=とかやるのが嫌なので、タイトルもビューで設定できるように設定。
その他、ビュー毎の追加CSSやJSにも対応。

fuel/app/views/template.php
<!DOCTYPE html><?php $content = (string) $content;/* コンテンツ部分のViewを先にレンダリング */ ?>
<html>
<head>
    <meta charset="utf-8">
    <title><?php echo View::get('title_bar',__('site.title')); ?></title>

    <?php /* スタイルシートの読み込み */ ?>
    <?php Asset::add_path('assets/common/', array('css', 'js', 'img')); ?>
    <?php echo Asset::css('style.css'); /*共通スタイルシート*/ ?>
    <?php echo Asset::render('extra_css'); /*View毎の追加スタイルシート*/ ?>
</head>
<body>
<div class="container"><!-- 共通のHTML構造をあれこれ -->
<?php echo $content; ?>
</div>
    <?php /* 読み込み速度向上のため、スクリプトは後方に記述 */ ?>
    <?php echo Asset::js('jquery-1.10.2.js'); /*jQuery*/ ?>
    <?php echo Asset::js('bootstrap.min.js'); /*Twitterbootstrap*/ ?>
    <?php echo Asset::js('script.js'); /*共通スクリプト*/ ?>
    <?php echo Asset::render('extra_js'); /*View毎の追加スクリプト*/ ?>
</body>
</html>
fuel/app/views/top.php
<?php View::set_global('title_bar','タイトルバーを変更'); ?>
<?php View::set_global('nav_bar','ナビゲーションバーのBrandを変更'); ?>
<?php Asses::js(array('top.js'),array(),'extra_js',false); /* トップページ用のスクリプトを追加 */ ?>
<?php Asses::css(array('top.css'),array(),'extra_css',false); /* トップページ用のCSSを追加 */ ?>
<div>ここからページの内容</div>

※もちろん、記述がなければデフォルト値になり、エラーにはなりません。
※参考:共通のテンプレートにアクション毎に設定できる追加ファイルを読み込ませる

マイグレーション

負荷対策

wget https://gist.githubusercontent.com/goosys/01e588dbc15235d4a908/raw/migrate_indexes.php --no-check-certificate -O fuel/app/tasks/migrate_indexes.php

多言語化

このくらいやっておくと、Viewを機械的に生成できるのでかなり便利。

ORMの日本語化

cat << EOF > fuel/app/lang/ja/model.php
<?php
return array(
    'model'=>array(
    )
);
EOF

選択肢の日本語化

cat << EOF > fuel/app/lang/ja/selector.php
<?php
return array(
);
EOF

ドキュメントルート

index.php

こんな記事があったので、該当箇所は予め削除。
それか、以下のように開発環境だけで使用する。

public/index.php
// This will add the execution time and memory usage to the output.
// Comment this out if you don't use it.
if ( Fuel::$env !== Fuel::PRODUCTION ){
if (strpos($response->body(), '{exec_time}') !== false or strpos($response->body(), '{mem_usage}') !== false)
{
    $bm = Profiler::app_total();
    $response->body(
        str_replace(
            array('{exec_time}', '{mem_usage}'),
            array(round($bm[0], 4), round($bm[1] / pow(1024, 2), 3)),
            $response->body()
        )
    );
}
}
  • 500エラーの場合にCatchしてくれないのでするように (500ページは自前で用意する)
public/index.php
catch (HttpServerErrorException $e)
{
    \Request::reset_request(true);

    $route = array_key_exists('_500_', Router::$routes) ? Router::$routes['_500_']->translation : Config::get('routes._500_');

    if($route instanceof Closure)
    {
        $response = $route();

        if( ! $response instanceof Response)
        {
            $response = Response::forge($response);
        }
    }
    elseif ($route)
    {
        $response = Request::forge($route, false)->execute()->response();
    }
    else
    {
        throw $e;
    }
}
catch (HttpNotFoundException $e)
{

.htaccess

  • favicon.icoが無い時余計に処理が走ってしまうのを防止
public/.htaccess
# Send request via index.php (again, not if its a real file or folder)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !^(favicon\.ico)

テスト

  • 環境を指定してテストを実行
env FUEL_ENV=test php oil r migrate:down --version=0
env FUEL_ENV=test php oil r migrate
env FUEL_ENV=test php oil r test --group=AppModel

おわり

他、まだあるけど思いついたら書く

goosys
PHP、Railsします イラスト描きます 写真撮ります
bulbcorp
札幌で開発してます。自社プロダクトでシェアリングエコノミーパッケージ、VRサービス、茶道アプリなど作ってます。
http://bulbcorp.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away