1

設計上の決定について、このコミュニティの貴重な意見をお願いします。

私は推進力と組み合わせてCodeIgniterを使用しています。最近、既存のすべてのテーブルに updated_by フィールドを追加する必要があり、明らかにすべての使用法をリファクタリングする必要がありました。

ユーザー オブジェクトはライブラリ内に保存され、(すべてのログイン資格情報が一致すると仮定して) 次の方法でアクセスできます。

$this->auth->getUser(); //Returns a propel collection

理想的には、自動化されたものを作成したいと思います(タイムスタンプ可能な動作のようなものです)。このようなものを使用してこれを達成する簡単な方法があります (コードはあまり気にしないでください。メモリからここに書き留めただけです。アイデアを得るだけです)。

public function preSave(\PropelPDO $con = null)
{
    $CI =& get_instance();
    $user = $CI->auth->getUser();
    $this->setUserRelatedByUpdatedBy($user)
    if(is_null( $this->getUserRelatedByCreatedBy() ) )
    {
       $this->setUserRelatedByCreatedBy($user);
    }
    return $this;
}

問題は、この場合、モデルが codeigniter ライブラリと直接対話していることですが、これは MVC パラダイムに違反していますか?

これを実現するもう 1 つの方法は、データを保存するときにすべてのコントローラーに setUserRelatedByUpdatedBy と setUserRelatedByUpdatedBy を追加することです。これは厳密には MVC ですが、まったく同じ行をどこでも繰り返すことになります。

このケースをどのように処理しますか?ユーザーが行を作成/更新するためのタイムスタンプ可能な動作のようなものを自動的に達成する適切な方法はありますか?

どうもありがとうございました。

4

1 に答える 1

2

私が最近採用した経験則は次のとおりです。

としょうかん

ライブラリは可能な限り独立している必要があります。多くの場合get_instance()、ライブラリはそれ自体でほとんどのことを処理することになっているため、使用することさえできません。
CodeIgniter 独自のライブラリのように、ライブラリは問題の一般的な解決策と考えてください。それらのほとんど/すべては独立しており、特定の目的を持っています。

あなたが読んForm_validationで、それがまさにそれがすることです。それが機能するために他のライブラリやモデルは必要ありません。優れたライブラリとは、値を変更するだけで誰もが独自のアプリに使用できるライブラリです$config

ライブラリは、ライブラリなどの場合にデータベースクエリを使用できる必要がありsessionます。構成ファイル内で設定されたテーブル名を使用します。

モデル

モデル可能な限りデータベース クエリに関連付ける必要がありますが、さらに重要なことは、プロジェクト用にモデルを作成することです。それがライブラリとモデルの違いです。私がつまずいた典型的な問題はこれでした。モデルがデータベース呼び出しのみを処理することになっている場合、プロジェクトに固有の非データベース関数をどこに配置すればよいですか? それらはライブラリにあるべきではなく、ヘルパーにあるのも意味がないので、どこに配置すればよいでしょうか?

これに対する私の解決策は、一般的なモデルを使用することです。他のすべてのモデル ファイルは で終わりますが_model、私は という名前のモデルを 1 つ持っており、generalこれを使用して他のモデルを inside でロードしますapplication/models/general。を実行する$this->general->load('utester')と、 から新しいモデルにアクセスできます$this->general->utester

さて、これは疑問視される可能性がありますが、これは私が CodeIgniter で 3 年間働いた後の私の結論です。基本的に何でもできるフレームワークです。内部$this->generalでは、ロジックがデータベース クエリに直接関係していないことがわかっています。その関数は、の配列を組み立てることform_dropdown()ができます。それは、ログイン動作のモデルである可能性があります。

ヘルパー

ヘルパーは、ビュー ファイル内の解析に最適です。ビュー内で使用することはできますが$this、変数をビューに送信する前にサーバー側で可能な限り多くの処理を行うことをお勧めします。残ったものはヘルパー関数で解析する必要があります。関数がビューとコントローラーの両方で頻繁に使用される場合は、それをヘルパーとして使用することもできます。

ヘルパーは、データベース クエリを使用する必要はありません。

私はこの対立に対して独自の解決策を作成しました。あなた自身の解決策を考え出すために、少なくとも少しは刺激を与えられたことを願っています。CodeIgniter で「最善の」解決策を見つけようとしないでください。嫌な思いをすることなく、最も理にかなった解決策を選んでください。私にとっての CodeIgniter とは、独自の解決策を見つける自由を意味します。

そして、私のアプローチに対するあなたの意見を聞いてもかまいません。一部の人は間違っていると考えるかもしれませんが、批評家はあなたの意見であり、それ以上のものではありません.

1) カスタムapplication/models/general.phpのコード

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

/* Used for Model scalability */
class General extends CI_Model {

    var $loaded     =   array();

    function load($mix)
    {
        $arr_load           =   array();
        $boo_is_array       =   is_array($mix);
        $boo_return_class   =   ! $boo_is_array;
        if ($boo_is_array)
            $arr_load   =   $mix;
        else
            $arr_load[] =   $mix;

        foreach ($arr_load as $int_key => $str_class) {

            $str_lower  =   strtolower($str_class);
            $str_name   =   ucfirst($str_class);

            $str_file   =   APPPATH . "models/general/{$str_lower}.php";

            $boo_success    =   FALSE;
            if (file_exists($str_file))
                if ( ! in_array($str_lower, $this->loaded)) {

                    require_once $str_file;

                    $this->$str_lower   =   new $str_name();
                    $boo_success        =   TRUE;

                }

            if ( ! $boo_success)
                unset($arr_load[$int_key]);

        }

        if ($boo_return_class)
            return $this->$str_lower;

        return (bool) count($arr_load);
    }

}
于 2013-11-01T10:30:11.920 に答える