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();
}
} *このソースコードは、 ソースコードハイライターで強調表示されています。

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

Source: https://habr.com/ru/post/J30521/


All Articles