Laravel 开发知乎:用户注册
zyzplzyz

请问下怎么将原有的数据库移植到laravel项目中,就是用laravel做项目重构,但是数据库还是要原来的,楼主遇到过这样的情况吗?请指点下吗

JellyBool

我还没有遇到这样的场景。但是想了一下,貌似也没有什么太大的难度吧,基本改一下数据库的连接配置,对应的去创建 Model 就可以了,或者你可以直接使用 DB 就可以查询了

zyzplzyz

谢谢,我明白了

wenjie_zheng

可以用这个 ignasbernotas/laravel-model-generator 生成 现有表结构的 Model .

zyzplzyz

谢谢,学习了

chenxin

你这个是从学院君那边学来的吧,我之前就从那边看的,非常方便...

zddragon

Class 'App\Http\Controllers\Auth\SendCloudTemplate' not found 这个错误是什么原因?

JellyBool

视频中应该有说到,确定正确引用 SendCloudTemplate 这个类:

use xx\ SendCloudTemplate;
zddragon

发过帖子后,我意识到没有引用这个命名空间,低级错误

JellyBool

哈哈哈,见多就知道。。。

wl876645

大神更新好快!辛苦了

John Howard

SendCloudException in SendCloudTransport.php line 188:
Bad username / password!

求解。每一步都是按照教程来的

JellyBool

确保你的 sendcloud 的 API_USER 和 API_KEY 配置正确。视频貌似就有提醒

John Howard

谢谢,原来是我的API_USER没有填写正确

a119347

那个add method的快捷键是怎么设置的

JellyBool

comand shift a 搜 add,就可以了,你也可以设置一个快捷键的

yurenzhen

[InvalidArgumentException]
Could not find package naux/sendcloud at any version matching your PHP version 5.5.30.0
请问下这个是php版本的问题吗?我换了好几个版本都报这个错误

JellyBool

是的,最低要求是 5.6 吧

yijiang

现在laravel5.3 要求PHP5.6.4以上,5.6.1还是要去升级。

yijiang

我报Field 'settings' doesn't have a default value,没有settings的值

JellyBool

你没有给这个字段 nullable 吧

gaofei

我也报这个错误提示,你怎么解决的

hybridword

下面找到一样的了,我那里是填写为nullable的

a236220500

请问一下,我使用视频上的注册点击注册没反应,\vendor\laravel\framework\src\Illuminate\Foundation\Auth\RegistersUsers.php这个文件夹下的register方法的$this->validator($request->all())->validate();这个执行了,但是下面的事件好像没执行,我把这段验证代码删除了就可以往下执行,validator验证也是通过的是怎么回事啊

a236220500

刚才问的问题解决了...

mornone

大家都是付费用户吗?

噼里啪啦小蛋哥

php5.5 没有匹配的sendcloud包

JellyBool

这个版本的 php 已经不满足 laravel 5.2 的最低要求了,然而这个 package 是支持 5.2 的

Levante

@Jellybool 我使用php artisan --version,得到的是Laravel Framework version 5.2.45

正確的升級5.3方法可以在哪邊知道?

@JellyBool 或者我乾脆重裝,composer create-project laravel/laravel zhihu 5.3.*

Levante

@Jellybool 我使用php artisan --version,得到的是Laravel Framework version 5.2.45

正確的升級5.3方法可以在哪邊知道?

JellyBool

如果是新的项目,可以重新创建一个,一定要升级的话,参照这个

https://laravel.com/docs/5.3/upgrade#upgrade-5.3.0

Levante

@JellyBool SendCloud這服務好像只限定中國地區可以使用,我得改用mailgun,但寫法會很差多嗎?

目前我已經設定好,確認可以寄送郵件。但是用戶那邊的認證信Controller不知道怎麼寫。

JellyBool

不会差很多,使用 mailgun 的话, laravel 自带就有支持。而且在使用 mailgun 的时候,你只要将视频中提到的 模板 换成你对应的 email 视图,并且注意一下传入的 data 就好;很多地方你直接就可以用,mailgun 方便多了

Levante

@JellyBool 試了好多次,沒有正確傳到View
2017-01-16 16 29 53

