Codeigniter-生活を楽にします(ベースコントローラーを拡張します)

今日、ほとんどすべてのアプリケーションで、複数の言語で作業し、アクセス制御を提供する必要があります。

しばらく前に、これらのことをcodeignierで処理する方法をブログで説明しましたが、ブログは閉じられており、それらのいくつかにはまだ同じ質問があります。





開始するには、アプリケーションを準備します。

展開ルート:

routes.php (/system/application/config/routes.php)を開きます

次の行を追加します。

$ route [ '(ru | en)' ] = $ route [ 'default_controller' ];

$ route [ '(ru | en)/(。+)' ] = "$ 2" ; *このソースコードは、 ソースコードハイライターで強調表示されました。


したがって、次の3つの方法で、任意のメソッド、任意のコントローラーにアクセスできます。

www.yourapp /コントローラー/アクション

www.yourapp / ru / controller / action

www.yourapp / ja /コントローラー/アクション



また、2つの言語ファイルinterface_lang.php (/system/application/language/english/interface_lang.phpおよび/system/application/language/russian/interface_lang.php)を作成します

言語の準備が完了しました。次に、アクセス制御を準備します。



アクセス制御には、Zend_Aclを使用します。 非常に便利なことです。

ZendFrameworkをダウンロードしてください。 拡張機能フォルダー(システム/拡張機能)を作成し、そこにライブラリー/ Zendフォルダーを転送します

次に、2つのヘルパーを作成します。

zend_framework_loader_helper.php (/system/application/helpers/zend_framework_loader_helper.php)

<? php

if (!defined( 'BASEPATH' ))exit( '直接スクリプトアクセス不可' );

//

ini_set( 'include_path' 、ini_get( 'include_path' ).PATH_SEPARATOR.BASEPATH。 'extensions /' );

require_once( 'Zend / Loader.php' );



Zend_Loader :: loadClass( 'Zend_Acl' );

Zend_Loader :: loadClass( 'Zend_Acl_Role' );

Zend_Loader :: loadClass( 'Zend_Acl_Resource' );

*このソースコードは、 ソースコードハイライターで強調表示されました。


およびzend_framework_acl_helper.php (/system/application/helpers/zend_framework_acl_helper.php)

<? php

関数init_roles(){

$ acl = new Zend_Acl();



//リソース/コントローラーを定義します

$ acl-> add( new Zend_Acl_Resource( 'login' ));

$ acl-> add( new Zend_Acl_Resource( 'welcome' ));

$ acl-> add( new Zend_Acl_Resource( 'logout' ));



//ロールを定義します

$ acl-> addRole( new Zend_Acl_Role( 'guest' ));

$ acl-> addRole( new Zend_Acl_Role( 'member' ));



//アクセスを定義します

$ acl-> allow( 'guest''login' );

$ acl-> deny( 'guest''welcome' );

$ acl-> deny( 'guest''logout' );



$ acl-> deny( 'member''login' );

$ acl-> allow( 'member''welcome' );

$ acl-> allow( 'member''logout' );



return acl;

}

*このソースコードは、 ソースコードハイライターで強調表示されました。


ここでは、3つのコントローラーで構成される小さなアプリケーションがあり、必要なことを意味します

2つのユーザーグループのみを作成する



次に、 autoload.php (/system/application/config/autoload.php)を開きます

ヘルパーを追加します

$ autoload [ 'helper' ] = array( 'zend_framework_loader''zend_framework_acl' );

*このソースコードは、 ソースコードハイライターで強調表示されました。


準備が完了しました。これですべての使用を開始する必要があります。

つまり、このすべての検証をコントローラーに実装します



コントローラーの機能を拡張するには、いくつかの方法があります。

1.コンストラクターに必要なアクションを記述します。

2. _remap()メソッドでも同じことを行います。

3.コントローラークラスを拡張し、そのコントローラーを継承します。



最初の2つの方法は、コントローラーに固有の機能を追加する必要がある場合に適していますが、この方法ですべてのコントローラーに同じことを書くと、コードが重複します。

