مشکل فراخوانی پراپرتی در تابع های بدون نام

پرسیده شده
فعالیت 1266 روز پیش
دیده شده 463 بار
0

سلام 

سوال من مربوط به این جلسه نیست اما جای بهتری هم پیدا نکردم!

من دارم یک روتینگ مینویسم و شبیه به لاراول از توابع بدون نام استفاده میکنم برای روت ها اما به ی مشکل بر خوردم : 

کد صفحه web (جایی که روت ها رو مینویسیم) : 

use system\Routing\Web\Route;
Route::prefix('admin')->group(function (){
    Route::get('/','HomeController@index');
    Route::any('/any','HomeController@any');
});

 اینجا زمانی که prefix رو میزارم و مقدار بهش میدم به این شکل بعد اون group رو صدا میزنم و داخل کالبک اون متود get رو صدا میکنم و یا هر متد دیگه prefix رو null بر میگردونه اما اگر به صورت زیر بدم مقدار prefix رو بهم میده  : 

Route::prefix('admin')->get('/','HomeController@index');

چرا این اتفاق میفته در ادامه بقیه کد ها رو هم میزارم : 

کد کلاس Route : 

<?php


namespace system\Routing\Web;




use system\Routing\Web\Traits\HasMethodCaller;
use system\Routing\Web\Traits\Tools;

class Route
{
   use Tools,HasMethodCaller;
    protected $prefix;
    


}

تریت HasMethodCaller : 

<?php
namespace system\Routing\Web\Traits;


trait HasMethodCaller
{
    public static function __callStatic($name, $arguments)
    {
        $class = get_called_class();
        $instance = new $class();
        return $instance->methodCaller($instance,$name,$arguments);
    }
    public function __call($name, $arguments)
    {
        return $this->methodCaller($this,$name,$arguments);
    }

    protected function methodCaller($object,$methodName,$args)
    {
        $name=$methodName."Method";
        return call_user_func_array([$object,$name],$args);
    }
}

تریت Tools :

<?php


namespace system\Routing\Web\Traits;


trait Tools
{
    /**
     * @param callable $callback
     * @return $this
     */
    protected function groupMethod(callable $callback)
    {
        $callback();
        return $this;
    }

    /**
     * @param string $prefix
     * @return $this
     */
    protected function prefixMethod(string $prefix)
    {
        $this->prefix = $prefix;
        return $this;
    }
    /**
     * @param string $route
     * @param string $actions
     */
    protected function getMethod(string $route, string $actions)
    {
        $r = $this->prefix."\\".$actions;
        d($r);
        return $this;
    }

    /**
     * @param string $route
     * @param string $actions
     * @return $this
     */
    protected function postMethod(string $route, string $actions)
    {
        d($route,$actions);
        return $this;
    }

    /**
     * @param string $route
     * @param string $actions
     * @return $this
     */
    protected function putMethod(string $route, string $actions)
    {
        d($route,$actions);
        return $this;
    }

    /**
     * @param string $route
     * @param string $actions
     * @return $this
     */
    protected function patchMethod(string $route, string $actions)
    {
        d($route,$actions);
        return $this;
    }

    /**
     * @param string $route
     * @param string $actions
     * @return $this
     */
    protected function deleteMethod(string $route, string $actions)
    {
        d($route,$actions);
        return $this;
    }

    /**
     * @param string $route
     * @param string $actions
     * @return $this
     */
    protected function anyMethod(string $route, string $actions)
    {
        d($this->prefix,$route,$actions);
        return $this;
    }

}

چطوری میتونم به این شکل مقدار پراپرتی prefix رو در همه جا داشته باشم ؟‌

فایل پیوست

میثم نصرتی
میثم نصرتی

23 آبان 99

0
حذف شده

سلام و احترام

یه چیزیو من متوجه نشدم. وقتی از prefix استفاده میکنی route های داخلی null برمیگردونن یا خود route group؟

فایل پیوست

امیر صالحی

توسط

امیر صالحی

23 آبان 99

0
حذف شده

امیر جان 

تا اون جا که با دامپ گرفتن متوجه شدم زمانی که ما کلاس Route رو فراخوانی میکنیم و متود prefix رو صدا میزنیم ازش مشکلی نداره و مقدار prefix رومیده یعنی به این شکل :‌

Route::prefix('admin')->get('/','HomeController@index');

اما مشکل از جایی شروع میشه که بصورت گروه قراره هر روت رو تعریف کنم و prefix رو یک بار قبل از متد group صدا بزنم و ست کنم توی روت هایی که تو کالبک متود group ایجاد شدن دیگه prefix در دسترس نیست به این شکل 

use system\Routing\Web\Route;
Route::prefix('admin')->group(function (){
    Route::get('/','HomeController@index');
    Route::any('/any','HomeController@any');
});

درواقع پراپرتی های کلاس route زمانی که توی کالبک متود group روتی رو میسازم دیگه مقداری که از قبل ست کرده باشم در دسترس نیست. 

فایل پیوست

میثم نصرتی

توسط

میثم نصرتی

23 آبان 99

0
حذف شده

میثم جان، توی trail tools تابع groupMethod وقتی Callable فراخوانی میشه در ادامش this$ برگشت (return) داده میشه با برنامه از اونجا رد میشه؟

میخوای بعد از callable توی متد groupMethod یه چیزی رو var_dump کن ببین اصلا خط بعدش اجرا میشه یا ن؟

فایل پیوست

امیر صالحی

توسط

امیر صالحی

24 آبان 99

حذف شده
امیر جان ممنون از این که وقت میزاری توی خود متود groupMethod دسترسی دارم مشکلی نیست مشکل دقیقا داخل کالبک که قرار کالبک زمانی که اجرا میشه متود های getMethod و anyMethod رو اجرا کنه داخل این دو متود زمانی که از کالبک فراخوانی شدن به مقدار ست شده prefix دسترسی ندارم
میثم نصرتی

24 آبان 99

0
حذف شده

میثم این متد d رو که استفاده میکنی اونو هم کداشو قرار بده.

 

تو تریت tools که شما prefix رو مقدار دهی میکنه از کلمه کلیدی parent استفاده کن که دقیقا اشاره که به پراپرتی پدر تا مشکلی پیش نیاره.

فایل پیوست

امیر صالحی

توسط

امیر صالحی

24 آبان 99

0
حذف شده

امیر جان ممنون 

مشکل رو فهمیدم مشکل ایجاد نمونه های مختلف بود هر بار کلاس روت فراخوانی میشد نمونه جدید اطلاعاتی که توی پراپرتی میریختم رو پاک میکرد توی نمونه جدید حالا اومدم با دیزاین پترن سینگلتون مشکلم رو حل کردم یکبار نمونه ساختم در صورتی که نمونه وجود داشت همون رو بر میگردونم دیگه دسترسی به مقدار prefix هم وجود داره 

 

فایل پیوست

میثم نصرتی

توسط

میثم نصرتی

24 آبان 99

حذف شده
آفرین دقیقا همینه. داشتم درباره singleton مطلب برات جمع میکردم که بهت بگم
امیر صالحی

24 آبان 99

حذف شده
مرسی امیر جان از کمکت خیلی درگیرم کرد این مبحث
میثم نصرتی

24 آبان 99

حذف شده
خواهش میکنم، عیبی نداره مهم اینکه یه چیزی رو یاد گرفتیم
امیر صالحی

24 آبان 99

جلسه آشنایی با متدهای جادویی در PHP