[laravel]要点
1. routing
2. Ioc
3. Facade
4. Artisan
1.routing
参考:http://laravel.com/docs/4.2/routing
了解routing之前先了解下laravel的处理过程request lifecycle
发送给应用程序的所有请求都经由 public/index.php
脚本处理。如果使用的是 Apache 服务器,Laravel中包含的 .htaccess
文件将对所有请求进行处理并传递给 index.php
。这是Laravel从接受客户端请求到返回响应给客户端的整个过程的开始。若能对于Laravel的引导过程(bootstrap process)有一个大致的认识,将有助于理解框架,我们不妨先讨论这个。
到目前为止,学习Laravel引导过程所需掌握的最重要的概念就是 服务提供器。打开app/config/app.php
配置文件,找到 providers
数组,你会发现一个服务提供器的列表。这些提供器充当了Laravel的主要引导机制。在我们深入服务提供器之前,先回到 index.php
的讨论。当一个请求进入 index.php
文件,bootstrap/start.php
文件会被加载。这个文件会创建一个 Laravel Application
对象,该对象同时作为框架的 IoC 容器。
Application
对象创建完成后,框架会设置一些路径信息并运行 环境检测 。然后会执行位于Laravel源码内部的引导脚本,并根据你的配置文件设置时区、错误报告等其他信息。除了配置这些琐碎的配置选项以外,该脚本还会做一件非常重要的事情:注册所有为应用程序配置的服务提供器。
在注册完所有服务提供器后,app/start
下的文件会被加载。最后,app/routes.php
文件会被加载。一旦 routes.php
文件被加载,Request 对象就被发送给应用程序对象,继而被派发到某个路由上。
我们总结一下:
- 请求进入
public/index.php
文件。 bootstrap/start.php
文件创建应用程序对象并检测环境。- 内部的
framework/start.php
文件配置相关设置并加载服务提供器。 - 加载应用程序
app/start
目录下的文件。 - 加载应用程序的
app/routes.php
文件。 - 将 Request 对象发送给应用程序对象,应用程序对象返回一个 Response 对象。
- 将 Response 对象发回客户端。
2.Ioc
参考:http://eddmann.com/posts/how-static-facades-and-ioc-are-used-in-laravel/
http://www.golaravel.com/laravel/docs/4.2/ioc/
在应用程序中我们要使用多种组件在很多地方,如果每次使用都去实例化创建无疑很浪费资源。那我们选择以一种全局注册的方式来获取实例而不是使用一次创建一次节省了很大的开销,那么要使用这些组件去实例化类:
以下参考http://www.yuansir-web.com/2014/03/20/理解php-依赖注入laravel-ioc容器/
$connection = new Connection(); $session = new Session(); //Pass them as constructor parameters $some = new SomeComponent($connection, $session); // ... or using setters $some->setConnection($connection); $some->setSession($session);
我们不得不在应用程序的许多地方创建这个对象。如果你不需要依赖的组件后,我们又要去代码注入部分移除构造函数中的参数或者是setter方法
class SomeComponent { protected $_di; public function __construct($di) { $this->_di = $di; } public function someDbTask() { // Get the connection service // Always returns a new connection $connection = $this->_di->get('db'); } public function someOtherDbTask() { // Get a shared connection service, // this will return the same connection everytime $connection = $this->_di->getShared('db'); $filter = $this->_db->get('session'); } } $di = new Phalcon\DI(); //Register a "db" service in the container $di->set('db', function(){ return new Connection(array( "host" => "localhost", "username" => "root", "password" => "secret", "dbname" => "invo" )); });//Register a "session" service in the container $di->set('session', function(){ return new Session(); }); //Pass the service container as unique parameter $some = new SomeComponent($di); $some->someTask();
现在,该组件只有访问某种service的时候才需要它,如果它不需要,它甚至不初始化,以节约资源。该组件是高度解耦。他们的行为,或者说他们的任何其他方面都不会影响到组件本身
------引用分割------
Laravel中使用App做为容器,将组件绑定到容器中有
bind 当执行 App::make
方法,闭包函数被执行并返回结果。
singleton 将绑定到容器的类型处理一次,然后接下来从容器中取得的都应该是相同实例,将被缓存,调用时候调用共享内存
instance 将一个已经存在的对象接口绑定到容器中
参看container源码:
3.Facades
Facade(外观模式)提供了一个"static"(静态)接口去访问注册到IoC 容器中的类
class Cache extends Facade { /** * Get the registered name of the component. * * @return string */ protected static function getFacadeAccessor() { return 'cache'; } }
Cache
类继承Facade
这个基类,并且定义了个getFacadeAccessor()
方法。注意,该方法的工作是返回绑定到IoC
的名字。
当用户引用任何在Cache
facade 中的静态方法, Laravel 从 IoC 容器绑定中取得 cache
,并且执行请求的对象方法(在该例子中为get
)
4.Artisan