Laravel核心概念学习

一、Laravel请求过程

《Laravel核心概念学习》

二、artisan命令

下面会以生成用户表为例(注意表名一般为复数):

1、生成迁移文件

Pro-3:mac$ php artisan make:migration create_users_table
Migration: 2016_11_23_131412_create_users_table

2.然后在database/migrations生成的迁移文件中,添加相关的字段:

2016_11_23_131412_create_users_table.php
<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
           $table->integer('id')->unique()->unsigned(); // 学号唯一,取正数
            $table->string('name');
            $table->string('password');
            $table->string('phone')->default('');
            $table->string('sex')->default('');
            $table->string('email')->default('');
            $table->string('pro_class')->default('');
            $table->boolean('is_admin')->default(0);
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('users');
    }
}

最后,执行 php artisan migrate命令,在数据库中生成表users

MacdeMacBook-Pro-3:laravel mac$ php artisan migrate

以上可以在数据库中生成一张带有字段的Users表,这比我们直接在数据库中新建表并写相关的字段优雅的多。

3.接下来我们给这张表填充一些测试的数据:用命令生成填充表UserTableSeeder

Mac:laravel$ php artisan make:seeder UsersInfoTableSeeder
Seeder created successfully.

如下所示,我们将修改 Laravel 预先生成好的 UserTableSeeder 类来给 run 方法添加一段可在数据库添加数据的语法:

<?php

use Illuminate\Database\Seeder;
use App\Users;
use App\Grade;

class UsersTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        DB::table('users')->delete();

        Users::create([
            'id' => 2010300001,
            'name' => '周润发',
            'password' => Hash::make('2010300001'),
        ]);
        Users::create([
            'id' => 2010300002,
            'name' => '周星驰',
            'password' => Hash::make('2010300002'),
        ]);
        Users::create([
            'id' => 2010300003,
            'name' => '成龙',
            'password' => Hash::make('2010300003'),
        ]);
        Users::create([
            'id' => 2010300004,
            'name' => '张曼玉',
            'password' => Hash::make('2010300004'),
        ]);
    }
}

在 DatabaseSeeder 类中,你可以使用 call 方法来运行其它的 seed 类。为避免发生单个 seeder 类变得太大的情况,可使用 call方法来将数据填充拆分成多个文件。只需简单传递你想要运行的 seeder 类名称即可:

<?php

use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;

class DatabaseSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        Model::unguard();

        // 执行插入用户详细数据
         $this->call(UsersTableSeeder::class);

        Model::reguard();
    }
}

运行数据填充:

MacdeMacBook-Pro-3:laravel mac$ composer dump-autoload
Generating autoload files
MacdeMacBook-Pro-3:laravel mac$ php artisan db:seed
Seeded: UsersTableSeeder

查看users表,数据填充OK:

《Laravel核心概念学习》

PHP artisan 命令整合:

①、创建迁移文件,填写字段,创建表

php artisan make:migration create_users_table

// 生成表
php artisan migrate

// 填充数据
php artisan make:seeder UsersTableSeeder

// 运行数据填充
composer dump-autoload
php artisan db:seed

②、创建控制器:

php artisan make:controller Admin/AdminController

③、创建中间件

php artisan make:middleware isAdmin

③、创建模型类等命令

// 创建一个新的 Eloquent 模型类
php artisan make:model name

// 创建一个新的资源控制器
 // --plain      生成一个空白的控制器类
php artisan make:controller [--plain] name
php artisan make:controller App\\Admin\\Http\\Controllers\\DashboardController
// 创建一个新的事件类
php artisan make:event name
// 创建一个新的中间件类
php artisan make:middleware name
// 创建一个新的迁移文件
 // --create     将被创建的数据表.
 // --table      将被迁移的数据表.
php artisan make:migration [--create[="..."]] [--table[="..."]] name

// 创建一个新的服务提供者类
php artisan make:provider name
// 创建一个新的表单请求类
php artisan make:request name

三、使用Bower+Gulp集成前端资源

我们将讨论如何将前端资源集成到项目中,包括前端资源的发布和引入。本项目将使用 Bower 和 Gulp 下载和集成 jQuery、Bootstrap、Font Awesome 以及 DataTables。

现在的 web 站点包含很多东西:框架、库、前端资源,等等。如果每个组件都必须从头到尾自己写,不管是从时间、效率、质量上来说,都是不明智的。

所以,不要重复造轮子。

下面我们将会使用 Bower 来获取和安装前端资源包。

安装node.js,需要使用npm包管理工具安装Bower
具体请参考该文章 前端资源整合

四、服务容器Container之依赖注入

