Laravel

更新日期: 2019-09-20 阅读次数: 14918 字数: 1873 分类: Laravel

Laravel Snippets for VIM

边学,边实践,边整理的 snippets

sunzhongwei/vim-laravel-snippets

Tips: 在 VIM 打开 blade 模板文件时,自动将 filetype 设置为 html 的方法: 在 .vimrc 中加入下面这行配置

autocmd BufRead,BufNewFile *.blade.php set filetype=html

安装 Laravel

参考 Installation

说明:

安装 Laravel 首先要安装包管理器 composer, 然后通过 composer 安装 Laravel. 类似通过 python 的包管理器 pip 安装 Django 一样。

安装 composer 的方法,Download Composer. 安装 composer.phar 之后,需要将其置于 $PATH 路径下。

最简单的做法是

sudo apt install composer

由于 composer 官方源被墙,所以需要修改源为国内的镜像。 目前使用 laravel 阿里云的国内镜像

初始化 Laravel 项目

例如,要初始化一个 blog 项目,有两种方式

一、通过 laravel

laravel new blog

二、通过 composer

composer create-project --prefer-dist laravel/laravel blog "5.2.*"

目前 laravel 最新版本已经是 5.3, 如果需要安装旧版本的 5.2, 就需要指定版本号。否则会默认安装最新的 release 版本 5.3.

官网说,通过 laravel 的方式,相对 composer 要快一些,因为 laravel 是通过将本地依赖复制到项目目录的方式实现的。

需要等待一千年才能初始化完项目。

实际上,通过 composer 连接国内镜像的方式要快得多。

哪些代码需要添加到代码仓库进行管理

这也是 Laravel 比 Django 细心的地方,初始化的时候已经自动生成了 gitignore 配置。

$ ls -la
total 304
drwxr-xr-x  23 zhongwei  staff     782 May 15 17:51 .
drwxr-xr-x  94 zhongwei  staff    3196 May 15 17:31 ..
-rw-r--r--   1 zhongwei  staff     458 May 15 17:41 .env
-rw-r--r--   1 zhongwei  staff     423 May 15 17:31 .env.example
-rw-r--r--   1 zhongwei  staff      61 May 15 17:31 .gitattributes
-rw-r--r--   1 zhongwei  staff      73 May 15 17:31 .gitignore
...

$ cat .gitignore 
/vendor
/node_modules
/public/storage
Homestead.yaml
Homestead.json
.env

node_modules 是 node 的依赖包安装目录。

vendor 目录是做什么的呢? (中文:供应商、卖主、自动售货机)

$ ls vendor/
autoload.php   composer       fzaninotto     jeremeamia     mockery        nesbot         phpdocumentor  psr            swiftmailer
bin            dnoegel        hamcrest       laravel        monolog        nikic          phpspec        psy            symfony
classpreloader doctrine       jakub-onderka  league         mtdowling      paragonie      phpunit        sebastian      vlucas

可见是 Laravel 的依赖包安装目录。

vendor是第三方库和插件放置的文件夹,一般来源于composer的安装

生产环境部署

git clone 出代码之后,到项目目录下,执行

composer install
php artisan migrate

复制一份 .env 文件,配置数据参数

参考 How to Install Laravel with an Nginx Web Server on Ubuntu 14.04

如果权限需要设置,执行

sudo chown www-data:adm -R storage/
sudo chown www-data:adm -R bootstrap/
"chmod -R o+w" the storage and bootstrap/cache directories

启动服务

 php artisan serve

数据库操作

建立一个 model, 例如,新建一个招聘类网站的 job model

php artisan make:model Job

然后 app 目录下,就会看到自动生成了一个 Job.php 的文件。

如何配置数据库参数呢?例如,我想选择 MySQL 而不是 SQLite 时呢? 参考 Database: Getting Started 可知

配置置于 config/database.php 下, 从代码里可以看出,数据库参数是从环境变量里读取的。而不是在代码中配置的,具体配置在文件 .env 中,而这个文件是默认排除在 git 仓库之外的。 确实被震撼到了,这点 Laravel 比 Django 先进,至少在规范性上,以及对新手的教育上,这点都是其他框架不能比拟的。

在 .env 文件中配置了数据库信息之后,进行初始化数据库操作

php artisan migrate

如何定义一个 model 呢? 参考 Eloquent: Getting Started

默认每个表会加上 created_at, updated_at 这两个字段,如果不想添加,设置

public $timestamps = false;

但是,Laravel 的 Eloquent ORM 与 Django ORM 最大的区别是,Laravel 不是通过 model 属性来定义表结构的,而是手动写 migration 文件 (抓狂), 例如,要创建 jobs 表

php artisan make:migration create_jobs_table --create=jobs

然后在 database/migrations 目录下找到对应的文件, 添加字段。问题来了,如何修改表结构呢?

