CodeIgniter:コントローラ、アクション、URL情報を取得する方法


124

次のURLがあります。

これらのURLからコントローラー名、アクション名を取得する方法。私はCodeIgniterの初心者です。この情報を取得するヘルパー関数はありますか

例:

$params = helper_function( current_url() )

どこの$paramsようなものになります

array (
  'controller' => 'system/settings', 
  'action' => 'edit', 
  '...'=>'...'
)

回答:


217

あなたはURIクラスを使うことができます:

$this->uri->segment(n); // n=1 for controller, n=2 for method, etc

また、次のように動作するように言われましたが、現在はテストできません。

$this->router->fetch_class();
$this->router->fetch_method();

私のコントローラーにはサブフォルダーがあるため、$ this-> uri-> segment(1)がコントローラー名を返すのはおそらく正しくありません。あなたの助けをありがとう、私は情報を取得するために$ this-> routerを使用します。
noname.cs 2010年

2
ディレクトリを正しく取得するには、次も使用できます。$ this-> router-> fetch_directory();
jmserra 2013年

6
Codeigniter 3を使用している場合は、コントローラーで$ this-> router-> class;を使用してください。メソッドの場合:$ this-> router-> method; ディレクトリの場合:$ this-> router-> directory; ドキュメント:codeigniter.com/user_guide/installation/...
cartalot

$ this-> router-> fetch_class(); $ this-> router-> fetch_method(); できます。
Dinesh Patra 2017年

133

URIセグメントを使用する代わりに、これを行う必要があります。

$this->router->fetch_class(); // class = controller
$this->router->fetch_method();

こうすることで、ルーティングされたURLの背後やサブドメインなどにいる場合でも、常に正しい値を使用していることがわかります。


このメソッドを使用すると、などのビューを呼び出すときに正しいクラスメソッド名を取得できないことがわかりましたmodules::run('module/controller/action')。ロードされたページのルーター情報を表示するだけです。これを克服する方法はありますか?
Starx

驚くばかり!これがどれほど安全であるかについて一言?つまり、これは偽装できますか?
HellaMad 2013年

これは受け入れられる答えであるはずです-または、ショートカットを使用します:$ this-> router-> class
ChristoKiwi

1
routes.phpのルートを変更した場合$this->router、コードが実行されるクラスは返されますが、オーバーライドでマスクされた実際のルーターは返されません。どちらの回答も、やりたいことに基づいて非常に役立ちます。
Tibor Szasz

これらの方法には、使用を廃止予定されている$this->router->class$this->router->methodの代わりに
リチャード

30

メソッドは非推奨です。

$this->router->fetch_class();
$this->router->fetch_method();

代わりにプロパティにアクセスできます。

$this->router->class;
$this->router->method;

codeigniterユーザーガイドを見る

URIルーティングメソッドfetch_directory()、fetch_class()、fetch_method()

プロパティでCI_Router::$directoryCI_Router::$classCI_Router::$methodて、パブリックになり、それぞれfetch_*()がプロパティを返すために他に何もしなくなりました。それらを保持することは意味がありません。

これらはすべて内部の文書化されていないメソッドですが、念のため後方互換性を維持するために、現時点では非推奨にしています。それらの一部を利用している場合は、代わりにプロパティにアクセスできます。

$this->router->directory;
$this->router->class;
$this->router->method;


11

追加として

$this -> router -> fetch_module(); //Module Name if you are using HMVC Component

このfetch_module()呼び出しは、CI 2.1.2では機能しません。/system/router.phpファイルで見つかりません。
ティム・ピーターソン2013

1
@timpeterson、回答で述べられているように、HMVCコンポーネントでのみ使用できます。
Starx 2013

ありがとう、あなたは私を救った
Barbz_YHOOL

7

更新

回答は2015年に追加され、次のメソッドは現在廃止されています

$this->router->fetch_class();  in favour of  $this->router->class; 
$this->router->fetch_method(); in favour of  $this->router->method;

こんにちは、次のアプローチを使用する必要があります

$this->router->fetch_class(); // class = controller
$this->router->fetch_method(); // action

この目的のためですが、これを使用するには、フックを拡張する必要がありCI_Controller、魅力のように機能します。URIセグメントを使用しないでください。


3

$ this-> uri-> segmentを使用している場合、URL書き換えルールが変更されると、セグメント名の一致が失われます。


3

このコードをクラスまたはライブラリの任意の場所で使用する

    $current_url =& get_instance(); //  get a reference to CodeIgniter
    $current_url->router->fetch_class(); // for Class name or controller
    $current_url->router->fetch_method(); // for method name

1

URLの最後のセグメントが常にアクションになります。このようにしてください:

$this->uri->segment('last_segment');

-1
$this->router->fetch_class(); 

//コントローラーのクラスに影響を与える$ this-> router-> fetch_method();

// 方法


-4

コントローラクラスが機能していません。

次のスクリプトを使用することをお勧めします

global $argv;

if(is_array($argv)){
    $action = $argv[1];
    $method = $argv[2];
}else{
    $request_uri = $_SERVER['REQUEST_URI'];
    $pattern = "/.*?\/index\.php\/(.*?)\/(.*?)$/";
    preg_match($pattern, $request_uri, $params);
    $action = $params[1];
    $method = $params[2];
}

$ this-> router-> fetch_class()やfetch_method()のような利用可能な定義済み関数があり、手動で行う必要はありません。
Naveed Ramzan 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.