@JellyBool 我的View :

2017-01-16 16 40 54

JellyBool

哎呀,你用 mailgun 的话。不用使用 sendcloud 的这个 package,laravel 默认就支持了的。你可以直接这样:

Mail::send('emails.welcome', $data, function ($message) {
    $message->from('us@example.com', 'Laravel');

    $message->to('foo@example.com');
});

或者你直接参照 5.3 一样发送邮件 https://laravel.com/docs/5.3/mail

Levante

@JellyBool

我都寫好了,但是這次卻報這個錯誤:

Undefined variable: data (View: /home/vagrant/Code/zhihu-app/resources/views/email/welcome.blade.php)

但我的emails/welcome.blade.php,照個官方文檔寫的嵌套{{ 變量名 }},應該是正確的,為什麼會報錯?

2017-01-16 16 40 54

JellyBool

试试这样传入吧:

Mail::send('emails.welcome', ['data' => $data], function ($message) {
    $message->from('us@example.com', 'Laravel');

    $message->to('foo@example.com');
});

或者你在 视图中这样取值试试 :$data['name'] ,如果是直接传的 $data ,也可以试试这样取值 $name $url ,无外乎这几种选择

Levante

@JellyBool 解決了,說實在 Mailgun 好用多,以下是我的code:

Mail::send('email.welcome', ['data' => $data], function ($message) use($user) {
            $message->from('postmaster@sandboxd1234567890.mailgun.org', 'Laravel');

            $message->to($user->email);
        });

emails/welcome.blade.php

<h1>{{ $data['name'] }},真棒!</h1>

<p>請點擊以下連結完成認證:</p>
<a href="{{ $data['url'] }}">{{ $data['url'] }}</a>
JellyBool

mailgun 确实好用很多,但是这边的大环境下,很多很好的服务用起来还是很鸡肋

Frank Wang

第一次尝试注册的时候,不知道为什么会报这个错误,

SQLSTATE[HY000]: General error: 1364 Field 'questions_count' doesn't have a default value 

代码都是跟着教程走,按说这里和 questions_count 字段也没关系呀

JellyBool

questions_count 你没有设置 默认值吧,而在你创建一个 question 的时候,又没有传值进去

Frank Wang

有啊,代码最开始设置create_user.php时候就有->default(0)啊

JellyBool

你把你的 questions 这个 migration 文件贴出来看看?报错信息就是你没对 questions_count 这个字段设置默认值

coly

请问一下,你这网站月收入多少?

hard88

Swift_TransportException in AbstractSmtpTransport.php line 383:
Expected response code 250 but got code "530", with message "530 5.7.1 Authentication required
"
你好,这个是因为什么?

JellyBool

你是使用 smtp 发送邮件么?

检查密码和邮箱是否填写正确。

hard88

是sendcloud,把github重新粘了一遍,又好了,两次唯一区别,出错的时候发送邮箱是qq邮箱,但是英文的邮箱,不是数字,这个算么。谢谢

JellyBool

嗯哼,问题解决了就好

koizora

jelly 注册提交成功以后,在返回 myHost/Home 的时候报了一个错 PDO::prepare(): Unknown type 245 sent by the server. Please send a report to the developers 。 大致应该是这个users表创建的时候包含了一个JSON列,我删掉了这个列就没事了。想问一下,是跟我的环境有问题吗?怎么解决?

JellyBool

可能是你的 mysql 版本还没支持 json 这种类似。mysql 5.7 以上可以,你可以直接设置个 string 也是可以的

koizora

我的就是5.7的,我特意升级的。这条sql 我放到命令行里 没问题的。估计是PHP的原因,有人说 PHP.5.6 就没事了。但是我的环境也符合。

JellyBool

嗯哼。。。你的的 php 版本具体有满足 laravel 的最低要求没?mac 的话,建议升一下 php 7

koizora

这个我回头升级一下。主要是我有很多项目。包括扩展。我担心会有其他问题。

JellyBool

扩展这方面,在 php 7 支持已经很完善了,laravist 线上已经 7.1 了

koizora

还有就是 你这个 settings 字段的用途是什么,听视频没太理解。所以我才对这个问题感到头疼的。好像说用了laravel里的什么方便的功能?