したがって、3番目の方法を検討します。



ユーザー情報(彼のID、名前、グループメンバーシップなど)は、codeigniterの標準セッションメカニズムを使用して、セッション内のセッションに保存されると仮定します。



それでは始めましょう:



ファイルMy_Controller.php(/system/application/libraries/My_Controller.php)を作成します

<? php

class MY_Controller extends Controller {

private $ resource = null ;

private $ priviledge = null ;

//デフォルトのユーザー役割

private $ default_role = 'guest' ;

プライベート $ ci;

プライベート $ acl;

プライベート $言語;



パブリック関数MY_Controller(){

親::コントローラー();



//言語を定義します

$ lang = $ this-> uri-> segment(1);



if ($ lang == 'en' ){

$ this-> language = $ lang;

}

その他 {

$ this- > language = 'ru' ;

}



//目的の言語をロードします

スイッチ ($ lang):



ケース 「en」

$ this-> lang-> load( 'interface''english' );

$ this-> config-> set_item( 'language''english' );

休憩 ;



ケース 'ru'

$ this-> lang-> load( 'interface''russian' );

$ this-> config-> set_item( 'language''russian' );

休憩 ;



デフォルト

$ this-> lang-> load( 'interface''russian' );

$ this-> config-> set_item( 'language''russian' );

休憩 ;



エンドスイッチ;



// zend_framework_alc_helper.phpからinit_rolesを呼び出します

$ this-> acl = init_roles();



//ルーターを使用してコントローラーとメソッドを決定します

$ router =&load_class( 'Router' );



//コントローラをクラスに設定し、メソッドを特権に設定します

$ this-> resource = $ router-> fetch_class();

$ this-> priviledge = $ router-> fetch_method();

//便宜上、後でアプリケーションで初期化しないようにするため

$ this-> ci =&get_instance();



$ acl = $ this-> getACL();



//ユーザーが存在する場合、データを操作します

if ($ this- > session-> userdata'userInfo' )){

$ identity = $ this- > session-> userdata'userInfo' );

$ this- > setDefaultRole($ identity [ 'user_role' ]);

}



//ユーザーが認証されていない場合(ゲスト)が何かを要求しようとしている場合、認証ページにリダイレクトします

if (!$ acl-> isAllowed($ this-> getDefaultRole()、$ this-> getResource()、$ this-> getPriviledge())&& $ this-> getDefaultRole()== 'guest' ){

リダイレクト( 'login''refresh' );

}

//ユーザーが認証されていて、アクセスのない場所で何かを要求しようとした場合、認証ページにリダイレクトします

elseif(!$ acl-> isAllowed($ this-> getDefaultRole()、$ this-> getResource()、$ this-> getPriviledge())&& $ this-> getDefaultRole()!= 'guest' ){

リダイレクト( 'welcome''refresh' );

}

}



//セッターとゲッター



パブリック関数getInstance(){

return $ this-> ci;

}



パブリック関数getACL(){

return $ this-> acl;

}



パブリック関数getDefaultRole(){

return $ this-> default_role;

}



パブリック関数getPriviledge(){

return this-> priviledge;

}

パブリック関数getResource(){

$ this->リソースを返します。

}



パブリック関数setDefaultRole($ロール){

$ this-> default_role = $ role;

}



パブリック関数getLang(){

$ this-> language;

}

}

*このソースコードは、 ソースコードハイライターで強調表示されました。


それは実際、さらにすべてです。新しいコントローラーを作成するときは、単に置き換えます

クラス Welcomeコントローラーの拡張{



パブリック関数Welcome(){

親::コントローラー();

}

}

*このソースコードは、 ソースコードハイライターで強調表示されました。




クラス WelcomeはMY_Controllerを拡張します{



パブリック関数Welcome(){

親:: MY_Controller();

}

} *このソースコードは、 ソースコードハイライターで強調表示されています。


そしてあなたは働くことができます))



All Articles