从 Django 转到 Laravel 的开发人员都有同意的疑问,感觉 Laravel 不能自动生成 migration 文件太落后了

但是,换个角度想,如果表已经存在,Eloquent ORM 这套东西就可以绕过 migration 直接操作数据库,还是很实用的。 只能说,有利有弊。

但从实战上讲,留下 migration 文件还是非常有必要的,原因是我经常需要在几台开发机上进行开发。 如果 migration 不同步,就会出现每个开发机的数据表结构不一致的问题。要手动去改太麻烦了。 当然,把 sql alter 脚本留下也可以,但是不容易形成规范。

如果想新增一个字段,具体的操作方法 Add new column migrate to database

Routing

route 由指定 controller 处理的方法

模板

位于 resources/views 下

 $ tree resources/
resources/
├── assets
│   └── sass
│       └── app.scss
├── lang
│   └── en
│       ├── auth.php
│       ├── pagination.php
│       ├── passwords.php
│       └── validation.php
└── views
    ├── errors
    │   └── 503.blade.php
    ├── vendor
    └── welcome.blade.php

类似 Django Admin 的 admin 管理后台

总体来说,Laravel Panel 的配置还是比 Django Admin 稍显复杂。但是已经超出了我的预期, 嘿嘿。

Restful 登录

首先得明白 Laravel 的 authentication (身份验证) 机制, 核心概念包括两个

  • guard 警卫
    • session guard 使用 session/cookie 来维护登录状态
    • token guard 使用 API token 来验证用户是否登录
  • provider 提供者. 定义了用户信息从哪里获取,例如 Eloquent 或 database query builder

Laravel 默认生成了一个 app/User 的 Eloquent Model。 同时,还自动生成了两个 controller

  • Auth/AuthController 用于登录和注册
  • Auth/PasswordController 用于重置密码

更变态的是 Laravel 还有一键生成 login/register 页面的功能

php artisan make:auth
Created View: /home/zhongwei/work/hhhhhhhhhhhh/resources/views/auth/login.blade.php
Created View: /home/zhongwei/work/hhhhhhhhhhhh/resources/views/auth/register.blade.php
Created View: /home/zhongwei/work/hhhhhhhhhhhh/resources/views/auth/passwords/email.blade.php
Created View: /home/zhongwei/work/hhhhhhhhhhhh/resources/views/auth/passwords/reset.blade.php
Created View: /home/zhongwei/work/hhhhhhhhhhhh/resources/views/auth/emails/password.blade.php
Created View: /home/zhongwei/work/hhhhhhhhhhhh/resources/views/layouts/app.blade.php
Created View: /home/zhongwei/work/hhhhhhhhhhhh/resources/views/home.blade.php
Created View: /home/zhongwei/work/hhhhhhhhhhhh/resources/views/welcome.blade.php
Installed HomeController.
Updated Routes File.
Authentication scaffolding generated successfully!

如果是个人站,完全可以接受这套 bootstrap 风格的 login/register 界面。省时省力。

实际上,我们要通过 ajax 的方式实现 login 也很简单, 参考 Laravel Login with AJAX

public function postLogin(Request $request)
{
    $auth = false;
    $credentials = $request->only('email', 'password');

    if (Auth::attempt($credentials, $request->has('remember'))) {
        $auth = true; // Success
    }

    if ($request->ajax()) {
        return response()->json([
            'auth' => $auth,
            'intended' => URL::previous()
        ]);
    } else {
        return redirect()->intended(URL::route('dashboard'));
    }
    return redirect(URL::route('login_page'));
}

英文

  • blade 叶片
  • artisan 工匠
  • Eloquent 雄辩的,有口才的; 有说明力的; 富于表情的,逼真的; 动人的

Composer 国内镜像

http://pkg.phpcomposer.com/

composer 是 PHP 的一个包管理工具,类似于 python 的 pip, nodejs 的

Laravel 开源项目列表

Laravel 完整开源项目大全

参考资料

安装出错 RuntimeException: The Zip PHP extension is not installed. Please install it and try again.

Ubuntu 16.04 + PHP 7.0.4

sudo apt-get install php7.0-zip

laravel/framework v5.2.18 requires ext-mbstring * -> the requested PHP extension mbstring is missing from your system.

Ubuntu 16.04 + PHP 7.0.4

To enable extensions, verify that they are enabled in those .ini files: - /etc/php/7.0/cli/php.ini

sudo apt-get install php7.0-mbstring

不需要更改 php.ini 文件。

phpunit/phpunit 4.0.2 requires ext-dom * -> the requested PHP extension dom is missing from your system.

Ubuntu 16.04 + PHP 7.0.4

sudo apt-get install php-xml

PDOException: could not find driver

Ubuntu 16.04 + PHP 7.0.4

sudo apt-get -y install php-mysql

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式

谈笑风生

noodles

写 OAuth 的蠢货是谁