web-dev-qa-db-ja.com

好きなコハナのヒントと機能?

他のコミュニティウィキからインスピレーションを得て、あまり知られていないコハナのヒント、トリック、機能について聞いてみたいと思います。

  • 回答ごとに1つのヒントのみを含めてください。
  • 必要に応じてコハナバージョンを追加します。

これはコミュニティウィキです。

61

データベースの結果からForm :: select()オプションを生成する

コハナ3.1および3.0

$options = ORM::factory('model')
 ->order_by('title','ASC')
 ->find_all()
 ->as_array('id','title');

$select = Form::select('name', $options);

これはORMに限定されず、すべてのデータベース結果で使用できることに注意してください(すべてas_arrayをサポートしています)。詳細については、 データベースの結果 情報を参照してください。

デフォルトのオプションを追加する場合:

$options = Arr::merge(array('Please select a value.'), $options);
23
Kemo

最後に実行されたクエリを表示する

コハナ3.1および3.0

echo Database::instance()->last_query

Kohana 3では、クエリ中に発生したエラーをどのように把握しますか? から取得。

17
dusan

コハナを設定:: $ environment

これらの行を.htaccessに貼り付けます。

SetEnvIf SERVER_ADDR "^(127\.0\.0\.1|::1)$" KOHANA_ENV=development
SetEnvIf SERVER_ADDR "^((?!127\.0\.0\.1|::1).)*$" KOHANA_ENV=production

これで、ローカルホストを使用している場合は開発モードになり、それ以外の場合は本番モードになります。

編集: IPv6のサポートが追加されました

17
Edy

ORMを使用してピボットテーブルにデータを追加する

ORM add関数は、1ピボットテーブル1に保存する追加データを指定できる3番目のパラメーターを受け入れます。

たとえば、ユーザーに多くのロールがあり、ロールに多くのユーザーがいる場合(1roles_users1という名前のテーブルを介して)、列キーとデータ値の配列を3番目の引数としてaddメソッド。

コハナ3.1

サポートされていません。別の方法は、_pivot table_をロードし、他のテーブルの場合と同じようにデータを追加することです。

コハナ3.0

_$user->add('role', $role, array('date_role_added' => time()));
_

where _$role_ is ORM::factory('role', array('name' => 'user'));

15
dusan

this->request->route->uri()this->request->uri()の違い(コハナ3)

// Current URI = welcome/test/5 
// Using default route ":controller/:action/:id"

// This returns "welcome/test/5"
echo $this->request->uri(); 

// This returns "welcome/test1/5"
echo $this->request->uri(array( 'action' => 'test1' )); 

// This returns "welcome/index"
echo $this->request->route->uri();

// This returns "welcome/test1"
echo $this->request->route->uri(array( 'action' => 'test1' ));

ご覧のとおり、$ this-> request-> route-> uri()は現在のルートのデフォルト(idはnull)を使用し、$ this-> request-> uri()は現在のuriセグメントを適用します。

15
biakaveron

AJAXリクエストのauto_renderingをオフにします

これらのコードサンプルは、テンプレートコントローラーから拡張していることを前提としています。

コハナ3.1

public function before()
{
    parent::before();

    if (Request::current()->is_ajax())
    {
      $this->auto_render = FALSE;
    }
}

コハナ3.0

public function before()
{
    parent::before();

    if (Request::$is_ajax)
    {
      $this->auto_render = FALSE;
    }
}
12
fabian

維持可能なルート

HTMLとPHPでアンカーの場所をハードコーディングする代わりに、ルーティングを逆にすることをお勧めします。これは基本的に、ルートの場所を定義してからそれらを使用することを意味します。場所を変更する必要がある場合は、数百ではなく1か所で行います。

ルートはどこにでも定義できますが、アプリケーションbootstrapまたはモジュールbootstrap(init.php)に配置することをお勧めします。

それらは次のように設定されます。

Route::set('name', '<controller>(/<action>)', array('action' => 'login|logout');
  1. ルート名
  2. 照合するURLパス。
  3. <part>の照合対象を制限する正規表現。

パーツが角かっこで囲まれている場合、そのパーツはオプションです。ユーザーがパーツを提供しておらず、デフォルト値を提供する場合は、defaultsメソッドを使用して値を指定します。

->defaults(array('action' => 'login'));

コハナ3.1および3.0

次のコードは、リバーシブルルートを持つために使用されます。 URLパスを更新でき、すべてのURL should以前と同じように機能します。

Route::url('name', array('controller' => 'user', 'action' => 'login'));
11
alex

セットする base_url自動的に:

Kohana::init(array(
    // ...
    'base_url' => dirname($_SERVER['SCRIPT_NAME']),
    // ...
));

サイトが1&1でホストされている場合は、次を使用する必要があります。

Kohana::init(array(
    // ...
    'base_url' => substr($_SERVER["SCRIPT_NAME"], 0, strpos($_SERVER["SCRIPT_NAME"], basename($_SERVER["SCRIPT_FILENAME"])));
    // ...
));

Gallery3構成ファイル から取得)

9
Edy

内部リクエストの確認

これらはサブリクエストと呼ばれます。より詳細な説明については、Sam de Freyssinetsの記事をご覧ください: HMVCを使用したWebアプリケーションのスケーリング 。バージョン間の初期とインスタンスの違いに注意してください。

コハナ3.1

if (Request::initial() !== Request::current())
{
    print 'Internal called made with Request::factory';
}

コハナ3.0

if (Request::instance() !== Request::current())
{
    print 'Internal called made with Request::factory';
}
9

HMVC + AJAX = is_remote()

この関数は、内部リクエストとAJAXリクエスト)の両方をチェックします。ページの一部が最初にHMVC手法を使用して読み込まれ、その後AJAXで再読み込みできる場合に便利です。ベースに配置します。コントローラ、そこからすべての適切なコントローラを拡張します(私はそれを「ベースコントローラ」と呼びます):

public function is_remote()
{
    if ($this->request->is_initial())
    {
        if ($this->request->is_ajax())
        {
            return TRUE;
        }
        else
        {
            return FALSE;
        }
    }
    else
    {
        return TRUE;
    }
}

これを書くためのより短い(同等の)方法:

public function is_remote()
{
    return ( ! $this->request->is_initial() || $this->request->is_ajax());
}

お役に立てれば。

7
roomcays

エラーページを表示する

エラーページを表示する必要がある場合、Kohanaには例外が組み込まれています。例外をスローしたら、カスタム例外ハンドラーを作成して、HTMLエラーページを表示できます。開発中の実際のエラーを表示するスイッチが必要になります。

コハナ3.1

throw new HTTP_Exception_404('The article :article was not found', 
    array(':article' => $article->name));

2番目の引数は、エラーメッセージ内の文字列を置き換える方法を提供します。

コハナ3.0

HTTP例外はバンドルされていません。独自の例外を作成して処理する必要があります。コハナにはこのためのチュートリアルがあります: コハナ-カスタムエラーページ

6

_TRUNCATE mytable_のようなSQLクエリを プリペアドステートメント で実行するには、最初のパラメータとしてnullDB::query()メソッドに渡します。クエリがどのCRUD操作にも適合しない場合に便利です。

4
daGrevis