php Laravel不返回特定视图,并在构造类后停留在白色页上

rjee0c15  于 2022-12-02  发布在  PHP
关注(0)|答案(1)|浏览(91)

web.php

Route::get('/', function () {

    return view('index');
});

Route::get('/', [App\Http\Controllers\HomeController::class, 'index']);
Route::get('/', [App\Http\Controllers\MovieDataController::class, 'init']); // <-- after this page breaks down

NivueDataController.php

<?php

namespace App\Http\Controllers;
use App\Models\movieData;

class MovieDataController extends Controller
{
    public function init(){
        MovieDataController::console_log("init called");
        MovieDataController::getPopular();
        MovieDataController::index();
    }

    ///////////////////////////FOR DBG PURPOSES ONLY////////////////////////////////////////
        function console_log($output, $with_script_tags = true) {
            $js_code = 'console.log(' . json_encode($output, JSON_HEX_TAG) . 
        ');';
            if ($with_script_tags) {
                $js_code = '<script>' . $js_code . '</script>';
            }
            echo $js_code;
        }
    ///////////////////////////FOR DBG PURPOSES ONLY////////////////////////////////////////
    public function index()
    {
        MovieDataController::console_log("returning index view");
        return view('index');
    }
    protected function create(string $data)
    {
        return movieData::create([
            'movie_id' => $data, 
        ]);
    }

    function getPopular(){
        $curl = curl_init();

 curl_setopt_array($curl, [
            CURLOPT_URL => 
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_FOLLOWLOCATION => true,
            CURLOPT_ENCODING => "",
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 30,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => "GET",
            CURLOPT_HTTPHEADER => [
                "X-RapidAPI-Host:",
                "X-RapidAPI-Key: "
            ],
        ]);

        $response = json_decode(curl_exec($curl));
        $err = curl_error($curl);

        $response = str_replace('/title/', '', $response);
        $response = str_replace('/', '', $response);
        curl_close($curl);

        if ($err) {
            echo "cURL Error #:" . $err;
        } 
        else {
            $arrayt = [];
            foreach ($response as $key => $value) {
            array_push($arrayt, $response[$key]);
        }
        foreach ($arrayt as $key => $value) {
            MovieDataController::create($arrayt[$key]);
        }
        }
    }
}

我已经尝试解决这个问题了几个小时,现在我还没有能够找出为什么MovieDataController打破我的网站分开。
我已经尝试调试日志记录,看看是否有东西进入循环/或冻结它,但我还不能确定什么问题。
编辑:通过打破我的网站,我的意思是我的看法是没有了,它只是一个空白页。

hxzsmxv2

hxzsmxv21#

调试

首先,您只需要在/处声明一个路由-它们不可能都有相同的URI。
日志告诉你什么?(/storage/logs/laravel.*)发布日志?

路线可见性

Laravel路由必须是PUBLIC不受保护或私有的....您还在foreach中静态调用它,并且该函数未声明为静态。这可能不是您的问题,但Laravel控制器使用特定动词(例如create),因此您可能应该重命名create()函数以避免出现问题-通常,直接调用Model::create(),而不是使用helper-function。如果在创建时需要执行某个常见任务,请查看EloquentModelEvents,DTOs,或者甚至是一个分离的服务--通常最好的做法是不要在控制器上有其他的功能。(验证甚至被推迟到请求)。

路由声明:

您正在声明三个到GET /的不同路由。请尝试以下操作:

# PHP 8+

use App\Http\Controllers\HomeController;
use App\Http\Controllers\MovieDataController;

// Avoid inline functions and prefer controllers — limits caching/performance
Route::get('/', fn () => view('index'))->name('index');

Route::prefix('home')->name('home.)->group(function () {
  Route::get('index', HomeController::class . '@index')->name('index');
});

Route::prefix('movie-data')->name('movie-data.)->group(function () {
  Route::get('init', MovieDataController::class . '@init')->name('init');
});

/* Run `php artisan route:list` to see the routes */

控制器

使用CURL

使用Illuminate\Support\Facades\Http

你为什么要使用curl_init()?现在是2022年?使用Laravel的HTTP外观((docs)[https://laravel.com/docs/9.x/http-client])。它好得多,让测试变得容易得多。
真实的可能会抛出一个异常,而该异常要么是您遗漏的,要么是明显的,要么是由HTTP外观处理的。

JSON解析

可能是解析JSON失败并挂起。查看处理错误的方法并仔细检查PHP版本(如果可能的话请更新!)。您甚至可以查看使用DTO库来处理解析响应(Spatie Laravel-Data

尽快关闭CURL连接

如果您坚持使用curl,请尽快关闭连接(在str_replace()之前)

Lint文件

您的格式可能已关闭和/或可能缺少右括号-尽管如此,这可能会产生不同的错误(日志?)。请尝试运行php -l /path/to/controller.php

额外学分(PR复习学习备注)

函数命名

与snake_cases相比,Laravel更喜欢CamelCase函数。将此扩展到除原始Model->attribute_name之外的所有函数。
例如MovieDataController::console_log() -> MovieDataController::consoleLog() * 在后端看到console_log也很奇怪,因为它是一个JavaScript函数... Laravel/PHP使用dump/var_dump-尽可能遵循现有的标准。

相关问题