JellyBool

会用在 用户设置 那,使用 model 的 casts 属性的。所以 string 应该也是 ok 的

koizora

好 ,感谢。等看到哪里的时候在说。我先升级PHP7

hybridword

你这个网站是有这个扩展包来添加邮箱还是自己定义一个方法?

JellyBool

什么意思?有这个扩展包来添加邮箱

hybridword

是用这个扩展包来处理邮件的功能?
还有,发现你这个没有管理员后台的,哈哈

JellyBool

嗯哼,是的。使用的这个 package 来处理邮件的功能。

这个系列没打算有后台。。。

hybridword

已解决,是群主代码写错了

hybridword

Type error: Argument 1 passed to Illuminate\Auth\SessionGuard::login() must implement interface Illuminate\Contracts\Auth\Authenticatable, none given, called in /var/www/laravel/vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php on line 294
这个是啥问题呢?

JellyBool

感觉你这是 laravel版本不一样吧。你看看 5.3 的自带User.php怎么继承的

hybridword

我这个是5.4的

hybridword

继承是一样的
都是use Illuminate\Foundation\Auth\User as Authenticatable;

hybridword

我是在激活邮箱那里发生这个错误的

JellyBool

具体的代码可以贴出来看看么?User.php 和 发送邮件 和 激活的代码

hybridword

这是注册的

    {
        $user = User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'avatar' => '/images/avatar/default.png',
            'confirmation_token' => str_random(40),
            'password' => bcrypt($data['password']),
        ]);
        $this->sendVerifyEmailTo($user);
        return $user;
    }
     private function sendVerifyEmailTo($user)
     {
         $data = ['url' => route('email.verify',['token'=> $user ->confirmation_token]),
                   'name' => $user->name
         ];
         $template = new SendCloudTemplate('register', $data);

         Mail::raw($template, function ($message) use ($user) {
             $message->from('account@hybridword.com', 'hybridword ');

             $message->to($user->email);
         });
     }```

这是激活的,顺便提一下,他是激活成功的了
{
 $user = User::where('confirmation_token',$token)->first();

    if (is_null($user)){
        return redirect('/');
    }

    $user->is_active = 1 ;
    $user->confirmation_token =str_random(40);
    $user->save();
    Auth::login();
    return redirect('/home');
}```
JellyBool

这里:

$user = User::where('confirmation_token',$token)->first();

    if (is_null($user)){
        return redirect('/');
    }

    $user->is_active = 1 ;
    $user->confirmation_token =str_random(40);
    $user->save();
    Auth::login(); // 应该试试 Auth::login($user); 吧
    return redirect('/home');
hybridword

哈哈,你和我想法一样的,我试了!不行!

JellyBool

额,怎么会不行。。。

你把你的 User.php 贴出来看看,不然你这不科学啊。

hybridword

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password','avatar','confirmatio
        n_token'
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];
}
JellyBool

好吧,看不出什么错误》

你是怎么安装的 5.4 的版本的。有没有使用 composer 中国镜像?

login 这里这样吧:

Auth::loginUsingId($user->id);

这样试试呢

hybridword

直接composer安装,翻墙~~https://www.laravist.com/lesson/256

JellyBool

这就尴尬了啊。你使用 loginUsingId 有用否?

hybridword

一样呢!算了,不管了

JellyBool

我觉得最终你还是要写成这个样子:

Auth::login($user); // 这个都错,没道理啊。报错信息就是这一行的问题啊

清楚缓存试试。

php artisan cache:clear
hybridword

好,我今晚回去试试,你有这个文档看看不

JellyBool

什么文档?是关于登录 Auth::login()?还是什么

hybridword
public function __construct(UserRepository $users)
    {
        $this->users = $users;
}
群主可以解释一下这个构造方法么,还有中间那个users是怎么回事
JellyBool

依赖注入。这样理解可行?

hybridword

这个太简单了吧,$this->users = $users;你可以解释这个给我么?

JellyBool

就是将传递进来的 UserRepository 实例 $user 赋予类中的 users 属性。。。。这不是最基础的 OOP 知识么

北漂张小白