服务容器就是一个普通的容器,用来装类的实例,然后在需要的时候再取出来。用更专业的术语来说是服务容器实现了控制反转(Inversion of Control,缩写为IoC),意思是正常情况下类A需要一个类B的时候,我们需要自己去new类B,意味着我们必须知道类B的更多细节,比如构造函数,随着项目的复杂性增大,这种依赖是毁灭性的。控制反转的意思就是,将类A主动获取类B的过程颠倒过来变成被动,类A只需要声明它需要什么,然后由容器提供。

这样做的好处是,类A不依赖于类B的实现,这样在一定程度上解决了耦合问题。

在Laravel的服务容器中,为了实现控制反转,可以有以下两种:

  • 依赖注入(Dependency Injection)。

  • 绑定。

class UserController extends Controller
{
    /**
     * The user repository implementation.
     *
     * @var UserRepository
     */
    protected $users;

    /**
     * Create a new controller instance.
     *
     * @param  UserRepository  $users
     * @return void
     */
    public function __construct(UserRepository $users)
    {
        $this->users = $users;
    }

    /**
     * Show the profile for the given user.
     *
     * @param  int  $id
     * @return Response
     */
    public function show($id)
    {
        $user = $this->users->find($id);

        return view('user.profile', ['user' => $user]);
    }
}

小结:
依赖注入,就是只声明需要实例化的类型,而真正的实例化是在这个Container容器中进行,容器就是用来装需要实例化的对象,旧的做法是需要引入某个类,然后再实例化处理,而注入只需传递对象类型名字即可,剩下的会在容器中实例化。

五、Contracts & Facades(合同&假象)

Laravel 还有一个强大之处是,比如你只需在配置文件中指明你需要的缓存驱动(redis,memcached,file……),Laravel 就自动办你切换到这种驱动,而不需要你针对某种驱动更改逻辑和代码。Why? 很简单,Laravel定义了一系列Contracts(翻译:合同),本质上是一系列PHP接口,一系列的标准,用来解耦具体需求对实现的依赖关系。其实真正强大的公司是制定标准的公司,程序也是如此,好的标准(接口)尤为重要。当程序变得越来大,这种通过合同或者接口来解耦所带来的可扩展性和可维护性是无可比拟的。

Contracts:提供一系列的标准,在两方都需要遵守该协议,如之前是A直接到B,A-B ,增加协议后,A-C-B处理,B只需遵循C即可,不管A是如何变,这样可以实现解耦关系,不需要更改B的具体逻辑代码,这种思路非常好。

Facades:
在我们学习了容器的概念后,Facades就变得十分简单了。在我们把类的实例绑定到容器的时候相当于给类起了个别名,然后覆盖Facade的静态方法getFacadeAccessor并返回你的别名,然后你就可以使用你自己的Facade的静态方法来调用你绑定类的动态方法了。其实Facade类利用了__callStatic() 这个魔术方法来延迟调用容器中的对象的方法,这里不过多讲解,你只需要知道Facade实现了将对它调用的静态方法映射到绑定类的动态方法上,这样你就可以使用简单类名调用而不需要记住长长的类名。这也是Facades的中文翻译为假象的原因。

public function register()
{
        $this->app->bind('XblogCache', function ($app) {
            if (config('cache.enable') == 'true') {
                return new Cacheable();
            } else {
                return new NoCache();
            }
        });
}

即以后可以用XblogCache的别名来调用实例化后的的new Cacheable();或new NoCache();方法了,即
XblogCache->getCache();

六、总结

Laravel强大之处不仅仅在于它给你提供了一系列脚手架,比如超级好用的ORM,基于Carbon的时间处理,以及文件存储等等功能。但是Laravel的核心非常非常简单:利用容器和抽象解耦,实现高扩展性。容器和抽象是所有大型框架必须解决的问题,像Java的Spring,Android的Dagger2等等都是围绕这几个问题的。所以本质上讲,Laravel之所以强大出名,是因为它的设计,思想,可扩展性。而Laravel的好用功能只是官方基于这些核心提供的脚手架,你同样也可以很轻松的添加自己的脚手架。

所以不要觉得Laravel强大是因为他提供的很多功能,而是它的设计模式和思想。

  • 理解Laravel生命周期和请求的生命周期概念。

  • 的静态变量和单例,在下一个请求到来时都会重新初始化。

  • 将耗时的类或者频繁使用的类用singleton绑定。

  • 将变化选项的抽象为Contracts,依赖接口不依赖具体实现。

  • 善于利用Laravel提供的容器。

原文链接:
Laravel的核心概念
深入理解php底层:php生命周期

    原文作者:Corwien
    原文地址: https://segmentfault.com/a/1190000007431253
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