手工构建laravel框架
构建过程分为项目初始化,路由组件添加,控制器模块添加,模型组件添加和视图组件添加。
项目初始化:
首先在服务器的web目录下创建一个lara文件夹,在根目录下创建一个 composer.json文件,内容如下:
除过上面的方法以外 还可以 用 composer 初始化,然后运行 composer update 执行成功以后 lara 文件夹下 会自动生成自动加载文件目录如下:
1 2 3 4 5 6 7 8 9 10 11
| lara | |--vendor | |--composer | |--autoload_classmap.php ... |--autoload.php |--composer.json
|
添加路由组件
完成项目初始化后,将进行第一个组件的添加, 首先登陆 composer 的包 网站 找到 route组件,其中可以看到组件名 illuminate/routing组件的详细信息, 这个组件中也有一个composer.json文件 文件中有所依赖的其他组件,包括 symfony/routing等组件,但是该组件还有一个 illuminate/events组件没有包含,需要在添加路由组件时一起添加,所以修改 composer.json 文件如下:
1 2 3 4 5 6
| { "require":{ "illuminate/routing":"*" "illuminate/events":"*" } }
|
修改后然后执行 compoer update 命令,然后就会看到在vendor 目录下多了该插件的目录,或者我们可以修改 composer.json文件,直接运行下面命令,也会完成组件的安装:
1 2
| composer require "illuminate/routing":"*" composer require "illuminate/events":"*"
|
在完成路由组件的添加后该如何使用呢? 首先需要添加两个文件,一个是路由文件,另外一个事服务器程序入口文件。按照laravel框架的架构, 我们在 lara目录下创建一个app目录, 该目录主要存储项目开发的文件, 在该目录下创建一个Http目录,该目录用户存储处理Http请求的文件,在http目录下在创建一个routes.php文件,该文件就是索要创建的路由文件,添加路由文件只要代码如下:
routes.php
1 2 3 4 5
| <?php $app['route']->get('/',function(){ return '<h1>路由成功</h1>' })
|
创建程序入口文件,按照laravel框架架构,public下面 有一个 index.php:
index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| <?php
require __DIR__.'/../vendor/autoload.php';
$app = new Illuminate\Container\Container; with(new Illuminate\Events\EventServiceProvider($app))->register(); with(new Illuminate\Routing\RoutingServiceProvider($app))->register();
require __DIR__ .'/../routes/routes.php';
$request = Illuminate\Http\Request::createFromGlobals(); $response = $app['router']->dispatch($request);
$response->send();
|
完成上述两个文件的添加后,通过访问网站根目录就可以得到相应的路由响应.在laravel 框架中一些功能 的生成都需要服务容器来实现,即, Illuminate\Container\Container 类的实例, 服务容器用于服务注册和解析,也就是说向服务容器注册能够实现某些功能的实例或回调函数,当需要使用这个功能从服务器中获取相应的实例来完成.
添加控制器模块
按照laravel 目录架构, 在Http目录下创建Controllers目录.为了实现文件自动加载,这里使用 psr-4 进行自动加载.修改composer.json文件如下:
1 2 3 4 5 6 7 8 9 10 11
| { "require": { "illuminate/routing": "*", "illuminate/events": "*" }, "authoload":{ "psr-4":{ "App\\":"app/" } } }
|
修改完composer.json后, 执行命令 composer dump-autoload 更新自动加载文件.
然后在Controllers 目录下 新建 indexController 控制器文件,内容如下:
1 2 3 4 5 6 7 8 9 10
| <?php
namespace App\Http\Controllers;
class IndexController { public function index() { return '<h1>控制器成功</h1>'; } }
|
然后在路由文件中 routes.php 中添加一条路由配置,内容如下:
1 2 3 4 5 6
| <?php $app['router']->get('/',function(){ return 123; });
$app['router']->get('welcom','App\Http\Controllers\IndexController@index');
|
然后通过访问这个路由就会得到响应。
添加模型组件
模型组件相当于MVC中的M 主要实现数据处理功能, laravel 框架中的 模型组件是 illuminate/database 来完成的。同理, 安装 组件 修改 composer.json文件运行 composer update 或者通过
1
| composer require "illuminate/database":"*"
|
来完成安装。
illuminate/database 组件主要用来操作数据库, 提供了两种数据库操作的方式:
这里使用Eloquent ORM 方式, 通过该方式操作数据库非常简单。按照 laravel框架的目录架构, 在lara 目录下创建config 文件夹, 该文件夹用于存放整个应用程序的配置文件,在该文件夹下创建 database.php 文件,用于存储对数据库的配置信息,内容如下:
1 2 3 4 5 6 7 8 9 10 11 12
| <?php
return [ 'driver'=>'mysql', 'host'=>'localhost', 'database'=>'test', 'username'=>'root', 'password'=>'root', 'charset'=>'utf8', 'collation'=>'utf8_general_ci', 'prefix'=>'' ];
|
在完成数据库配置后需要启动 Eloquent ORM 模块,这部分工作在入口文件(index.php)中实现的,具体内容是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| <?php
require __DIR__.'/../vendor/autoload.php';
$app = new Illuminate\Container\Container; with(new Illuminate\Events\EventServiceProvider($app))->register(); with(new Illuminate\Routing\RoutingServiceProvider($app))->register();
$manager = new Illuminate\Database\Capsule\Manager();
$manager->addConnection(require '../config/database.php'); $manager->bootEloquent();
require __DIR__ .'/../routes/routes.php';
$request = Illuminate\Http\Request::createFromGlobals(); $response = $app['router']->dispatch($request);
$response->send();
|
通过 addConnection() 函数完成数据库相关配置, 并通过 bootEloquent() 函数完成数据库 Eloquent ORM 模块的启动.在启动完成后,就可以操作数据库了。
Eloquent ORM 方式操作数据库需要两个步骤:
模型类创建
与laravel 框架目录一致, 在app目录下创建 Models目录 在里面创建一个模型类,代码如下:
1 2 3 4 5 6 7 8 9
| <?php
namespace App\Models; use Illuminate\Database\Eloquent\Model; class Menu extends Model { protected $table = "menus"; public $timestamps = false; }
|
模型创建完后, 操作数据库,查询数据, 修改 IndexController代码:
1 2 3 4 5 6 7 8 9 10 11 12 13
| <?php
namespace App\Http\Controllers; use App\Models\Menu; class IndexController { public function index() { $menu = Menu::first(); $data = $menu->getAttributes(); echo '<pre>'; var_dump($data); } }
|
在浏览器窗口访问,运行结果如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| array(10) { ["id"]=> int(1) ["name"]=> string(6) "系统" ["url"]=> string(11) "admin/menus" ["slug"]=> string(13) "system.manage" ["icon"]=> string(10) "fa fa-cogs" ["parent_id"]=> int(0) ["heightlight_url"]=> string(0) "" ["sort"]=> int(0) ["created_at"]=> string(19) "2017-08-15 13:07:48" ["updated_at"]=> string(19) "2017-08-15 13:07:48" }
|
至此, 模型组件添加完成。
添加视图组件
laravel 框架中的视图组件是 illuminate/view, 该组件可以将视图以模板的方式创建,在其他数控中可以调用,继承已经创建的模板。同理, 安装 组件 修改 composer.json文件运行 composer update 或者通过
1
| composer require "illuminate/view":"*"
|
来完成安装。
视图组件的使用更需要四步:
添加视图模板文件和编译文件的存储路径
对视图进行相关配置和服务注册
使用视图文件
创建视图模板文件
按照laravel 框架目录结构,新建 resources 目录,在resources目录中新建 views 目录用来存放模板文件, 模板编译文件放在 storage/framework/views/ 目录下.
接下来完成视图组件的相关配置和服务注册,同理,修改 入口文件 index.php,内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| <?php
require __DIR__.'/../vendor/autoload.php';
$app = new Illuminate\Container\Container;
Illuminate\Container\Container::setInstance($app); with(new Illuminate\Events\EventServiceProvider($app))->register(); with(new Illuminate\Routing\RoutingServiceProvider($app))->register();
$manager = new Illuminate\Database\Capsule\Manager();
$manager->addConnection(require '../config/database.php'); $manager->bootEloquent();
$app->instance('config',new Illuminate\Support\Fluent());
$app['config']['view.compiled'] = "D:\\phpStudy\\WWW\\test\\lara\\storage\\framework\\views"; $app['config']['view.paths'] = ["D:\\phpStudy\\WWW\\test\\lara\\resources\\views"]; with(new Illuminate\View\ViewServiceProvider($app))->register(); with(new Illuminate\Filesystem\FilesystemServiceProvider($app))->register();
require __DIR__ .'/../routes/routes.php';
$request = Illuminate\Http\Request::createFromGlobals(); $response = $app['router']->dispatch($request);
$response->send();
|
接下来使用一下模板, 在 resouecs/views 目录先新建一个 模板文件 index.balde.php, 然后去修改 IndexController 控制器,加载这个模板:
IndexController.php 代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <?php
namespace App\Http\Controllers; use App\Models\Menu; class IndexController { public function index() { $menu = Menu::first(); $data = $menu->getAttributes(); $app = \Illuminate\Container\Container::getInstance(); $factory = $app->make('view'); return $factory->make('index')->with('data',$data); } }
|
首先通过 getInstance() 静态方法获取服务容器实例, 然后通过容器获取服务名称 为 view 的实例对象即 为视图创建工厂类(Illuminate\View\Factory)实例, 接着通过视图创建工厂的make()方法来创建视图实例对象,其中参数维视图文件名称,最后通过视图实例的with() 方法添加数据。
index.blade.php 代码如下:
1 2 3
| <h1>这个是查询的数据</h1> <pre> {{ print_r($data) }}
|
至此, 通过几个简单的步骤 Laravel 框架的骨骼就出来了, 具体代码:
代码地址