这个视频的laravel版本是5.几的呢?
我安装了一个5.4的注册第一步就报错;

 protected $fillable = [
        'name', 'email', 'password', 'avatar', 'confirmation_token'
    ];

QueryException in Connection.php line 647:
SQLSTATE[HY000]: General error: 1364 Field 'settings' doesn't have a default value (SQL: insert into `users` (`name`, `email`, `avatar`, `confirmation_token`, `password`, `updated_at`, `created_at`) values (HK, 6786867@qq.com, /images/avatars/default.png, 9vJUn2vaw2UIROmo4RbLo6JOETvdk7yCdXNPs733, $2y$10$lr8u4GAKZkv6KePXTMekHOkI2C.n300OBv.o/1W7gQSgFXXMhZ8py, 2017-03-16 22:48:18, 2017-03-16 22:48:18))

不好意思,怪我,单词写错了!!

JellyBool

laravel 5.3 ,推荐你也使用 5.3。不过你对 laravel mix 熟悉的话就没事。

你的 settings 字段没有默认值,并且也不是 nullable,所以就报错了吧。users 表的定义:

$table->json('settings')->nullable();
北漂张小白

是的是的,多谢老师,是我写错字了!!

JellyBool

恩,挺好的。现在这种提问比一开始好很多了。

提供了相关代码和报错信息。并且使用了markdown !

ye0205414225

照影片方法,註冊後報錯 
TokenMismatchException in VerifyCsrfToken.php line 68:

JellyBool

注册页面的代码可以贴出来看看?

ye0205414225

` protected function validator(array $data)

{
    return Validator::make($data, [
        'name' => 'required|max:255',
        'email' => 'required|email|max:255|unique:users',
        'password' => 'required|min:6|confirmed',
    ]);
}

//創立用戶資料
protected function create(array $data)
{
    //變量
    $user = User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'avatar' => '/images/avatars/default.png', //頭像目錄
        'confirmation_token'=> str_random(40),      //使用laravel提供的function 函數 默認40字串
        'password' => bcrypt($data['password']),
    ]);
     $this->sendVerifyEmailTo($user);
     return $user;

}
//發送用戶信件
private function sendVerifyEmailTo($user)
{
    $data = [
        'url'  => route('email.verify',['token'=>$user->confirmation_token]),
        'name' => $user->name
    ];
    $template = new SendCloudTemplate('zhihu', $data);  //選擇模板

    Mail::raw($template, function ($message) use ($user) {
        $message->from('ye0205414225@gmail.com', 'yellow');  //發送信件者

        $message->to($user->email);                          //接收信件者
    });
}`
JellyBool

你的 register.blade.php 有没有下面这行:

{{ csrf_field() }}

或者你清除缓存试试:

php artisan cache:clear
ye0205414225

blade 有這個,一開始已經建議好了
有個新的問題

JellyBool

你的 settings 字段并没有默认值,也没有运行 nullable 就出现这个错误:

// CreateUsersTable
$table->json('settings')->nullable();
ye0205414225

創建數據後 表單中沒有默認值~才會出現此問題 目前都已解決 謝謝老師!

824286145

怎么解决的,我也出现这个错误了

Psychic_role

老师你上课的语气是越来越骚了

JellyBool

excuse me ?

BallOon

$table->json('settings')->nullable(); 这个代码我加了 为啥还是爆了settings没有默认职的错。啊

sfabric2016

我能弱弱的问一句,sendcloud中的模板中 ‘%name%,请激活您的邮箱%url%’ url插入超链接是什么啊,不知道怎样写才可以解析,我的都是原样输出了

JellyBool

视频中是有讲的吧,你只要传入 name 和 url 的变量就好了啊,视频中一样

sfabric2016

怎样可以截图呢,
就是sendcloud模板中: %url% 需要加一个超链接信息,我在URL中加的是 zhihu/email/verify/%token% ,所以不行,您能给我说一下我怎么加才能在EmailController里面的verify方法中获取到token值呢

sfabric2016

嗯呢,解决了,谢谢老师(我之前url用的超链接那种方式,听完你的视频直接改成源码方式就好了,这么小点的问题纠结了小半天,嘿嘿)