无需工匠命令的Laravel小型独立一次性脚本?

时间:2019-09-09 15:18:00

标签: php laravel laravel-5

我需要在Laravel中检查一些小东西,所以我只想编写一个小脚本来检查它。

我知道我可以做到

php artisan make:console ...

但是它将添加一个文件到App / Console / Command,并且我将需要更新app / Console / Kernel.php。这意味着我将把它提交到源代码管理中,这实际上是不需要的。

是否可以使用独立的 laravel脚本来访问Laravel组件?

我正在使用Laravel 5.2,(make:command不存在,只有make:console)

只是我尝试过的一个例子:

<?php

use App\User;
use DB;

require __DIR__.'/../vendor/autoload.php';
require __DIR__.'/..//bootstrap/app.php';

echo "hello world\n";
$res=User::where('id',5)->first();
echo "end!\n";
?>

但是我遇到一个错误:

PHP Fatal error:  Uncaught Error: Call to a member function connection() on null in /var/www/html/dpriceit/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php:3314
Stack trace:
#0 /var/www/html/dpriceit/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(3280): Illuminate\Database\Eloquent\Model::resolveConnection(NULL)
#1 /var/www/html/dpriceit/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(1880): Illuminate\Database\Eloquent\Model->getConnection()
#2 /var/www/html/dpriceit/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(1853): Illuminate\Database\Eloquent\Model->newBaseQueryBuilder()
#3 /var/www/html/dpriceit/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(1823): Illuminate\Database\Eloquent\Model->newQueryWithoutScopes()
#4 /var/www/html/dpriceit/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(3524): Illuminate\Database\Eloquent\Model->newQuery()

更新

我尝试创建控制台命令

php artisan make:console MyTempTest

但是当我执行php artisan list时,在可用命令列表中没有看到其签名。

2 个答案:

答案 0 :(得分:1)

要解决您遇到的错误,请启动应用程序的内核并像这样处理响应

app\script.php

<?php

use App\User;

require __DIR__.'/../vendor/autoload.php';
$app = require_once __DIR__.'/../bootstrap/app.php';
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
$response = $kernel->handle(
    $request = Illuminate\Http\Request::capture()
);

echo "hello world\n";
$res = User::find(5)->name;
var_dump($res);
echo "end!\n";

然后从终端运行php app/script.php
结果:

~/Sites/laravel (master ✗) ✹ ★ ᐅ  php app/script.php 
hello world
string(11) "Khalid Bins"
end!

答案 1 :(得分:0)

当我想在Laravel中尝试/测试某些东西时,我通常会做以下三件事之一:

如果我想尝试的“东西”是一种简单的单线纸,我可以使用Tinker:artisan tinker。这为您提供了完全启动的Laravel框架,可以使用您想要的任何类或函数。通常,这是我要做的事情:测试刚刚创建的全局帮助器函数;使用工厂创建模型,以检查我的工厂设置是否正确;检查我在模型上的$ casts数组是否设置正确;


另一种情况可能涉及更多代码,可能需要几行代码才能从数据库中检索某些数据,对其进行变异并显示在页面上。为此,您只需在文件routes/web.php中创建基于闭合的路由:

Route::get('test-url', function () {
    $user = User::where('email', 'user@example.com')->first();

    $user->makeAdmin()->save();


    // I can see on the page if the attributes have been changed, as a result of the makeAdmin() call.
    return $user->getAttributes();
});

对于控制台路由也可能如此。在您的routes/console.php文件中添加这样的结构:

Artisan::command('test:functionality', function () {
    $instance = new BusinessLogic();

    $result = $instance->someVeryInterestingMethod();

    dump($result);
});

然后可以使用php artisan test:functionality从命令行调用此函数。当然,您可以随意调用该命令。


然后是最后一个场景;当我想尝试新的东西(例如新的程序包,库,插件)时,将需要几行代码。我用php artisan make:test ThrowawayTest(或另一个随机选择的名称)创建一个新的测试类。然后,我可以添加几行代码,并使用PHPUnit运行它。我已将编辑器设置为使用组合键CTRL-T启动光标处于打开状态的测试,以便在某些代码更改时可以快速重新运行它。

这意味着我可以让一些代码保留在其函数中,并编写一个新函数来详细说明我刚刚从新软件包中学到的知识。完成后,我可以保留代码并将其提交到存储库,以便以后可以在需要再次将其中一些代码用于生产代码时检查代码。如果看起来以后我不需要该代码了,我也可以丢弃测试文件。

最后一个解决方案还为我提供了额外的好处,那就是可以使用PHPUnit中的assert语句。


希望这可以使您对Laravel框架在尝试或测试新事物时的各种可能性有所了解。