mgrechanik/yii2-universal-module-sceleton 问题修复 & 功能扩展

解决BUG、新增功能、兼容多环境部署,快速响应你的开发需求

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

mgrechanik/yii2-universal-module-sceleton

Composer 安装命令:

composer require mgrechanik/yii2-universal-module-sceleton

包简介

The structure of universal Yii2 module who fits both to advanced and basic templates

README 文档

README

Русская версия

Table of contents

Goal

This extension gives the structure of the module which:

  1. will be self-sufficient and portable because it holds all his functionality in one place

  2. logically divided at backend and frontend parts

  3. easily connects both to Advanced and Basic application templates

  4. with Basic application template:

    • connects to module section only one time
    • there is functionality of protection to all backend controllers (for admin part of your web site)
  5. it is easy to inherit such modules from one another to override functionality without controllers duplication

Installing

The preferred way to install this extension is through composer.:

Either run

composer require --prefer-dist mgrechanik/yii2-universal-module-sceleton

or add

"mgrechanik/yii2-universal-module-sceleton" : "~1.0.0"

to the require section of your composer.json

What it is about

  • By default module controllers are being searched automatically in it's $controllerNamespace
  • We do not use this functionality but define all our controllers in module's $controllerMap
  • But we do this not by $controllerMap property explicitly but define backend and frontend controllers separately
  • Module has the mode which is set in config; according to this mode Controller Map will have only those controllers who fit the mode:
    • With frontend application of Advanced template we connect our module in 'frontend' mode
    • With backend application of Advanced template we connect our module in 'backend' mode
    • With Basic template we can connect our module in two modes described above and also in 'backend and frontend' mode when both controller types are accessible
  • When module get the request it creates the controller from their map, figuring by it's namespace
    whether it is backend or frontend controller to perform additional set up
  • Module expects the next directory structure:
Module_directory/
   ui/                                  // User Interface of the module
      controllers/
          backend/                      // Backend controllers like the next:
            AdminDefaultController.php  
            ...
          frontend/                     // Frontend controllers like the next: 
            DefaultController.php       
            ...
      views/                            // Views for corresponding controllers 
          backend/
            admin-default/
          frontend/        
            default/
   Module.php                           // module class

Using

  1. Generate, or create manually, your module class

  2. Inherit your module class from universal module class

use mgrechanik\yiiuniversalmodule\UniversalModule;

class YourModule extends UniversalModule
{
  1. Now create (or generate) frontend controller
  • Take into consideration that it's namespace should be yourModuleNamespace\ui\controllers\frontend
  • Create all subdirs needed
  • According to controller it's views will reside in @yourModuleNamespace/ui/views/frontend/YourControllerName/
  • We need to define this controller in frontend controller map of this module:
class YourModule extends UniversalModule
{
    public $frontendControllers = [
        'default',
    ];

, where 'default' match yourModuleNamespace\ui\controllers\frontend\DefaultController.
When the name and class of controller do not match use next definition form: 'default2' => 'SomeDefaultController'.

Always when you create new controller do not forget to define it in appropriate controller map of your module.

You are not required to inherit your controller classes from any parent type.

  1. Now create (or generate) backend controller
  • Logic is the same with 3), but it's namespace should be yourModuleNamespace\ui\controllers\backend
  • Define it in module at:
class YourModule extends UniversalModule
{
    public $backendControllers = [
        'admin-default',
    ];
  • It is handy to prefix backend controller names with Admin, so all backend urls could be set up the way all of them will start with admin/
  1. Done, your module is ready, you can connect it to application:

config/main.php:

