Laravel使用遇到问题记录一

966 阅读1分钟

1、修改login成功后的跳转路径

修改App\Http\Controllers\Auth\LoginController中的属性值$redirectTo

    //Laravel 5.6
    protected $redirectTo = 'new url';

变更register的话修改App\Http\Controllers\Auth\RegisterController中的属性值$redirectTo

2、修改身份验证成功后,页面输入/login /register后跳转的路径

修改App\Http\Middleware\RedirectIfAuthenticated中的handle方法。

    //修改 `redirect` 中的 url
    public function handle($request, Closure $next, $guard = null)
    {
        if (Auth::guard($guard)->check()) {
            return redirect('new url');
        }

        return $next($request);
    }

3、设置执行时间上限为300秒,默认是30秒

也可以直接修改php.ini中的配置项max_execution_time = 300 #default 30

    ini_set('max_execution_time', 300);

4、手动更新 autoloader

打印自动加载索引 dump-autoload

    composer dump-autoload

5、Laravel5.3+Controllers:Session In The Constructor

  • 5.3及之后的Laravel版本的Controllersconstruct不能再获取的到session值以及当前登录(认证通过)的用户信息

protected $projects;
public function __construct()
{
    //will always get `null`
    $this->projects = Auth::user()->projects;
}

6、三元运算符?:??

  • ??: 如果变量存在且值不为NULL, 它就会返回自身的值,否则返回它的第二个操作数。

  • ?:: 自 PHP 5.3 起,可以省略三元运算符中间那部分。表达式 expr1 ?: expr3expr1 求值为 TRUE 时返回 expr1,否则返回 expr3

$item1 = 0;
$item2 = null;

echo  $item1 ?: 'Y';// Y
echo  $item1 ?? 'Y';// 0
echo  $item2 ?: 'Y';// Y
echo  $item2 ?? 'Y';// Y

7、Eloquent: get() or first()

updated_at:20180803:first()返回Eloquent\Modal类实例,get()返回的是Illuminate\Database\Eloquent\Collection集合 如果查询结果需要empty()判断,则使用first(),使用get()即使查询不出结果也会返回一个空的collection

//if we can't find $name in Member
$member = Member::whereName($name)->first();
//OK
if (empty($member)) {
    return $this->jsonResult(40506);
}
//always false
$member = Member::whereName($name)->get();
dd(empty($member));//false

8、创建外键失败

遇到问题记录:使用Laravelphp artisan make:migration中代码如下

    public function up()
    {
        Schema::create('wk_collections', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('member_id')->comment('用户ID');
            $table->integer('project_id')->comment('项目ID');
            $table->bigInteger('document_id')->comment('文档ID');
            $table->timestamps();

            //unique index
            $table->unique(['member_id', 'project_id', 'document_id']);

            //外键约束
            $table->foreign('member_id')
                ->references('id')->on('users')
                ->onDelete('cascade');
            $table->foreign('project_id')
                ->references('project_id')->on('wk_project')
                ->onDelete('cascade');
            $table->foreign('document_id')
                ->references('doc_id')->on('wk_document')
                ->onDelete('cascade');

        });
    }

上面的代码运行php artisan migrate 会报错误,具体错误在MySQL中运行SHOW ENGINE INNODB STATUS;然后将错误拷贝出来,查看LATEST FOREIGN KEY ERROR这一段


2018-05-01 09:51:03 0x2eec Error in foreign key constraint of table populac/#sql-148c_9:
 FOREIGN KEY (`member_id`) REFERENCES `populac`.`users` (`id`):
Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.
Note that the internal storage type of ENUM and SET changed in
tables created with >= InnoDB-4.1.12, and such columns in old tables
cannot be referenced by such columns in new tables.
Please refer to http://dev.mysql.com/doc/refman/8.0/en/innodb-foreign-key-constraints.html for correct foreign key definition.

谷歌一下,发现错误应该是migration:$table->integer('member_id')->comment('用户ID');默认建立的字段member_id int(11),而users::id int(10),MySQL外键和关联表的字段长度需要严格一致

...
//原代码
$table->integer('member_id')->comment('用户ID');
//修改成
$table->addColumn('integer', 'member_id', ['unsigned' => true, 'length' => 10])->comment('用户ID');
//或者
$table->integer('member_id')->unsigned()->comment('用户ID');
...

9、使用 Editor.md 上传图片/文件如何处理

  • Editor.md
  • 修改editor.md/plugins/image-dialog/image-dialog.jseditor.md/plugins/file-dialog/file-dialog.js
        if (settings.crossDomainUpload)
        {
          action += "&callback=" + settings.uploadCallbackURL + "&dialog_id=editormd-file-dialog-" + guid;
        }
        //add csrf-token here
        var csrfToken = $('meta[name="csrf-token"]').attr('content');
        var csrfField = "";
        if (csrfToken) {
          csrfField = "<input type='hidden' name='_token' value='" + csrfToken + "' />";
        }
        //add csrf below 
        var dialogContent = ( (settings.fileUpload) ? "<form action=\"" + action +"\" target=\"" + iframeName + "\" method=\"post\" enctype=\"multipart/form-data\" class=\"" + classPrefix + "form\">" : "<div class=\"" + classPrefix + "form\">" ) +
          ( (settings.fileUpload) ? "<iframe name=\"" + iframeName + "\" id=\"" + iframeName + "\" guid=\"" + guid + "\"></iframe>" : "" ) +
          "<label>" + fileLang.url + "</label>" +
          "<input type=\"text\" data-url />" + (function(){
            return (settings.fileUpload) ? "<div class=\"" + classPrefix + "file-input\">" + csrfField +
              "<input type=\"file\" name=\"" + classPrefix + "file-file\" />" +
              "<input type=\"submit\" value=\"" + fileLang.uploadButton + "\" />" +
              "</div>" : "";
          })() +
          "<br/>" +
          "<label>" + fileLang.alt + "</label>" +
          "<input type=\"text\" value=\"" + selection + "\" data-alt />" +
          "<br/>" +
          "<input type='hidden' data-icon>"+
          ( (settings.fileUpload) ? "</form>" : "</div>");
  • 文件头的meta加上<meta name="csrf-token" content="{{ csrf_token() }}">