标签归档:Laravel

一步一步学Laravel,使用rlwrap让PHP Shell支持方向键历史记录

在默认情况下,我们的PHP Shell中使用方向键会被输入乱码比如^[[C^[[B^[[A^H^[:^C ,而且上下也不能支持历史记录,如图

QQ截图20160314005721

首先,我们下载rlwrap

wget http://utopia.knoware.nl/~hlub/uck/rlwrap/rlwrap-0.42.tar.gz

然后解压,配置和编译

tar zxvf rlwrap-0.42.tar.gz
cd rlwrap-0.42
./configure
make && make install

现在我们就可以使用如下命令来用rlwrap运行PHP Shell了

rlwrap php artisan tinker

如果觉得每次都要开头都要加rlwrap麻烦,可以执行下面的操作

vi ~/.bash_profile

我们在.bash_profile文件的末尾加上,注意下面的语句不要加空格什么的,请保持原样

alias php='rlwrap php'

然后执行

source ~/.bash_profile

现在只需要直接运行php artisan 也可以支持了

一步一步学Laravel,安装并使用laravel-menu

原项目地址:https://github.com/lavary/laravel-menu

1. 首先在 composer.json的require项目中添加

"lavary/laravel-menu": "dev-master"

2. 然后在Shell中执行

composer update

3. 找到config/app.php,在providers中添加

Lavary\Menu\ServiceProvider::class,

在aliases添加

'Menu' => Lavary\Menu\Facade::class,

5. 如果你还没有安装laravel-ide-helper,请按照https://onlyke.com/html/450.html,安装laravel-ide-helper
已经安装laravel-ide-helper的,在Shell中执行如下命令

php artisan ide-helper:generate

6. 这样就可以使用了,我们可以创建一个中间件,在Shell中执行下面命令

php artisan make:middleware Sidebar

下面是Siderbar.php的简单例子,注意use Menu;

<?php

namespace App\Http\Middleware;

use Closure;
use Menu;

class Sidebar
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        Menu::make('Sidebar',function($menu){
            $menu->add('Home');
        });
        return $next($request);
    }
}

当然了,官方github有更详细的例子和说明

一步一步学Laravel,5.2版本遇到Session store not set on request

最近重新开始看Laravel,发现登录和注册页面只要模板里使用old函数页面就会出错:Session store not set on request

遇到这个问题是因为所有需要session,csrf等控制器必须要放在web中间件下面,所以我们可以创建一个路由分组

Route::group(['middleware' => 'web'], function (){
    Route::get('/', function () {
        return view('welcome');
    });

    Route::auth();
});

解决方案来自:https://laracasts.com/discuss/channels/laravel/l5-session-store-not-set-on-request

一步一步学Laravel,使用默认的Auth控制器在登录时增加字段验证(验证用户登录字段是否为邮箱地址)

在laracasts的14期视频中,作者讲述了在Laravel中如何使用默认的Auth控制器来快速构造用户验证的功能。

其中我发现,这个Auth控制器默认情况,并不会在登录时检测用户输入的用户名是否为邮箱(默认登录字段为邮箱)

这导致用户输入其他字段的时候也会进入到数据库进行查询。

下面是一个在不修改原有vendor下AuthenticatesUsers的方式(低耦合)来实现检查登录字段是否为邮件功能

在AuthController.php,找到下面的代码

use AuthenticatesAndRegistersUsers, ThrottlesLogins

修改为:

use AuthenticatesAndRegistersUsers, ThrottlesLogins {
    AuthenticatesAndRegistersUsers::postLogin as parentPostLogin;
}

QQ图片20151202020735

上面做的目的是把AuthenticatesAndRegistersUsers(其实这个类继承了AuthenticatesUsers)postLogin修改为parentPostLogin,方便我们对postLogin进行重写。

然后我们在AuthController.php中重写postLogin方法,进行我们的Email验证,并且在把流程归还给原先的parentPostLogin

public function postLogin(Request $request)
    {
        $this->validate($request, [
            $this->loginUsername() => 'email'
        ]);
        return $this->parentPostLogin($request);
    }

然后运行成功

QQ截图20151202020933

 

其实这里面主要是要看懂和学会php的trait新特性,也就是多继承

一步一步学Laravel,PHP 5.4.0 起的traits多继承特性

自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits。

Traits 是一种为类似 PHP 的单继承语言而准备的代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用方法集。Traits 和类组合的语义是定义了一种方式来减少复杂性,避免传统多继承和混入类(Mixin)相关的典型问题。

Trait 和一个类相似,但仅仅旨在用细粒度和一致的方式来组合功能。Trait 不能通过它自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用类的成员不需要继承。

Trait 示例


优先级

从基类继承的成员被 trait 插入的成员所覆盖。优先顺序是来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法。
优先顺序示例

sayHello();
?>

以上例程会输出:Hello World!
从基类继承的成员被插入的 SayWorld Trait 中的 sayHello 方法所覆盖。其行为 MyHelloWorld 类中定义的方法一致。优先顺序是当前类中的方法会覆盖 trait 方法,而 trait 方法又覆盖了基类中的方法。
另一个优先级顺序的例子

sayHello();
?>

以上例程会输出:Hello Universe!

多个 trait

通过逗号分隔,在 use 声明列出多个 trait,可以都插入到一个类中。
多个 trait 的用法的例子

sayHello();
$o->sayWorld();
$o->sayExclamationMark();
?>

以上例程会输出:Hello World!

冲突的解决

如果两个 trait 都插入了一个同名的方法,如果没有明确解决冲突将会产生一个致命错误。
为了解决多个 trait 在同一个类中的命名冲突,需要使用 insteadof 操作符来明确指定使用冲突方法中的哪一个。
以上方式仅允许排除掉其它方法,as 操作符可以将其中一个冲突的方法以另一个名称来引入。
冲突解决的例子


在本例中 Talker 使用了 trait A 和 B。由于 A 和 B 有冲突的方法,其定义了使用 trait B 中的 smallTalk 以及 trait A 中的 bigTalk。
Aliased_Talker 使用了 as 操作符来定义了 talk 来作为 B 的 bigTalk 的别名。

修改方法的访问控制


本文引用自:http://www.jb51.net/article/61260.htm

一步一步学Laravel,在Request验证中判断用户操作是否为update

Laravel的验证相关资料:http://laravelacademy.org/post/240.html

在laracasts的13期视频的13分22秒,作者给出了在rules方法中可以根据条件给予不同的规则,却没有说该如何判断。

QQ截图20151130014700

通过官方的讨论区找到了两种方法(地址:https://laracasts.com/series/laravel-5-fundamentals/episodes/13

第一种,使用

$this->isMethod('patch')

来判断是否为更新操作。

第二种,使用

$this->input('_method')

获取表单的_method值,这个值在更新时候将为PATCH。

 

一步一步学Laravel,在phpstorm中快速更新命名空间或者代码提示

参考文章:http://blog.jetbrains.com/webide/2011/05/phpdoc-inspections/

第一次用phpstorm,在laracasts的教学视频中发现,在phpdoc(注释)和输入新的完整的命名空间之后,作者用了一个快捷键更新了phpdoc,还可以把完整命名空间移到头部的use中。

视频参考的坏处就是没有办法看到作者按的快捷键。

那么这个快捷键就是alt+enter

QQ截图20151130014200

QQ截图20151130014240

一步一步学Laravel,在PhpStorm使用Laravel5的代码提示

在PhpStorm中使用Laravel的代码提示,可以查看下面的github

https://github.com/barryvdh/laravel-ide-helper

这里说一下安装方法

在app目录执行下面的命令

composer require barryvdh/laravel-ide-helper

然后编辑config/app.php,找到providers加入下面的代码

Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class,

QQ截图20151119172810

最后执行

php artisan ide-helper:generate

QQ截图20151119172914

然后就可以尝试代码提示了,比如

QQ图片20151119173010