    // ...
    'modules' => [
        'yourModule' => [
            'class' => 'yourModuleNamespace\YourModule',
            'mode' => 'frontend',
        ],

, do not forget to define - mode

It is comfortable to connect all such modules at first level of application modules, without nested modules but like a simple list of modules we used to see at admin pages of popular CMSs, which also gives short urls.

Module inheritance

When you inherit your module class from existing one without overriding $frontendControllers and $backendControllers the next happens:

  1. These two properties will be taken from parent naturally
  2. But the basic controller namespace will be set to your module namespace. You do not have such controllers and you do not want to create their copies
  3. There are next opportunities how to make your module to use controllers from any of his ancestors:
    • If controllers reside with immediate parent of your module set it the next property $takeControllersFromParentModule = true
    • If controllers are in some other module, say 'Omega', then set the property of your module $baseControllerNamespace to namespace of 'Omega' module
    • Views will be searched by default according to settings above

Module settings

Connecting module to application we can use next it's properties:

$mode - mode in which this module works

You are required to set up it. Details

$backendLayout - layout for backend controllers

Sets up layout to module when backend controller is requested.
It is useful for Basic application template.

$frontendControllers - frontend controller map

Details

$backendControllers - backend controller map

Details

$controllerMapAdjustCallback - callback for final adjustment of controller map

After module's controller map is generated you can adjust it with this function which signature is: function($map) { ...; return $map; }

$backendControllerConfig - backend controllers settings

When module creates backend controller it could set up controller with these properties.

It is handy, for example, to restrict access to such controllers using yii filters connected like behaviors.

Example of using.

$frontendControllerConfig - frontend controllers settings

It is the same like $backendControllerConfig

$baseControllerNamespace - the basic namespace for the controllers the module uses

By default it is not used and controllers will be searched relevant to your current module namespace.
But with this property you can tell to take controllers from any other module

$takeControllersFromParentModule - whether to take controllers from parent

It is false by default, meaning no taking.
But with this property you can tell to take controllers from immediate parent of current module

$baseViewsPath - basic path where to find module's views

By default it is not used.
It is automatically set up whether to current module directory or relevant to the two properties above when they are set.
But with this property you can finally say where to search for views. Example of value: '@mgrechanik/yii2catalog'

Example of module's set up with Basic application template

Lets suppose that we have two modules we are talking about - example and omega.
Here is working configs to set up these modules:

config/params.php:

return [
    'backendLayout' => '//lte/main',
    'backendControllerConfig' => [
        'as backendaccess' => [
            'class' => \yii\filters\AccessControl::class,
            'rules' => [
                [
                    'allow' => true,
                    'ips' => ['54.54.22.44'],
                    'matchCallback' => function ($rule, $action){
                        $user = \Yii::$app->user;
                        return !$user->isGuest &&
                            ($user->id == 1);
                },
                ]
            ],
        ],
    ],	
  
];

At this config we gave permission to "admin pages" only to one user (id==1), with additional check for ip.

config/web.php:

    'components' => [
	//...
        'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => [
                'admin/<module:(example|omega)>-<controllersuffix>/<action:\w*>' =>
                    '<module>/admin-<controllersuffix>/<action>',
                'admin/<module:(example|omega)>-<controllersuffix>' =>
                    '<module>/admin-<controllersuffix>',
            ],
        ],	
    ],
    'modules' => [
        'example' => [
            'class' => 'modules\example\Module',
            'mode' => 'backend and frontend',
            'backendLayout' => $params['backendLayout'],
            'backendControllerConfig' => $params['backendControllerConfig'],
        ],
        'omega' => [
            'class' => 'modules\username1\omega\Module',
            'mode' => 'backend and frontend',
            'backendLayout' => $params['backendLayout'],
            'backendControllerConfig' => $params['backendControllerConfig'],
        ],        
    ], 

How-to

Make all admin urls start with /admin

Lets see Basic application template with two "our" modules connected to it:

    'modules' => [
        'example' => [
            ...
        ],
        'omega' => [
            ...
        ],  

If we followed advice above about naming of backend controllers all of them have names like Admin...Controller.
So urls to them will be example/admin-default and omega/admin-default.
And we want all our admin urls to start with admin/.

It is easily achived with the next two Url Rules for your urlManager:

	'urlManager' => [
		'enablePrettyUrl' => true,
		'showScriptName' => false,
		'rules' => [
			'admin/<module:(example|omega)>-<controllersuffix>/<action:\w*>' =>
				'<module>/admin-<controllersuffix>/<action>',
			'admin/<module:(example|omega)>-<controllersuffix>' =>
				'<module>/admin-<controllersuffix>',
		],
	],

Generating backend functionality with Gii CRUD generator

You can easily generate CRUD functionality considering that:

How to connect the module to console application?

If our module has console commands who reside for example here:

Module_directory/
  console/
    commands/                // Directory for console commands
      HelloController.php
  Module.php

, then in the console application config this module is connected like:

    'modules' => [
        'example' => [
            'class' => 'modules\example\Module',
            'controllerNamespace' => 'yourModuleNamespace\console\commands',
        ],
    ],

Where to put all other module's functionality?

This module regulates only directory structure described above where only from controllers and views their concrete positions are expected.
When writing the rest of functionality you may follow the next advices:

  • If a component is definitely related only to one part of application - backend or frontend then put it in the corresponding subdirectory
  • If there is no such definite separation put it in the root of his directory

For example for models:

  models/
    backend/
      SomeBackendModel.php
    frontend/
      SomeFrontendModel.php	  
    SomeCommonModel.php  
  • Since for all user interface of our module we have already created ui/ subdirectory then put forms and widgets there

mgrechanik/yii2-universal-module-sceleton 适用场景与选型建议

mgrechanik/yii2-universal-module-sceleton 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 11.01k 次下载、GitHub Stars 达 3, 最近一次更新时间为 2019 年 12 月 09 日, 在 PHP 生态内属于活跃度较高的组件。

它主要适用于以下技术方向: 「module」 「basic」 「structure」 「advanced」 「yii2」 「yii 2」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。

我们在过去多个企业项目中使用过 mgrechanik/yii2-universal-module-sceleton 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 mgrechanik/yii2-universal-module-sceleton 我们能提供哪些服务?
定制开发 / 二次开发

基于 mgrechanik/yii2-universal-module-sceleton 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 11.01k
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 3
  • 点击次数: 5
  • 依赖项目数: 1
  • 推荐数: 0

GitHub 信息

  • Stars: 3
  • Watchers: 2
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: BSD-3-Clause
  • 更新时间: 2019-12-09