这个依赖注入有个管理的东西,假设是InjectionManager
然后框架,比如说是Framework
现在Framework 想要 实例化一个controller
它就问InjectionManager要这个Controller的实例
https://segmentfault.com/a/1190000002411255
如何理解依赖注入和控制反转
1--控制器等价于Drupal 7中hook_menu()内的页面回调函数:page callback
命名:class moduleNameController
位置:控制器被要求放在src/Controller目录下
其他类也许放到src下面的其他文件夹目录下
2--一个路由是从一个URL路径到一个控制器的映射:路由就是一个映射
3--
文件名的秘密
page_example.info.yml
page_example.routing.yml
PageExampleController.php
page_example.links.menu.yml
模块名-功能名-格式(php|yml)
其中功能名可以细分:type+name的方式
type是需要的新属性,可以设置为module或theme
获得一个路径:
$simple_url = Url::fromRoute(‘page_example_simple‘);
$simple_link = \Drupal::l(t(‘simple page‘), $simple_url);
名字空间只会影响以下代码类型:
-- 类(包括abstracts traits 类),接口,函数和常量
use Drupal\page_example\Controller
之后你就可以使用Controller目录下的文件了。
hook_menu() 系统被分解为
modulename.routing.yml
和modulename.links.menu.yml
等文件。
插件(plugins)也是实体(entities)
区块很好地被封装在一个独立文件内
区块内容只在一个文件内
创建src/Plugin/Block目录
@Block(
* id = "example_empty",
* admin_label = @Translation("Example: empty block")
* )
配置表单允许你使用用户界面设置显示在区块内的
Drupal 8 内每片代码都尽可能的自包含。意味着大多数函数不再暴露在全局范围
内而是被封装在类里。因此不推荐像Drupal 7 那样直接使用l()或t()这样的函数。
Traits 本质上就是我们Drupal 7 使用的include,它提供能够被包含在任何类中
的额外方法。TRAITS就是一个类,一个小好似机动性比较强的类,可以无限制的被
其他类use也就是include
通过在BlockBase中包含StringTranslationTrait,我们可以使用它的任何方
法,就如同这些方法在BlockBase中一样。$this->t()定义在StringTranslationTrait
内。BlockBase 继承了ContextAwarePluginBase,ContextAwarePluginBase
使用了StringTranslationTrait。所以$this->t()被引入到了BlockBase
内。
如果你熟悉 drupal_get_form(),可能会想怎样像 Drupal 7
那样加载一个表单呢?
Drupal 8 中使用全局类,你会用到 formBuilder() 方法:
$form = \Drupal::formBuilder()->getForm(‘Drupal\demo\Form\DemoForm‘);
这个 $form 返回的是可渲染的数组。
Drupal 8 把 Drupal 7 中的配置信息和函数收集起来用一个独立的系统管理。
Configuration Manager
Hide Allows administrators to manage configuration changes.
Machine name: config
模块开发者可以提交
{module}/config/install目录内的YAML
文件,定义配置设定的构成,使用版本控制软件跨多个环境进行发布。
FormBase
ConfigFormBase
FormInterface
Drupal 8 中使用配置API 可以把例如变量或模块提供的配置信息存储在
YAML 文件内。当模块被激活时,YAML 内的信息会立刻被导入数据库,
导入的目的是为了改善性能。一旦数据库被改变你可以很容易的导出为
YAML 文件,重新部署。
当为模块提供配置时,可以通过一个特定的YAML 文件为配置设定默认值
YAML 文件放置在config/install目录内).
模块只有被安装时才会被导入到数据库,所以如果模块已经被安装了你必须卸载重新安装。