3

バックグラウンド:

CodeIgniterにHMVCプラグインを使用していますが、この質問は一般的にMVCで発生する可能性があります。

質問:

$routes特定のコントローラー/モジュールを呼び出すためにURLレイアウトを一致させるために使用する必要がありますか、それとも__remap()URLシリーズの次の「モジュール」を呼び出すために各コントローラーで関数を作成する必要がありますか?

これらの方法のいずれかを正常に実装できますが、明確な勝者は実際には見当たりません。ある方法を別の方法よりも使用する理由を探しています(両方の組み合わせがより適切でない限り)。

また、構文に関するヘルプは探していません。以下に小さなエラーがある場合は、無視してかまいません。MVC(HMVC)のベストプラクティスを自分のサイトに適用する方法を探しています。

訪問者が遭遇する可能性のあるURL:

私のアプリケーションで次のURLが見つかる可能性があると仮定します。

Main Site:
http://www.example.com

Individual Static Pages:
                   .../staticPage1
                   .../staticPage2

Profession Sections:
                   .../profession1
                   .../profession2

Users Section (Unique to each profession):
                   .../profession#/users
                               .../users/id
                               .../users/dashboard
                               .../users/edit
                               .../users/preferences

Events Section (Unique to each profession):
                   .../profession#/events
                               .../events/id
                               .../events/dates
                               .../events/location
                               .../events/create

Search Page (Unique to each profession):
                   .../profession#/search

前述のURLセグメントに対応するコントローラー:

および対応するコントローラー:

  • サイト
  • ページ
  • 職業(特定の職業番号として拡張)
  • ユーザー
  • イベント
  • 探す

コントローラのCodeIgniterディレクトリレイアウト:

それぞれが独自のモジュールとして機能し、そのように保存されます。

/applications
             /modules
                     /site/
                     /pages/
                     /professions/
                     /users/
                     /events/
                     /search/

各モジュールには、、、modelsおよびviewsサブcontrollersディレクトリがあります。

$ routersの例:

これをすべて達成するためにルーターを使用する場合は、ファイルroutesで定義した次のものを使用します。config

//Defaults
$route['default_controller'] = 'site';
$route['404_override'] = '';

//Users
$route['(?i)([a-z0-9_-]+)/users'] = 'users';
$route['(?i)([a-z0-9_-]+)/users/(:num)(/(:any))?'] = 'users/dashboard/$2';
$route['(?i)([a-z0-9_-]+)/users/(:any)'] = 'users/$2';

//Specific Sections
$route['(?i)([a-z0-9_-]+)/search'] = 'search/eventSearch';

//Events
$route['(?i)([a-z0-9_-]+)/events'] = 'events';
$route['(?i)([a-z0-9_-]+)/events/(:num)(/(:any))?'] = 'events/getById/$2';
$route['(?i)([a-z0-9_-]+)/events/(:any)'] = 'events/getByCategory/$2';

//Profession1
$route['(?i)profession1'] = 'profession1';
$route['(?i)profession1(/(:any)?)'] = 'profession1/$2';


//Profession2
$route['(?i)profession2'] = 'profession2';
$route['(?i)profession2(/(:any)?)'] = 'profession2/$2';

//Pages
$route['(?i)(:any)'] = "pages/index/$1";

職業の例__remap()

__remap()それが最善のアプローチであることが判明した場合、私は各コ​​ントローラーで使用できる機能を開発しました。Professionsこれは、コントローラー用のそのような関数の1つのサンプルです。

public function _remap( $method )
{
        if( isset( $this->uri->segment(3) ) )
        {
            $method2 = $this->uri->segment(3);
        } else {
            $method2 = 'index';
        }
    if ($method == 'users')
    {
        $method2 = $this->uri->segment(3);
        $this->load->module('users');
        $this->users->$method2();
    }
    elseif ($method == 'events')
    {
        $method2 = $this->uri->segment(3);
        $this->load->module('events');
        $this->events->$method2();
    }
    elseif ($method == 'search')
    {
        $this->load->module('search');
        $this->search->$method2();
    }
    else
    {
        $this->$method();
    }
}

結論:

この問題を解決するために必要な追加情報がある場合は、お知らせください。提供します。

4

1 に答える 1

1

$route同様の問題をremap解決できますが、ある程度異なる傾向があります。CodeIgniterのほとんどの場合と同様に、特定のソリューションの中から最適なソリューションを見つけるのはあなた次第です。

ルートソリューションは、あなたの意図をよく理解したデザインを提供します。あなたや他の人はすべてのURLがどこに行くのかを見ることができます、そして個人的にはそれが非常に扱いやすいのでほとんどの場合これを好みます。

_remap()は、多くの異なるクラス名(多くの場合2番目のuri)を持つ類似した(または単純な)呼び出しが多数ある場合に便利です。あなたの場合はどちらかと思われるかもしれません。
上記の_remap関数を削除することができます。この場合、これが最善の解決策になります。

public function _remap( $method )
{
    $function = array(  'users'     =>  'users',
                        'events'    =>  'courses',
                        'search'    =>  'search');
    switch ($method) {
        case 'users':
        case 'events':
        case 'search':
            $method2 = ($this->uri->segment(3) ?: 'index');
            $this->load->module($method);
            $this->$function[$method]->$method2();

            break;
        default:
            $this->$method();

            break;
    }
}

つまり、基本的には、さまざまな呼び出しに対して単純な構造を持っているように見えるので、この場合は$ routeで_remap()を使用すると言います。ただし、トラブルシューティングを簡単にするために、この動作を説明するコメントを$routeファイルに残すことをお勧めします。

于 2012-05-17T07:08:56.407 に答える